String變量的兩種創建方式



在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));

分析:

  1. 在創建str01時,方法區的字符串常量池中沒有存儲"abc"的地址,就在常量池中創建一個存放"abc"的地址,使變量str01指向該地址。創建str02時,字符串常量池已存在存放"abc"的地址,將str02變量指向該地址,此時str01與str02指向同一內存地址,所以"str01==str02"為true。
  2. 使用new關鍵字創建對象時,每一次都會在堆中創建一個新的對象,所以str03與str04指向對象的地址不同,"str03==str04"為false。
  3. 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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM