JVM為了提升性能和減少內存開銷,避免字符串的重復創建,維護了一塊特殊的內存空間——字符串實例池。
String賦值的兩種方式。
1、String str = "test";
以這種方式賦值時,JVM會先從字符串實例池中查詢是否存在"test"這個對象,
如果存在,直接把實例池中"test"的地址返回給str。如果不存在,則會在實例池中創建"test"對象,並把該對象的地址返回給str。
所以通過==比較是,str1,str2指向的是同一地址,所以返回true;
2、String str = new String("test");
以這種方式賦值時,JVM會先從字符串實例池中查詢是否存在"test"這個對象,
若不存在則會在實例池中創建"test"對象,同時在堆中創建"test"這個對象,然后將堆中的這個對象的地址返回賦給引用str。
若實例池存在則直接在堆中創建"test"這個對象,然后將堆中的這個對象的地址返回賦給引用str。
這時str1和str2分別指向堆中不同的地址,所以返回false;