String

x33g5p2x  于2021-12-06 转载在 其他  
字(1.1k)|赞(0)|评价(0)|浏览(244)

String不可变性

String 类和其存储数据的成员变量 value 字节数组都是 final 修饰的。对一个 String 对象的任何修改实际上都是创建一个新 String 对象,再引用该对象。只是修改 String 变量引用的对象,没有修改原String 对象的内容。

字符串拼接方式

  1. 直接用 + ,底层用 StringBuilder 实现。只适用小数量,如果在循环中使用 + 拼接,相当于不断创建新的 StringBuilder 对象再转换成 String 对象,效率极差。
  2. 使用 String 的 concat 方法,该方法中使用 Arrays.copyOf 创建一个新的字符数组 buf 并将当前字符串 value 数组的值拷贝到 buf 中,buf 长度 = 当前字符串长度 + 拼接字符串长度。之后调用getChars 方法使用 System.arraycopy 将拼接字符串的值也拷贝到 buf 数组,最后用 buf 作为构造参数 new 一个新的 String 对象返回。效率稍高于直接使用 + 。
  3. 使用 StringBuilder 或 StringBuffer,两者的 append 方法都继承自 AbstractStringBuilder,该方法首先使用 Arrays.copyOf 确定新的字符数组容量,再调用 getChars 方法使用System.arraycopy将新的值追加到数组中。StringBuilder 是 JDK5 引入的,效率高但线程不安全。StringBuffer 使用synchronized 保证线程安全。

三者对比

1.性能对比

三者在执行速度方面的比较:StringBuilder > StringBuffer > String
  为啥字符串是最低的工作效率呢?String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多底。

2.线程安全对比

  • String(大姐,出生于JDK1.0时代) 不可变字符序列
  • StringBuffer(二姐,出生于JDK1.0时代) 线程安全的可变字符序列
  • StringBuilder(小妹,出生于JDK1.5时代) 非线程安全的可变字符序列

3.总结

  • 如果要操作少量的数据用 = String
  • 单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
  • 多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

参考:
http://www.zuidaima.com/blog/3748471954148352.htm
https://blog.csdn.net/itchuxuezhe_yang/article/details/89966303

相关文章