String 基礎(一)

   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!

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