Java内存区中的分块
在Java内存区中有两个存储的区域,栈和堆。栈一般存储数据以及数组的首地址,而堆则用于存放数组的数据。
存储地不同的原因
数组属于引用数据类型,在栈中储存数组的首地址,而形如int,float,double等类型的数据为基本数据类型,在栈中储存器二进制的补码。可通过代码输出接过来观察奇特点:
public class Array{
public static void main(String[] args) {
int [] scores = {100};
int age = 100;
System.out.println(scores);
System.out.println(scores[0]);
System.out.println(age);
}
其结果依次为:[I@52e922 100 100,其中52e922为数组scores的首地址,scores[0] = 100的二进制补码存放在堆中,age= 100 的二进制补码储存在栈中。画图理解为:
部分代码类型解析
package zzu957;
public class Array{
public static void main(String[] args) {
int [] scores = {100};
System.out.println(scores);
System.out.println(scores[0]);//100
test(scores);
System.out.println(scores[0]);//0
}
public static void test(int [] array) {
System.out.println(array);
array[0] = 0;
}
/*结果
[I@52e922
100
[I@52e922
0
*/
}
第一个为输出scores数组存放在栈中的首地址,第二个输出的则是储存在堆中的int型数据,第三个输出为调用函数/方法时,将scores数组调用至test函数,输出其首地址,并同时更改了数scores[0]的数值。因此最后输出scores[0]=0。
package zzu957;
public class zzu {
public static void main(String[] args) {
int score = 100;
System.out.println(score);
test(score);
System.out.println(score);
}
public static void test(int a) {
System.out.println("###"+a);
a=0;
System.out.println("###"+a);
}
}
/*结果为
100
###100
###0
100
*/
由结果可以看出:函数仅仅改变了int a的值,没有对sorce的值造成更改,其原因为:a与sorces均为基本数据类型,作用空间不同,两者互不影响。可用图解释:
有上面两例可以看出,函数方法可以改变对应数组数据在堆中的存储位置,而无法改变因作用空间不同的基本数据类型的数据。