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

java对象内存的存储

2017-09-11 10:48 211 查看
(此次纯属做笔记,有错误请评论,谢谢大家)

1 对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。

对象的具体信息保存在堆中。常量池的速度是最快的。

常量包括两个:一个是直接定义的string,一个是final类型的变量

常量池:string s = “aa”; final int 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: