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

Java Integer和String内存存储

2016-01-10 12:51 330 查看
先看代码:

void foo()
{
Integer i1 = 2;
Integer i2 = 2;
Integer i3 = new Integer(2);
System.out.println("i1 = i2? " + (i1 == i2));  //true
System.out.println("i1 = i3? " + (i1 == i3));  //false

Integer i4 = 1000;
Integer i5 = 1000;
System.out.println("i4 = i5? " + (i4 == i5)); //false

String s1 = "cat";
String s2 = "cat";
String s3 = new String("cat");
System.out.println("s1 = s2? " + (s1 == s2));  //true
System.out.println("s1 = s3? " + (s1 == s3));  //false
}


测试的结果:

i1 = i2? true

i1 = i3? false

i4 = i5? false

s1 = s2? true

s1 = s3? false

在Java中,对于对象
==
是比较两个对象的地址。

Integer的存储

Integer是int的封装类,一般来说基础变量(int)赋值给Integer对象将自动装箱(Auto Boxing)并为Integer对象分配堆空间。因此即使基础变量值一样,封装类对象指向不同地址。所以
System.out.println("i4 = i5? " + (i4 == i5)); //false


对JVM为了节省空间, 当Integer的值落在-128~127之间时,如
Integer i1 = 2; Integer i2 = 2;
此时JVM首先检查是否已存在值为2的Integer对象。如果是,则
i2
直接是引用已存在对象,即
i2 = i1
。所以
System.out.println("i1 = i2? " + (i1 == i2));  //true


事实上, Integer已经默认创建了数值[-128~127]的Integer缓存数据。所以使用
Integer i1=2
时,JVM会直接在该在对象池找到该值的引用。

对于显式的
new Integer(2)
,JVM将直接分配新空间。所以
System.out.println("i1 = i3? " + (i1 == i3));  //false


String的存储

对于使用字面量赋值方式。JVM为了节省空间,
s2
会首先查找JVM中是否有
"cat"
的字符串常量。如果已经存在,则直接返回该引用,而无需重新创建对象。

对象new创建方式,JVM将分配新空间。

一个例子,来自:/article/3613190.html

String s1 = "china";
  String s2 = "china";
  String ss1= new String("china");
  String ss2 = new String("china");
int i =1;
int j =1;
public static final int  i1 = 1;
public static final int  j1 = 1;
Integer it1= 127;
Integer it2= 127;
Integer it11= 128;
Integer it12= 128;




参考:

Java常量池详解之一道比较蛋疼的面试题

Weird Integer boxing in Java

java 内存数据存储
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: