關於 String 自我理解
阿新 • • 發佈:2017-08-02
引用 true rgs 技術分享 接口 lar 就會 調用 如果
String 的一些認識:
- String對象是不可變,所以使用 final 修飾
- 字符串拼接,合理利用 StringBuilder(線程非安全),StringBuffer 線程安全
- 常用方法就不詳細介紹
■構造函數
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
- 實現 java.io.Serializable 接口,支持序列化
- 實現Comparable 接口,實現比較
- 實現CharSequence 接口,實現字符的一些方法
■String 的一些重載
public class StringPlusTest { public static void main(String[] args) { String mango = "mango"; String s = "abc" + mango + "def" + 47; //底層使用 StringBuilder 進行拼接 System.out.println(s); } }
javap 反編譯,jvm碼顯示: 我們看到jvm其實調用了StringBuild 來處理字符串拼接
■字符串對象
publicclass StringTest { public static void main(String[] args) throws Exception { String a = "chenssy"; String b = "chenssy"; String c = new String("chenssy"); System.out.println("--------------修改前值-------------------"); System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("c = " + c); //修改String的值 Field a_ = String.class.getDeclaredField("value"); a_.setAccessible(true); char[] value=(char[])a_.get(a); value[4]=‘_‘; //修改a所指向的值 System.out.println("--------------修改後值-------------------"); System.out.println("a = " + a); //chen_sy System.out.println("b = " + b); //chen_sy System.out.println("chenssy"); //chen_sy System.out.println("c = " + c); //chen_sy } }
我們知道字符串的分配和其他對象分配一樣,是需要消耗高昂的時間和空間的,而且字符串我們使用的非常多。JVM為了提高性能和減少內存的開銷,在實例化字符串的時候進行了一些優化:使用字符串常量池。每當我們創建字符串常量時,JVM會首先檢查字符串常量池,如果該字符串已經存在常量池中,那麽就直接返回常量池中的實例引用。如果字符串不存在常量池中,就會實例化該字符串並且將其放到常量池中。由於String字符串的不可變性我們可以十分肯定常量池中一定不存在兩個相同的字符串(這點對理解上面至關重要)。
- a, b, c 引用與 jvm 常量池的交互
■正則表達式 (#todo#)
關於 String 自我理解