JVM中关于字符串的内存分配
string的创建有两种方法:
方式一: String a = “abc”; 显示赋值
方式二: String b=new String(“abc”); 构造赋值
两种方式的创建过程及区别:
第一种,jvm会首先在 String constant pool (字符串恒定池)中寻找是否已经存在"abc"常量,如果没有则创建该常量,并且将此常量的引用返回给String a;如果已有"abc" 常量,则直接返回 String constant pool 池中 “abc” 的引用地址给String a.此创建方法只会在String constant pool池中创建对象。
第二种,jvm会直接在堆中创建字符串对象,并不会把"abc” 加入到String constant pool池中,然后把该对象 引用返回给String b;
例如:如下代码
在内存中存放如下:
图解 直接赋值 和 构造器赋值 的区别:
图解字符串比较规则:
< " == 比较的是地址值 " >
- String s1 = “abc” 和String s2 = “abc” 时,s1 ==s2 :true,因为s1和s2的地址是一样的
- String s3 = new String(“abc”);String s4 = new String(“abc”);s3 ==s4:false,因为s3和s4的地址不一样
< " equals()补充说明 " >
因为在String类中重写了equals方法,所以system.out.println(s3.equals(s4)); 结果为 true;
虽然new String()方法并不会把"abc” 加入到String constant pool中,但是可以手动调用String.intern(),将new 出来的字符串对象加入到String constant pool中。