Java 中 String、StringBuffer、StringBuilder 三者之间的区别

String, StringBuffer, StringBuilder 区别
  • 可变性
    • String
      • String在类中使用final关键字修饰字符数组来保存字符串
      • 使得String是不可变的
        • private final char value[]
      • 在Java9中String改用为byte数组来保存字符串
        • private final byte[] value
      • 小发现
        • Java的数组定义支持两种格式
          • int[] a Java推荐的格式
          • int a[] 迎合C语言入门习惯
    • StringBuffer
    • StringBuilder
      • StringBuffer 和StringBuilder 继承AbstractStringBuilder
      • AbstractStringBuilder 类中没有使用final关键字修饰字符数组来保存字符串
      • 使得这两个子类是可变的
        • private char value[]
  • 线程安全性
    • 等级
      • 不可变
        • 在java中Immutable(不可变)对象一定是线程安全的,
        • 因为线程的调度和交替执行不会对对象造成任何改变
      • 绝对线程安全
      • 相对线程安全
      • 线程兼容
      • 线程对立
    • String
      • 由于String是不可变的,可以理解为常量,所以线程安全
    • StringBuffer
      • StringBuffer对方法加了同步锁【Synchronized】或者对调用的方法加了同步锁,所以是线程安全
    • StringBuilder
      • StringBuilder没有对方法加同步锁,所以是非线程安全
  • 性能
    • String
      • 每次对String类型进行改变时,都会生成一个新的String对象
      • 并将指针指向新的对象
    • StringBuffer
      • StringBuffer每次改变都是对自身进行操作
      • 不会生成新的对象并改变对象引用
    • StringBuilder
      • 与StringBuffer对比,性能提升10%~15%,但多线程不安全
  • 使用总结
    • String
      • 适合操作少量的数据的情况
    • StringBuffer
      • 多线程操作字符串缓冲区下操作大量数据
    • StringBuilder
      • 单线程操作字符串缓冲区下操作大量数据
 
posted @ 2020-04-24 09:37  littlebob  阅读(151)  评论(0编辑  收藏  举报