What:String,StringBuffer,StringBuilder之间区别是什么?
String 是不可变的字符串,线程安全的
StringBuffer 是可变的字符串,线程安全的
StringBuilder是可变的字符串,线程不安全的。
在大部分情况下,字符串拼接速度为:StringBuilder>StringBuffer>String
How:怎么实现呢?
public class Test1 { public static void main(String[] args) { String string="String"; StringBuffer stringBuffer=new StringBuffer(); stringBuffer.append(string+"Buffer"); StringBuilder stringBuilder=new StringBuilder(); stringBuilder.append(string+"Builder"); System.out.println("String:"+string); System.out.println("StringBuffer:"+stringBuffer); System.out.println("StringBuilder:"+stringBuilder); } }
How:怎么去选择使用String,StringBuffer,StringBuilder?
1.如果要操作少量的数据用 String
2.单线程操作字符串缓冲区 下操作大量数据 StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 StringBuffer
Why:既然有了String,为什么要引入StringBuffer和StringBuilder?
要提高字符串拼接速度:因为字符串拼接速度为:StringBuilder>StringBuffer>String
Why:为什么字符串拼接速度为:StringBuilder>StringBuffer>String?
因为String是不可变的,因此每次对其操作改变其变量值时,都是重新生成一个新的对象,只是把变量引用指向了新对象而已,所以速度是比较慢。
对StringBuffer操作其实是直接操作对象指向的引用,不用产生新的对象,速度很快,是线程安全的,但在多线程时,如果要维护多线程的同步的话,那么速度也会变慢。
StringBuilder是jdk5之后新增的,其用法与StringBuffer是一样的,但它是线程不安全的,所以在单线程中,它的速度是最快的。
Why:String 为什么是不可变的?
看String源码可以知道,其实String存值是一个char[]数组,该数组被final修饰并且设置为private。而final修饰的字段是不可变的。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[];
注:这里说char[]value不可变是指value这个引用不能改变,但数组本身的值是可以改变的
而整个String又被设置为final,所以String是不可变的。
Why:为什么String被设置为final类型?
因为final修饰的类不能被继承,就是要拒绝继承,防止被破坏
why:为什么不要把StringBuffer,StringBuilder应用于HashMap,HashSet?
public class Test2 { public static void main(String[] args) { HashSet<StringBuffer> hashSet=new HashSet<>(); StringBuffer stringBuffer=new StringBuffer("String"); StringBuffer stringBuffer1=new StringBuffer("StringBuffer"); hashSet.add(stringBuffer); hashSet.add(stringBuffer1); System.out.println("第一次输出:"+hashSet); StringBuffer stringBuffer2=stringBuffer; stringBuffer2.append("Builder"); System.out.println("第二次输出:"+hashSet); } }
测试结果:
这就违反了HashSet的唯一性了。
Where:String,StringBuffer,StringBuilder存放在什么地方?
String是存放在常量池的,在编译期已经被确定了。( 常量池其实也就是一个内存空间,不同于使用new关键字创建的对象所在的堆空间)new String()不是字符串常量哦,它有自己的地址空间,存放在堆( new 的对象,数组都放在堆);StringBuffer,StringBuilder都是存放在堆空间的。where:String设置为不可变的好处在哪里?
1.因为String是在常量池的,不可变性可以节省内存空间,提升效率
2.就是在多并发情况下,由于不可变性,所以其对象不能被重写,线程安全。
3.就是为了安全
我的座右铭:不会,我可以学;落后,我可以追赶;跌倒,我可以站起来;我一定行。