Java中String相关面试题

问题1:简单描述String、StringBuffer、StringBuilder

标准回答:

String是一个final修饰的类,所有的属性也是final的,所以String具有不可变性,也就是对字符串的操作,如拼接、剪切都会产生新的String对象。
StringBuffer本质是一个线程安全的可修饰的字符串序列,因为保证线程安全,所以都会带来额外的性能消耗。
StringBuilder本质上没有区别,但是StringBuilder去掉了线程安全部分提高操作效率。是绝大部分情况下字符串拼接的首选。
如果确定拼接字符串会发生很多次,并且长度可预计,那么可以在开始的时候指定合适的大小,避免数组扩容造成的开销。

问题2: 下面代码创建了几个对象,输出是什么?

String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2) // false

解答:

“abc”是文字池中的对象。new String()时,会将池中的对象复制一份到heap中,并且把heap堆中的应用交给s1.
上述代码中pool中有一个,heap中有两个。s1和s2是引用, == 比较的是内存地址,两个引用指向的是不同的地址,输出false