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。