Java面试必知:Java中 String和Integer内存存储问题
程序员文章站
2022-06-04 23:16:07
...
String和Integer的内存存储
String的内存存储
- String a=“a” 可能创建一个对象或者不创建对象, 如果"a"这个字符串在java String池里不存在,会在java String池创建这个一个String对象(“a”).如果已经存在,a直接reference to 这个String池里的对象。
- String str1 = new String(“ABC”) 至少创建一个对象,也可能两个。因为用到new 关键字,会在heap创建一个 str1 的String 对象,它的value 是 “ABC”.同时,如果"ABC"这个字符串在java String池里不存在,会在java String池创建这个一个String对象(“ABC”).
- String 有一个intern() 方法,native,用来检测在String pool是否已经有这个String存在。
- 对于new jvm会直接分配新的空间
String a=new String("女");
String a1="女";
String a2="女";
System.out.println(a==a1);
System.out.println(a1==a2);
/**
* false
* true 因为 a1 和 a2 都是指向String池中的 一块内存
*/
Integer的内存存储
- Integer是int的封装类,一般来说基础变量(int)赋值给Integer对象将自动装箱(Auto Boxing)并为Integer对象分配堆空间。因此即使基础变量值一样,封装类对象指向不同地址。
- JVM为了节省空间, 当Integer的值落在-128~127之间时,如Integer i1 = 2; Integer i2 = 2;此时JVM首先检查是否已存在值为2的Integer对象.如果是,则i2直接是引用已存在对象,即i2 == i1。
- 事实上, Integer已经默认创建了数值[-128~127]的Integer缓存数据。所以使用Integer i1=2时,JVM会直接在该在对象池找到该值的引用。
- 当 Integer 和基本类型进行比较时,会进行拆包.按基本类型进行比较
- 对于显式的new ,JVM将直接分配新空间。
Integer i1 = 2;
Integer i2 = 2;
Integer i3 = 300;
Integer i4 = 300;
int i5=300;
System.out.println("i1 = i2? " + (i1 == i2));
System.out.println("i3 = i4? " + (i3 == i4));
System.out.println("i4 = i5? " + (i4 == i5));
/**
* true
* false
* true 和 基本类型进行比较时,会自动拆包(此处是char byte等也是true)
* /
上一篇: 【23种设计模式】工厂模式
下一篇: js中的