String
String是Java提供的用来处理字符串相关的一个类,并不是基本数据类型,
在jdk8的源码中可以看出String是final修饰的,就是说String不可以被继承,
底层实现的char数组也是final修饰,表示一个字符串创建以后,是不可以改变的(char指向的内存地址不可变),被存储在字符串常量池中,不可变,不适合频繁进行字符串拼接操作。
StringBuffer
可以看出StringBuffer同样是final修饰的,不同的是,其实现的char数组并没有用final修饰,意味着Stringbuffer对象可以改变;
transient:将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化
在来看StringBuffer的无参构造:
进入StringBuffer的父类
StringBuffer和StringBuilder都继承了AbstractStringBuilder这个抽象类,如果使用无参构造来创建一个StringBuffer对象那么它的初始长度是16;StringBuilder同样,如图:
Stringbuilder
Stringbuilder和StringBuffer的方法几乎一样
区别是,StringBuilder,的效率比StringBuffer的效率高:
StringBuilder:
StringBuffer:
StringBuffer的很多方法都加上了同步关键字,保证线程安全 ,线程安全带来的问题是,效率!
关于可变字符对象的扩容:
将源数组长度左移一位在加二,左移一位相当与乘2,源数组的长度是16,扩容后的数组长度是34;
优化:在创建可变字符串时尽可能给一个符合实际的较大的初始长度,减少底层的数组扩容
使用场景:
1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer