String 基礎(一)
一:String引用類型(也有人稱是一個對象),不是簡單類型!默認值是null.
二:new String() 和new String("")是創建一個空字符串對象。不是null。
三:String str = "abc" 和 String str = new String("abc")的區別:
爲了區別,我們引入一個概念——常量池
常量池(constant pool)指的是在編譯期被確定,並被保存在已編譯的.class文件中的
一些數據。它包括了關於類、方法、接口等中的常量,也包括字符串常量。
(1):String str = "abc"
首先查看字符串池中是否存在字符串"abc",如果存在則直接將"abc"賦給str,
如果不存在就在字符串池中新建一個字符串"abc",然後賦給str。也就是說,
jvm會確保字符串池中僅有一個字符串拷貝。
例如:
String str1 = "abc";
String str2 = "abc";
String str3 = "a"+"b"+"c";
System.out.println(str1==str2);
System.out.println(str1==str3);
結果:true
true
因爲例子中的str1 和str2 中的”kvill”都是字符串常量,它們在編譯期就被確定了,所以str1==str2爲true;
而”a”和”b”,"c"也都是字符串常量,當一個字符串由多個字符串常量連接而成時,它自己肯定也是字符串常量,
所以str3 也同樣在編譯期就被解析爲一個字符串常量,所以str3 也是常量池中” abc”的一個引用。
(2): new String("abc")
創建的字符串不是常量,不能在編譯期就確定,所以new String()創建的字符串不放入常量池中,它們有自己的地址空間
例:
String str1 = "abc";
String str2 = new String("abc");
String str3 = "a"+"b"+new String("c");
System.out.println(str1==str2);
System.out.println(str1==str3);
System.out.println(str2==str3);
結果:
false
false
false
str2 因爲無法在編譯期確定,所以是運行時創建的新對象”abc”的引用,
str3 因爲有後半部分new String(“c”)所以也無法在編譯期確定,
所以也是一個新創建對象”abc”的應用;明白了這些也就知道爲何得出此結果了。
四:最後總結一下
創建字符串對象不建議用new 的方式,new效率比較低,而且也佔用空間。如果要用new String();建議用
StringBuffer!