Java Integer和String内存存储

 

标签: java内存string
 分类:
Java(7) 

先看代码:

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 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

测试的结果:

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将分配新空间。


一个例子,来自:http://blog.csdn.net/hejingyuan6/article/details/50489171

   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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12


参考: 
Java常量池详解之一道比较蛋疼的面试题 
Weird Integer boxing in Java 
java 内存数据存储

转载于:https://www.cnblogs.com/yangchunchun/p/7405477.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值