1.String类是不变字符串,StringBuffer类和StringBuilder类是可变字符串,这3种字符串都是16位的Unicode字符序列,并且这3个类都被声明为final类,因此不能被继承。
2.String str = new String("abc")创建实例的过程
首先在堆中(不是常量池)创建一个指定的对象"abc",并让str引用指向该对象;在字符串常量池中查看,是否存在内容为"abc"字符串对象;若存在,则将new出来的字符串对象与字符串常量池中的对象联系起来 ;若不存在,则在字符串常量池中创建一个内容为"abc"的字符串对象,并将堆中的对象与之联系起来。
3.String str = "abc"创建对象的过程
首先在常量池中查找是否存在内容为"abc"字符串对象;如果不存在则在常量池中创建"abc",并让str引用该对象;如果存在则直接让str引用该对象。
4.String str1 = "abc"; String str2 = "ab" + "c"; str1==str2?
true。因为String a="ab"+"c"会在编译时期已经进行优化,等价于String a = "abc";
5.String str1 = "abc"; String str2 = "ab"; String str3 = str2 + "c"; str1==str3?
false。因为String str3 = str2 + "c"涉及到变量(不全是常量)的相加,所以会生成新的对象,其内部实现是先new一个StringBuilder,然后 append(str2),append("c");然后让str3引用toString()返回的对象。
6.StringBuilder与 StringBuffer
StringBuilder:线程非安全的
StringBuffer:线程安全的
当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。
7.对于三者使用的总结: 1.如果要操作不改变的字符串= String
2.单线程操作字符串缓冲区 下操作经常改变的字符串 = StringBuilder
3.多线程操作字符串缓冲区 下操作经常改变的字符串 = StringBuffer