String StringBuilder StringBuffer三者的区别
- String StringBuilder StringBuffer三者的区别这个问题,几乎面试的时候,笔试部分是必须有的
String
- string是不可变的
- String类是由final修饰的
- 底层是一个char类型的final数组,所以说是不可变的,每次字符串相加都会形成一个新的对象
不可变就是指 - 任何对于 String 对象的操作不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。
线程安全性(好处)
- 在并发场景下,多个线程读取同一个资源,是不会引发竟态条件的。只有在对资源进行些操作时才有危险。不可变对象不能被修改,所以是线程安全的。
修改性能不高(坏处)
- 由于 String 的不可变性,每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。
stringBuilder的常规用法
StringBuilder stringBuilder=new StringBuilder(); //实例化对象
for (int i = 0; i < 10; i++) {
stringBuilder.append(i+"==") ; //添加数据
}
System.out.println("添加完之后得到数据:"+stringBuilder.toString());
stringBuilder.setCharAt(0,'c'); //包庇原则修改数据
System.out.println("修改之后得到数据:"+stringBuilder.toString());
stringBuilder.insert(0,"迪迦"); //指定索引添加数据
System.out.println("添加之后得到数据:"+stringBuilder.toString());
stringBuilder.delete(0,2); //按照字符的站位删除数据
System.out.println("删除之后得到数据:"+stringBuilder.toString());
stringBuilder.deleteCharAt(0);
System.out.println("删除之后得到数据:"+stringBuilder.toString());
}
为什么说StringBuffer是线程安全的
- 所有方法是由synchronized修饰的,保障了线程的安全性,但是对比于StringBuilder,速度就没有那么快了
StringBuilder的优势
- StringBuilder没有StringBuffer的线程优势,但是StringBuilder相比于String是不会创建新的对象
- 缺点:线程不安全
- 优点:速度快,添加不会创建于新的对象
总结:
- String StringBuilder StringBuffer对象是final修饰的不可变的
- String 追加数据会创建新的对象
- StringBuffer和StringBuilder 追加数据不会创建新的对象
- StringBuffer所有方法是synchronized修饰,线程是安全的
- StringBuilder 不能保证线程安全,但是速度肯定要比StringBuffer快