JAVA中字符串問題

JAVA中對象創建

  • 通過new關鍵字來創建對象
  • 通過newInstance()方法來創建對象
  • 使用反序列化機制中IO流中恢復Java對象
  • 通過clone()方法複製一個對象
  • 直接量方式,String str = “abc”;

字符串緩衝池

public  class TestString {
  public static void main(String[] args){
  String str1 = "string";
  System.out.println(System.identityHashCode(str1));
  String str2 = "string";
  System.out.println(System.identityHashCode(str2));
  }
}

System.identityHashCode()是根據內存地址算Hash值
運行上面的代碼得到一下結果


這說明str1str2指向的內存地址是一樣的。這是因爲JVM將字符串常量放在了一個叫字符串緩衝區的,因爲str1str2的值一樣,所以在緩衝區放一份就可以,同時str1str2都指向這個地方。
當然str1="testString", str2="test" + "String",str1str2也會指向相同的區域,因爲在編譯java文件時,會將str2的值合爲“testString”。但是如果str3=“String”,str2 = “test” + str3時,str2將和str1雖然內是相等的,但是str1str2指向的內存地址不同,因爲編譯器不會將變量str3轉換爲“String",不過也有下面的特例

public  class TestString {
  public static void main(String[] args){
  String str1 = "TestString";
  System.out.println(System.identityHashCode(str1));
  final String str3 = "Test";
  String str2 = str3 + "String";
  System.out.println(System.identityHashCode(str2));
  }
}

執行上面的代碼會發現輸出的值是相等的,這是因爲我們在變量str3前加了關鍵字final,該關鍵字相當於C中宏替換,告訴編譯器編譯的時候將str3都替換成”Test“,所以纔會有str1與str2相等(指向同一內存區)。

String類不可變字符串

String類的底層是用數組實現的,我們知道數組的長度確定好後是不能更改的。
str = ”abc“;
str = str + ”defg“;
JAVA中對於上面的處理過程是重新創建一個對象,並將內容初始化爲”abcdefg“,再讓str指向這個新的對象。而“abc”依然在字符串緩衝區,如果在後面不會用到,並且垃圾回收器不回收字符串緩衝區的數據的話,就會發生內存泄露問題。
如果字符串要動態擴展的話建議使用StringBuilder或者是StringBuffer,前者非線程安全,後者線程安全,但前者速度快。

public  class TestString {
  public static void main(String[] args){
  StringBuilder str1 = new StringBuilder("TestString");
  System.out.println(System.identityHashCode(str1));
     str1.append("String");
  System.out.println(System.identityHashCode(str1));
  System.out.println(str1);
  }
 
}

運行結果如下



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章