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。


分享到:


相關文章: