String字符串建立與存儲機制

Java內存能夠粗略的區分爲堆內存(Heap)和棧內存(Stack),堆中存放的是對象實例,而棧中存放的則是方法調用過程當中的局部變量或引用等。微信

在Java語言中,字符串的生命與初始化有以下兩種方式:spa

 1. 初始化 code

String str1 = "helloJava";對象

String str2 = "helloJava"; blog

在JVM中存在存在一個字符串常量池,用於存放特定的字符串對象,能夠被共享使用。str1和str2引用的是同一個字符串常量池裏的對象。當建立一個字符串常量時,如"helloJava",首先會在常量池中查找是否已經存在相同的字符串(經過string.equals()方法判斷,若是返回true,則認爲是相同的字符串),若是存在,則直接獲取其引用,不須要從新建立對象;若不存在,則會首先建立這個對象,而後把它加入到字符串常量池中,再將它的引用返回。內存

因爲String類是不可變類,一旦建立好後就不能修改,所以String對象能夠被共享並且不會致使程序混亂。字符串

 2. 建立對象 string

String str3 = new String("helloJava"); 
String str4 = new String("helloJava"); 編譯

str3和str4是經過new關鍵字建立的兩個不一樣的對象,在內存中的地址是不一樣的。 class

String str3 = new String("helloJava")這條語句能夠分解爲兩個過程:

1)建立對象

即new String("helloJava"),調用String類的構造方法,傳入一個字符串常量,等價於兩個操做:"helloJava"和new String()。若是字符串常量池中不存在"helloJava",則會建立常量"helloJava",並添加到常量池中;若存在則不建立,new String()會在堆中建立一個新的對象,所以str3和str4分貝指向堆中不一樣的對象。
2)賦值

即String str3 = ,將一個String類型的引用賦值給str3變量,這個過程不會建立新的對象。

 

 舉例說明 :

String s1 = "helloJava";//把"helloJava"放入常量池中,編譯時產生
String s2 = "hello"+"Java";//把"hello"和"Java"轉換成"helloJava"放入常量池中
String s3 = "helloJava";//引用常量池中的對象,不會從新建立對象
String s4 = new String("helloJava");//運行時把"helloJava"放入堆裏面,在堆中建立一個對象
String s5 = new String("helloJava");//在堆中又建立一個新的對象

 

 存儲圖例 :

 

歡迎關注微信公衆號【Java典籍】,收看更多Java技術乾貨!

  ▼微信掃一掃下圖↓↓↓二維碼關注

 

相關文章
相關標籤/搜索