基于Java 数组内存分配的相关问题
更新时间:2013年05月21日 15:18:56 作者:
本篇文章是对Java中数组内存分配进行了详细的分析介绍,需要的朋友参考下
可能Java 数组大家都很熟悉,最近我遇到了一个关于Java 数组内存分配的问题。
呵呵。突然就发现许多书上“基本数据类型存储在栈内存当中,对象则保存在堆内存”这句话完全是错误的。下面是个简单的例子代码:
复制代码 代码如下:
public class Test {
public static void main(String[] argv) {
// 静态初始化数组
String[] names = { "Michael", "Orson", "Andrew" };
// 动态初始化数组
String[] animal = new String[4];
// 让animal 指向 namens 数组所引用的数组
names = animal;
System.out.println(names.length);
System.out.println(animal.length);
}
}
“Java 数组大小是不能改变的”这可能大家都听过,那上面这段代码就有问题了,animal [] 长度为4,而names [] 数组的长度只有3,但是经过一个赋值语句,两个数组的大小就都变为4了。这不是改变了数组的大小吗? 问题就这样挡在面前了!好吧,问问技术前辈吧,就这样对数组的存储方式有了全新的认识。下面是我的一点理解:(如果有错误的,刚好被大神你看到了,也请你能够指出来。)
上面的的 names 和 animal 不代表这个数组对象,而仅仅是数组的变量而已,和C里面的指针是一样的,这样的变量叫做引用变量。数组对象是保存在堆内存当中,大小当然是不能改变的,但是数组变量却能够指向其他的数组对象,可以看看下面这个图:

复制代码 代码如下:
public class Animal {
private String name;
private int age;Animal(String name, int age) {
this.name = name;
this.age = age;
}public void info() {
System.out.println(name + " " + age);
}
}
public class Test { public static void main(String[] argv) {
// 动态初始化数组
Animal[] animal = new Animal[2];
Animal cat = new Animal("cat", 1);
Animal dog = new Animal("dog", 2);
animal[0] = dog;
animal[1] = cat;// 当数组变量引用对象的方法(或者属性)的时候,它就变为实际的Java 对象
System.out.println(animal.length);
//dog 这个原本存储在栈内存当中的对象引用通过调用对象的方法变为实际的对象
dog.info();
animal[0].info();
}
}
只有当栈内存中的引用变量调用了对象的方法或者是指向了对象的属性的时候,它就从变量真正成了对象了。(比如上面例子中的 cat,dog 对象引用变量,animal[]数组变量)。 通过animal[0] = dog;
animal[1] = cat; 使得两个变量都指向了存储在堆内存当中的对象,所以他们俩个打印出来的信息是一模一样的.

上图中蓝线是赋值语句: animal[0] = dog;
animal[1] = cat; 之前的变量指向的状态,红虚线是赋值语句之后的状态,animal[0]和dog ,animal[1] 和cat 所指向的都是相同的堆内存空间。
相关文章
java实现6种字符串数组的排序(String array sort)
这篇文章主要介绍了java实现6种字符串数组的排序(String array sort),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-01-01
Springboot整合Socket实现单点发送,广播群发,1对1,1对多实战
本文主要介绍了Springboot整合Socket实现单点发送,广播群发,1对1,1对多实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2022-08-08
基于Eclipse 的JSP/Servlet的开发环境的搭建(图文)
本文将会详细地展示如何搭建JSP的开发环境。本次教程使用的是最新版的Eclipse 2018-09编辑器和最新版的Apache Tomcat v9.0,步骤详细,内容详尽,适合零基础学者作为学习参考2018-12-12


最新评论