您的位置:首页 > 编程语言 > Java开发

Java内存

2015-11-16 13:17 288 查看


栈:

- 栈空间存储的是局部变量的基本数据类型的值。

- 需要声明,并初始化后才能使用。

- 栈中的数据在变量所在的代码块执行完毕,变量结束生命周期,栈中的数据立即被清理。

堆:

堆内存空间存储的是通过NEW关键字实例化的引用数据类型。

一旦实例化之后,系统赋予默认值。

当栈中的变量及引用被清理后,堆中的空间不会立即清理,此时堆中的空间就变为垃圾,由JVM中的“垃圾回收器”不定期检查清理。

说明:

局部变量的基本数据存储在栈中,通过NEW实例化的引用数据类型存放在堆中,栈中会存放实例化对象的位置

int a = 0;//直接存放在栈中

int[] arr = new ing[3];//在堆中存放数据 将其在堆中的位置传递给栈中的对象

arr = 0x7764;//栈中存放

按引用传递:

package world;
/**
* 按值传递 按地址传递
* @author lenovo
*
*/
public class GArrayDemo {

public static void main(String[] args){
int [] arr4 = new int[4];
arr4[0] = 10;
arr4[1] = 20;
arr4[2] = 30;
arr4[3] = 40;
for(int i = 0; i < arr4.length;i++){
System.out.println("arr4["+i+"] ="+arr4[i]);
}

System.out.println("直接打印arr4:"+arr4);//直接打印arr:[I@21c55e69
//将引用类型清空
arr4 = null;//将地址清空
System.out.println("将arr4置为null后,再次打印arr4:"+arr4);//将arr置为null后再次打印arr:null
//      System.out.println("将arr4置为null后,访问arr4的length属性:"+arr4.length);//空指针异常Exception in thread "main" java.lang.NullPointerException at world.GArrayDemo.main(GArrayDemo.java:23)

arr4 = new int[5];
arr4[0] = 80;
int[] arr5 = arr4;//仅仅是将arr4的地址复制给了arr5,表示arr4和arr5使用的是相同的地址,指向了同一堆空间
arr5[0] = 100;
System.out.println("arr5[0]="+arr5[0]);//arr5[0]=100
System.out.println("arr4[0]="+arr4[0]);//arr4[0]=100

arr4 = null;//堆空间是否是垃圾?为什么? 不是,因为arr5还指向这个堆空间
System.out.println("将arr4置为null后,访问arr5的length属性:"+arr5.length);//5
System.out.println("将arr4置为null后,访问arr4:"+arr4);//null
arr4 = arr5;
change(arr4);
System.out.println(arr4[0]);//1000

}
/*
* 将arr4的地址复制给方法体,方法体中arr将堆空间相应地址下的数据更改,执行完毕后方法体数据删除
*/
public static void change(int[] arr){
arr[0] = 1000;
}
}




按值传递

按值传递是将值复制一份传递到方法体,方法体执行完毕后栈空间内对应的数据自动删除,原值不改变

package world;
public class GArrayDemo {
public static void main(String[] args){
int x = 10;
change(x);
System.out.println(x);//10
}
public static void change(int a){
a = 1000;
}
}




package world;
public class GArrayDemo {
public static void main(String[] args){
int i = 7;
i = change2(i);//方法体中有数值传回,并给i赋值,若不用i接收,则i数值不变
System.out.println(i);//20
}
public static int change2(int a){
a = 20;
return a;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java