天天看點

JAVA關于String的全面概述

String

String的基本特性

  • String:字元串,使用一對“”引起來表示

    String str = “Hello”; //字面量的形式。

    String str = new String(“Hello”);

  • String聲明為final的不能被繼承,實作了Serializable接口,表示字元串是支援序列化的,實作了Comparable接口,表示String可以比較大小。
  • String在jdk8以前内部定義了final char[ ] value用于存儲字元串,在jdk9時改為btye [ ]加上編碼标記,節約了一些空間(原因:char占兩個位元組,而大部字元是拉丁文一個位元組就可以存入,對于需要兩個位元組存放的,可根據編碼标記判斷)。
  • String 代表不可變的字元序列。

    ①當字元串重新指派,②對現有字元串進行連接配接操作,③使用replace()方法修改指定字元串,都需要重寫指定記憶體區域指派,不能使用原有的value指派。

  • 通過字面量的方式(差別與new)給一個字元串指派,此時的字元串值聲明在字元串常量池中。 字 符 串 常 量 池 中 是 不 會 存 儲 相 同 内 容 的 字 符 串 的 。 \color{red}{字元串常量池中是不會存儲相同内容的字元串的}。 字元串常量池中是不會存儲相同内容的字元串的。
  • String的String pool是一個固定大小的Hashrable,jdk7預設值是60013,可使用-XX:StringTableSize設定大小。
  • 字元串拼接操作

    1.常量與常量的拼接結果是放在常量池,原理是編譯期優化。

    2.隻要其中一個是變量,結果是放在堆中,拼接原理是StringBuider。

    3.如果拼接的結果調用了intern()方法,會先查詢字元串常量池中是否存在該字元串,若不存在,則将目前字元串放入常量池中,并傳回此對象的位址,若存在,則直接傳回此對象位址,以節約記憶體。

String s = new String("1") + new String("1");//s變量記錄的位址為new String(“11”)
s.intern();// 在常量池中生成 “11”.jdk6建立一個新的對象 “11” 也就是新的位址;
           // jdk7以後 此時常量中并沒有建立“11” 而是建立一個指向堆空間中new String(11)的位址。
String ss = "11"; 
System.out.println(s==ss); //true();
           
  • new String(“ab”)會建立幾個對象?

    兩個對象:一個對象是 new關鍵字在堆空間建立;另一個對象是 字元串常量池中的對象。通過檢視位元組碼指令可證明。

  • G1的String去重操作

    開啟指令:UseStringDeduplication(pool);