String str1 = "abc";
String str2 = "abc";
上述中的"abc"会被存放到常量字符串池中,定义str1和str2指向了字符串池中的"abc"(这里有个原则:指向的字符串如果存在,就共享)
java中的串池有两个特点:
1、串池中的内容一经创建便不可改变,平时见到的串内容发生了改变那是假象,其实是丢弃了旧串,创建了新串;
2、当串池中的内容没有指针指向它的时候,它也不会被JVM的垃圾回收机制回收;
3、串池中的内容不允许重复。比如下面的例子:
String str3 = new String("abc");
定义一个str3指向一个new String("abc")对象,JVM首先在字符串池中查找有没有"aaa"这个字符串对象,如果有,则不在池中再去创建"aaa"这个对象了,直接在堆中创建一个"aaa"字符串对象,然后将堆中的这个"aaa"对象的地址返回赋给引用str3,这样,str3就指向了堆中创建的这个"aaa"字符串对象;
使用 str1==str2 是true,这里比较的是堆内存地址,比较str1和==tr3就会返回false.
字符串内容的比较需要使用equals方法
str1.equals(str3)
这个结果返回的是true