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。


分享到:


相關文章: