Java Integer和String内存存储
来源:互联网 发布:网络语吃狗粮 编辑:程序博客网 时间:2024/06/06 05:27
先看代码:
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将分配新空间。
一个例子,来自: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;
参考:
Java常量池详解之一道比较蛋疼的面试题
Weird Integer boxing in Java
java 内存数据存储
0 0
- Java Integer和String内存存储
- Java Integer和String内存存储
- Java中的String和Integer
- 关于java的内存分析和String的存储特点
- Java中Integer和String浅谈
- Java String 比较和 Integer 比较
- Java Integer和String的比较操作
- String和Integer回顾。
- Java中的String 和char[] ,int和Integer
- java中int和integer,String,StringBuffer,StringBuilder的区别
- java 实现string 转integer
- java String 转 Integer 方法
- String to Integer (atoi) (Java)
- String to Integer (atoi)(java)
- Integer和String底层原理
- java中Integer.parseInt(String)与Integer.valueOf(String)区别
- java内存分配和String的不变性
- String深入解析和java内存分配
- NSURLSession的强引用问题
- 实践干货!猿题库 iOS 客户端架构设计
- <Android Studio实用指南>8.16 提炼参数对象
- 简单密码解码
- 浅谈TCP/IP 三次握手建立连接,四次握手断开连接,以及关于非阻塞socket重连问题
- Java Integer和String内存存储
- POI 操作Excel表格系列2 --- 读取Excel表格
- window8.1下python 开发环境搭建和遇到的问题
- mac 下 使用 iterm2 配置及快键键使用
- Python之reload流程
- 电脑课脱离老师控制
- 编译APR包的时候出现 rm: cannot remove `libtoolT': No such file or directory
- 位运算符号&
- 上机题目(初级)-整型数排序(Java)