Java Integer和String内存存储
2016-01-10 12:51
330 查看
先看代码:
测试的结果:
i1 = i2? true
i1 = i3? false
i4 = i5? false
s1 = s2? true
s1 = s3? false
在Java中,对于对象
Integer的存储
Integer是int的封装类,一般来说基础变量(int)赋值给Integer对象将自动装箱(Auto Boxing)并为Integer对象分配堆空间。因此即使基础变量值一样,封装类对象指向不同地址。所以
对JVM为了节省空间, 当Integer的值落在-128~127之间时,如
事实上, Integer已经默认创建了数值[-128~127]的Integer缓存数据。所以使用
对于显式的
String的存储
对于使用字面量赋值方式。JVM为了节省空间,
对象new创建方式,JVM将分配新空间。
一个例子,来自:/article/3613190.html:
参考:
Java常量池详解之一道比较蛋疼的面试题
Weird Integer boxing in Java
java 内存数据存储
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 内存数据存储
相关文章推荐
- Spring学习笔记 6. 尚硅谷_佟刚_Spring_Bean 之间的关系
- Spring 使用注解方式进行事务管理
- Java IO 与NIO的区别
- The Introduction of Java Memory Leaks
- Java基础总结
- eclipse反编译插件
- 深入浅出RxJava三--响应式
- 深入浅出RxJava(二:操作符)
- 【慕课笔记】第二章 变量和常量 第10节 如何在Java中使用注释
- RxJava基础
- 【慕课笔记】第二章 变量和常量 第9节 Java常量的应用
- Java语法基础(二)
- JAVA获得设备信息
- java反射详解
- Java动态代理详解
- 用JAVA编写汉诺塔程序
- java中的==运算符、equals()方法
- java数组元素重复次数最大值
- Spring学习笔记 5. 尚硅谷_佟刚_Spring_自动装配
- Java基础问题(二)