java中String類的理解

String我們把它稱作不可變字符序列

字符串常量會被放到常量池裡面

常量池應該是在方法區裡面的

當我們在做字符串比較的時候其實比較的是字符串的值

所以當我們進行值比較的時候最好使用equals,避免常量池裡面沒有找到對應的字符串的地址值

String一經初始化後,就不會再改變其內容了。對String字符串的操作實際上是對其副本(原始拷貝)的操作,原來的字符串一點都沒有改變。比如:

String s ="a"; 創建了一個字符串

s = s+"b"; 實際上原來的"a"字符串對象已經丟棄了,現在又產生了另一個字符串s+"b"(也就是"ab")。 如果多次執行這些改變串內容的操作,會導致大量副本字符串對象存留在內存中,降低效率。如果這樣的操作放到循環中,會極大影響程序的時間和空間性能,甚至會造成服務器的崩潰。

相反,StringBuilder和StringBuffer類是對原字符串本身操作的,可以對字符串進行修改而不產生副本拷貝或者產生少量的副本。因此可以在循環中使用。

序列說白了就是一個數組

final意味著是不可變的,只能被初始化一次

java默認的就是Unicode字符集

1 創建的字符串變量在內存中的區別


兩者看似都是創建了一個字符串對象,但在內存中確是各有各的想法。


String str1= "abc"; 在編譯期,JVM會去常量池來查找是否存在"abc",如果不存在,就在常量池中開闢一個空間來存儲"abc";如果存在,就不用新開闢空間。然後在棧內存中開闢一個名字為str1的空間,來存儲"abc"在常量池中的地址值。


String str2 = new String("abc") ;在編譯階段JVM先去常量池中查找是否存在"abc",如果過不存在,則在常量池中開闢一個空間存儲"abc"。在運行時期,通過String類的構造器在堆內存中new了一個空間,然後將String池中的"abc"複製一份存放到該堆空間中,在棧中開闢名字為str2的空間,存放堆中new出來的這個String對象的地址值。


也就是說,前者在初始化的時候可能創建了一個對象,也可能一個對象也沒有創建;後者因為new關鍵字,至少在內存中創建了一個對象,也有可能是兩個對象。

java中String類的理解



分享到:


相關文章: