java中String類別的使用頻率非常高,那讓我們來看看它到底是什麼?
String是不可變物件
#java.lang.String類別使用了final修飾,不能被繼承。 Java程式中的所有字面值,即雙引號括起的字串,如"abc",都是作為String類別的實例實現的。
String是常數,其物件一旦建構就不能再被改變。換句話說,String物件是不可變的,每一個看起來會修改String值的方法,實際上都是創造了一個全新的String對象,以包含修改後的字串內容。而最初的String物件則絲毫未動。 String物件具有唯讀特性,指向它的任何引用都不可能改變它的值,因此,也不會對其他的引用有什麼影響。但是字串引用可以重新賦值。
java字串在記憶體中採用unicode編碼方式,任何一個字元對應兩個位元組的定長編碼,即任何一個字元(無論中文或英文)都算一個字元長度,佔用兩個字節。
範例:
public class Immutable { public static String upcase(String s) { return s.toUpperCase(); } public static void main(String[ ] args) { String str1= "Hello World"; System.out.println(str1); //Hello World String str2 = upcase(str1); System.out.println(str2); //HELLO WORLD System.out.println(str1); //Hello World } }
當str1傳遞給upcase()方法時,實際傳遞的是引用的一個拷貝。其實,每當把String物件當作方法的參數時,都會複製一份引用,而該引用所指的物件其實一直待在單一的實體位置上,從未動過。
String常數池
常數池(constant pool)指的是編譯期被確定,並被保存在已編譯的.class檔案中的一些數據。它包括了關於類別、方法、介面等中的常數,也包括字串常數。 Java為了提高效能,靜態字串(字面量/常數/常數連接的結果)在常數池中創建,並儘量使用同一個對象,重複使用靜態字串。對於重複出現的字串直接量,JVM會先在常數池中查找,如果常數池中存在即傳回該物件。
例2:
public class test1 { public static void main(String[] args){ String str1 = "Hello"; //不会创建新的String对象,而是使用常量池中已有的"Hello", String str2 = "Hello"; System.out.println(str1 == str2); //true //使用new关键字会创建新的String对象 String str3 = new String("Hello"); System.out.println(str1 == str3); //false } }
以上是java中string類別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!