Java String 對象的分析

Java String 對象的分析

package string; public class Demo01 { /** * 1)String 常量存放在常量池中,Java虛擬機處於優化的考慮,會讓內容一致的對象共享內存塊, * 但變量是放在堆內存空間中的,new定義的不同變量內存地址不會相同。 * * 2)String 常量 連接 常量,還是 常量,依然用常量池管理,但 變量 連接 常量 就是 變量了。 * @param args */ public static void main(String[] args) { String a = "abc"; String b = "abc"; System.out.println(a == b ); System.out.println(a.equals(b)); Integer ia = 1; Integer ib = 1; System.out.println(ia == ib); System.out.println(ia.equals(ib)); String sc = new String("abc"); String sd = new String("abc"); System.out.println(sc == sd); System.out.println(a == sc); System.out.println(sc.equals(sd)); String c = "a"; String d = c + "bc"; String e = "a" + "bc"; System.out.println(a == d); System.out.println(a == e); } }

package string; public class Demo02 { public static void main(String[] args) { //String 是不可變的 //通過new操作在內存中開闢一塊空間存放“123”,然後讓s1指向存放“123”的內存 String s1 = new String("123"); System.out.println(s1); //新開闢一塊內存存放“abc”,s1 指向 “abc” , 但是原先 “123” 並沒有改變,在垃圾回收時會進行回收。 s1 = new String("abc"); System.out.println(s1); //StringBuilder 是直接在對象上操作 StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("abc").append("123"); stringBuilder.deleteCharAt(0); System.out.println(stringBuilder); } }

**String 對象用法總結:**

1. 儘可能使用常量 String s = "abc"; ,避免使用變量,如:String a = new String("123");

2. 儘量避免大規模針對String的操作(如連接字符串)操作,因為這樣會頻繁產生內存碎片。這種情況下,建議使用StringBuilder(線程不安全) 和 StringBuffer(線程安全)。如果在單線程下,考慮性能,建議使用StringBuilder。