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));
}
}
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值
運行上面的代碼得到一下結果
這說明str1與str2指向的內存地址是一樣的。這是因爲JVM將字符串常量放在了一個叫字符串緩衝區的,因爲str1和str2的值一樣,所以在緩衝區放一份就可以,同時str1和str2都指向這個地方。
當然str1="testString", str2="test" + "String",str1與str2也會指向相同的區域,因爲在編譯java文件時,會將str2的值合爲“testString”。但是如果str3=“String”,str2
= “test” + str3時,str2將和str1雖然內是相等的,但是str1和str2指向的內存地址不同,因爲編譯器不會將變量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));
}
}
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);
}
}
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);
}
}
運行結果如下