我擦,我要放弃了吗,今天才是第六道题啊。不能,现在赶紧补上。
我之前知道:
String,StringBuffer字符串用的还是挺多的, StringBuilder我还是用的比较少。他们之间的区别是什么,string好像都是常量用多了比较消耗内存。像大量需要拼接的字符串就用StringBuffer.StringBulider也是拼接字符串。他们俩之间的区别就是StringBuffer是线程安全的,StringBuilder是线程不安全的。好像我就是知道这么多,至于为什么不安全,我赶紧查查资料去🤦♂️。
一.String
String str = "hi";
public void main(int[] array){
str = str + "zhaolei";
}
这一段代码你知道耗费了多少内存吗? 初始化赋值一次“hi”在内存中开辟了一段,然后"zhaolei"这个字符串又开辟了一个内存。最后组成“hi zhaolei” 开辟了新的一段内存空间。简单的一次拼接字符串耗费了三段内存空间。是极大浪费的,遇到这种我们应该使用stringbuffer或者stringbulider进行拼接字符串。为什么stringbuffer/stringbulider就不耗费内存,他是怎么做的?
二.StringBuffer
可以看到我们最常用的方法,点进去调用了父类的append方法再进去看看!!
进去之后找到这个方法,判断是否为空,然后获取字符串字符。看看 ensureCapacityInternal()做了什么。
这是一个数组的扩容吧。保存value里面。value是个char数组。原来他都保存到一个char数组不是一个string里面了。
so 应该消耗内存比较小吧。
tostring()方法是重新实例了一个字符串对象。而且为什么是线程安全的,看到方法 synchronized关键字修饰。
三.StringBuilder
他也是直接使用了父类的append方法
stringbulider也是一个cha数组,都是一样的诶,他们到底差在哪里了呢❓发现stringbuilder的append()方法是没有带synchronized方法的所以他应该不是线程安全的。
一个可变的字符序列。StringBuilder类提供一个与StringBuffer兼容的API,但不保证同步。该类被设计用作StringBuffer的一个简单替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现种,它比StringBuffer要快。
String:String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间.
StringBuffer:StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量.
StringBulider:与StringBulider兼容只是速度更快,但是线程不安全。