Java栈堆内存详解
来源:互联网 发布:浙江儿童dna数据库利弊 编辑:程序博客网 时间:2024/06/03 17:20
Java栈堆内存详解
/*
1 对于基础类型的变量和常量:
变量和引用存储在栈中,常量存储在常量池中。
对象的具体信息保存在堆中。常量池的速度是最快的。
常量包括两个:一个是直接定义的string,一个是final类型的变量
常量池:string s = "aa"; finalint s = 9;
栈中:int a = 5;
2 对于成员变量和局部变量:
成员变量就是方法外部,类的内部定义的变量,可以不用初始化;
局部变量就是方法或者语句块内部定义的变量,局部变量必须要初始化。
形式参数指的是方法参数列表中的变量,他是局部变量。
局部变量的数据存在于栈中,栈内存中的局部变量随着方法的完成而消失。
成员变量存储在中的对象里面,由垃圾回收器负责回收。
3 String str = "abc";--创建对象的过程
1)首先在常量池中查找是否存在内容为“abc”的字符串对象
2)如果不存在,则在常量池中创建“abc”,并让str引用该对象
3)如果存在,则直接让str引用该对象
String str = new String("abc")--创建对象的过程
1)首先在堆中创建一个指定的对象“abc”,并让str引用指向该对象
2)在字符串常量池中查看,是否存在内容为“abc”的字符串对象
3)如果存在,则将new出来的字符串对象与字符串常量池中的对象联系起来
4)如果不存在,则在字符串常量池中创建一个内容为“abc”的字符串对象,并将堆中的对象与之联系起来。
String str = new String("abc");会产生几个对象?
一个或两个。如果常量池中原来没有“abc",就是两个,如果常量池中有"abc",就是一个;
4 对于int i=2,j=2;
首先会在栈中创建一个变量为i的引用,然后查找有没有字面值为2的地址,
没有的话就会开辟一个存在2这个字面值的地址,然后将i指向2的地址。对于int j同样
查找有没有字面值为2的地址,如果有的话,也是将2的地址指向j,这样就会出现
同时指向2的两个变量。
Integer it1 = 2,it2 = 2;Integer it1 = 250,it2 = 250;
java的自动拆箱和装箱
在自动装箱的时候,把int变为Integer的时候,存在一定的规则,当int的值在-128到127时,
返回的不是一个新new出来的Integer对象,而是一个已经缓存在堆中的Integer对象,(系统
已经把-128到127之间的Integer缓存到一个Integer数组中去了) 。
当装箱的时候,首先去缓存中找,如果找到的话就直接返回引用,不用new,如果不在
-128-127中间,会返回一个新new出来的Integer对象。
Integer it1 = 2;
Integer it2 = 2;
it1==it2;//返回值true
Integer it1 = 128;
Integer it2 = 128;
it1==it2;//返回值false
Integer it1 = new Integer(2);
Integer it2 = new Integer(2);
it1==it2;//返回值false
*/
/*
* class BirthDate {
private int day;
private int month;
private int year;
public BirthDate(int d, int m, int y) {
day = d;
month = m;
year = y;
}
// 省略get,set方法………
}
public class Test{
public static void main(String args[]){
int date = 9;
Test test = new Test();
test.change(date);
BirthDate d1= new BirthDate(7,7,1970);
}
public void change(int i){
i = 1234;
}
对于以上这段代码,date为局部变量,i,d,m,y都是形参为局部变量,day,month,year为成员变量。
下面分析一下代码执行时候的变化:
1. main方法开始执行:int date = 9; date局部变量,基础类型,引用和值都存在栈中。
2. Test test = new Test(); test为对象引用,存在栈中,对象(new Test())存在堆中。
3. test.change(date); i为局部变量,引用和值存在栈中。当方法change执行完成后,i就会从栈中消失。
4. BirthDate d1= new BirthDate(7,7,1970); d1 为对象引用,存在栈中,对象(new BirthDate())存在堆中,其中d,m,y为局部变量存储在栈中,且它们的类型为基础类型,因此它们的数据也存储在栈中。 day,month,year为成员变量,它们存储在堆中(new BirthDate()里面)。当BirthDate构造方法执行完之后,d,m,y将从栈中消失。
5.main方法执行完之后,date变量,test,d1引用将从栈中消失,new Test(),new BirthDate()将等待垃圾回收。
*/
- Java栈堆内存详解
- Java内存分配详解(堆内存、栈内存、常量池)
- 【Java基础】堆内存详解
- Java 堆内存 深入详解
- 堆内存栈内存详解
- 堆内存栈内存详解
- Java中堆内存和栈内存详解
- Java中堆内存和栈内存详解
- Java中堆内存和栈内存详解
- Java中堆内存和栈内存详解
- Java中堆内存和栈内存详解
- Java中堆内存和栈内存详解
- Java中堆内存和栈内存详解
- Java中堆内存和栈内存详解
- Java中堆内存和栈内存详解
- Java中堆内存和栈内存详解
- Java中堆内存和栈内存详解
- Java中堆内存和栈内存详解
- 正则表达式30分钟入门教程
- 通过Kinect制作体感控制机器人
- github怎样删除项目
- Android 6.0 如何默认打开user版本的root权限
- csu1510(规律)
- Java栈堆内存详解
- set/multiset(集与多集)
- armv6, armv7, armv7s, arm64 的区别
- UVALive5135 [Mining Your Own Business] tarjan求无向图双联通分量
- SpringMVC如何处理Ajax请求和返回Json对象
- Date对象常用属性与方法详解
- hdu 1069 Monkey and Banana (动态规划)
- linux下 signal信号机制的透彻分析与各种实例讲解
- TextView用法及实例