天天看點

java基礎面試題:字元串存儲機制解析。字元串建立與存儲的機制是什麼?哈喽,大家好,我是架構師奶爸。在java語言中字元

java基礎面試題:字元串存儲機制解析。

字元串建立與存儲的機制是什麼?哈喽,大家好,我是架構師奶爸。在java語言中字元串起着非常重要的作用。字元串的聲明與初始化主要有如下兩種情況:

·1、對于Strings1=newString("abc")語句。Strings2=newString("abc"),存在兩個引用對象s1、s2,兩個内容相同的字元串對象abc。它們在記憶體中的位址是不同的,隻要用到new總會生成新的對象。

·2、對于Strings1=abc語句與Strings2="abc"語句。在jvm中存在着一個字元串池,其中儲存着很多的String對象并且可以被共享使用。s1、s2引用的同一個常量池中的對象。

由于String的實作采用了Flyweight的設計模式,當建立一個字元串常量時,例如:Strings="abc",會首先在字元串常量池中查找是否已經有相同的字元串被定義,其判斷依據是String類equals(Objectobj)方法的傳回值。

若已經定義則直接擷取對象的引用,此時不需要建立新的對象。若沒有定義則首先建立這個對象,然後把它加入到字元串池中,再将它的引用傳回。

由于String是不可變類,一旦建立好了就不能修改,是以String對象可以被共享而且不會導緻程式的混亂。

具體而言來看一段代碼:

·第一個s是把abc放到常量區中,在編譯時産生。

·第二個s是把abc轉換為字元串常量abc放到常量區中。

·第三個s是在運作時把abc放到堆裡面。

再看一段代碼如上圖:s1是在常量區裡面放了一個abc字元串對象,s2引用常量區中的對象,是以不會建立新的對象。s3在堆中建立新的對象,s4在堆中又建立了一個新的對象。為了便于了解可以把String s=newString("abc")語句的執行。分解成兩個過程。第一個過程是建立對象的過程,即newString("abc");第二個過程是指派的過程,即String s。

由于第二個過程隻是定義了一個名為s的String類型的變量,将一個String類型對象的引用指派給s,是以在這個過程中不會建立新的對象。

·第一個過程中,newString("abc")會調用String類的構造函數,在調用這個構造函數時傳入了一個字元串常量,是以語句newString(abc)等價于abc和newString兩個操作了。若在字元池中不存在abc,則會建立一個字元串常量abc,并将其添加到字元串池中。若存在則不建立。

newString會在堆中建立一個新的對象,是以s3與s4指向的是堆中不同的String對象,位址自然也不相同了。如上圖所示。

想學習更多java程式設計知識,請關注我架構師奶爸,共同築基java架構師。

java基礎面試題:字元串存儲機制解析。字元串建立與存儲的機制是什麼?哈喽,大家好,我是架構師奶爸。在java語言中字元
java基礎面試題:字元串存儲機制解析。字元串建立與存儲的機制是什麼?哈喽,大家好,我是架構師奶爸。在java語言中字元
java基礎面試題:字元串存儲機制解析。字元串建立與存儲的機制是什麼?哈喽,大家好,我是架構師奶爸。在java語言中字元
java基礎面試題:字元串存儲機制解析。字元串建立與存儲的機制是什麼?哈喽,大家好,我是架構師奶爸。在java語言中字元

繼續閱讀