在java中,有兩種創建String類型變數的方式: 第一種方式創建String變數時,首先查找JVM方法區的字元串常量池是否存在存放"abc"的地址,如果存在,則將該變數指向這個地址,不存在,則在方法區創建一個存放字面值"abc"的地址。 第二種方式創建String變數時,在堆中創建一個存放"ab ...
在java中,有兩種創建String類型變數的方式:
String str01="abc";//第一種方式 String str02=new String("abc");//第二種方式
第一種方式創建String變數時,首先查找JVM方法區的字元串常量池是否存在存放"abc"的地址,如果存在,則將該變數指向這個地址,不存在,則在方法區創建一個存放字面值"abc"的地址。
第二種方式創建String變數時,在堆中創建一個存放"abc"的對象,使變數str02指向堆中的對象。
根據上面的創建方式,觀察下麵的示例:
String str01 = "abc"; String str02 = "abc"; String str03 = new String("abc"); String str04 = new String("abc"); System.out.println("str01==str02:" + (str01 == str02)); System.out.println("str03==str04:" + (str03 == str04)); System.out.println("str01==str03:" + (str01 == str03));
分析:
- 在創建str01時,方法區的字元串常量池中沒有存儲"abc"的地址,就在常量池中創建一個存放"abc"的地址,使變數str01指向該地址。創建str02時,字元串常量池已存在存放"abc"的地址,將str02變數指向該地址,此時str01與str02指向同一記憶體地址,所以"str01==str02"為true。
- 使用new關鍵字創建對象時,每一次都會在堆中創建一個新的對象,所以str03與str04指向對象的地址不同,"str03==str04"為false。
- str01指向方法區,str03指向堆,所以"str01==str03"為false。
String對象被設計成不可改變的對象,即String對象所包含的字面值發生改變時,會開闢一個新的地址,創建一個新的對象,原地址不變。
String str01 = "abc"; String str02 = "abc"; str01="def";
在方法區的字元串常量池中建立一個新的存儲"def"的地址,str01指向該地址,str02的指向不變。
參考:
http://brucephan.blog.163.com/blog/static/1376090812012512113032143/
http://www.cnblogs.com/tonghun/p/6921890.html
http://www.tiantianbianma.com/java-string-interview-questions.html/