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