[ Java ] 最通俗易懂的 String 講解

java 基礎知識,查缺補漏之 String

字符串


  • JDK 1.8以前String保存的是字符數組
  • JDK1.9以後String保存的是字節數組
  • 請解釋String 比較中“==”equals()區別?。
    “==”:進行的是數值比較,如果用於對象比較.上比較的是兩個內存的地址數值
    equals():是類所提供的一個比較方法,可以直接進行字符串內容的判斷。
  • 任何使用""定義的字符串常量實際上描述的都是一個String類的匿名對象
  • 使用equals()進行字符串比較時,字符串常量寫在前面,如果寫在後面,可能造成空指向異常
public class Hello {
    public static void main(String[] args) {
        String str1 = "hello";
        String str2 = new String("hello");
        System.out.println(str1 == str2); // false
        System.out.println(str1.equals(str2)); // true
    }
}

String類兩種實例化方式區別


  • 直接賦值(推薦):只會產生一個實例化對象,並且可以自動保存到對象池之中,以實現該字符串實例的重用
  • 構造方法:會產生兩個實例化對象,並且不會自動入池,無法實現對象重用,但是可以利用intern()方法手工入池
public class Hello {
    public static void main(String[] args) {
        String str1 = "hello";
        String str2 = "hello";
        // 兩個對象所指向的堆內存是同一個
        System.out.println(str1 == str2); // true
        // 實例化對象時,如果`String`對象池中存在,就不會再開闢堆內存,
        // 棧內存指向已存在的堆內存,所以地址比較的值爲true(指向同一塊堆內存)
    }
}
  • 在採用直接賦值的處理過程之中,對於字符串而言可以實現池數據的自動保存,這樣如果再有相同數據定義時可以減少對象的產生,以提升操作性能。
public class Hello {
    public static void main(String[] args) {
        String str1 = "hello";
        // 手工入池
        String str2 = new String("hello").intern();
        System.out.println(str1 == str2); // true
    }
}

在這裏插入圖片描述

  • 使用構造方法實例化String對象,會開闢兩塊堆內存空間,只會使用一塊,而另外一個由於字符串常量所定義的匿名對象將成爲垃圾空間。

在這裏插入圖片描述
在這裏插入圖片描述

String 對象常量池


對象池的主要目的是實現數據的共享處理。以String對象池爲例,裏面的內容主要就是爲了重用,而重用實際上是共享設計。
但是在Java之中對象(常量)池實際上可以分爲兩種

  • 靜態常量池:指的是程序(*.class)在加載的時候會自動將此程序之中保存的字符串、普通的常量、類和方法的信息等等,全部進行分配
  • 運行時常量池:當一個程序(* .class) 加載之後,裏面可能有一些變量,這個時候提供的常量池。
public class Hello {
    public static void main(String[] args) {
        String str1 = "How are you!";
        String str2 = "How " + "are" + " you!";
        // 靜態常量池
        System.out.println(str1 == str2); // true

        String str3 = "are";
        String str4 = "How " + str3 + " you!";
        // 動態常量池
        System.out.println(str3 == str4); // false
    }
}

參考鏈接:


在這裏插入圖片描述

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