String、StringBuffer、StringBuilder区别和联系

String 是字符串常量(线程安全);
StringBuffer(线程安全), StringBuilder(非线程安全) 是字符串变量。

String、StringBuilder、StringBuffer类定义

它们三个类都被final说明这三个都是不可变类。
StringBuilder、StringBuffer这两个类都继承了AbstractStringBuilder。

    public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence

    public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence


    public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence

String、StringBuilder、StringBuffer创建

String类中包含一个不可变的char数组用来存放字符串

    /** 这个value被用于存放char变量 */
    private final char value[];
    public String() {
        this.value = "".value;
    }

StringBuilder和SpringBuffer都使用父类的构造函数进行初始化,

    public StringBuilder() {
        super(16);
    }
    public StringBuffer() {
        super(16);
    }

父类的构造方法,
可以看到和String类的区别是value类没有使用final类去修饰,所以在高并发下对value的操作是不安全的。

    char[] value;
    AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }

String、StringBuilder、StringBuffer的操作

String的添加操作只需要使用+号连接就行
StringBuilder、StringBuffer则需要使用append方法进行操作。
但是String使用+号操作,在jvm进行编译过后也是使用StringBuilder去进行连接操作的。
StringBuilder、StringBuffer他们两的append方法区别就在于StringBuilder没有同步锁,而StringBuffer加了同步锁。
他们同时都是调用父类的方法进行实现。
父类的append类似于Arraylist的add,在超出一定容量之后都是要对value数组进行扩容

    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }

总结

大部分情况下效率StringBuilder > StringBuffer > String
StringBuilder 和 StringBuffer在创建字符串对其进行操作的适合都是使用的统一个对象,而String的value是不可变的数组所以每次需要构造String的适合都是需要new出一个对象,再把这个对象引用过去,效率会很低下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,906评论 18 399
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 5,386评论 0 3
  • 概念: 1、用来处理字符串常用的类有3种:String、StringBuffer和StringBuilder 2、...
    黄培忠阅读 27,778评论 2 19
  • 一个弯腰割油菜的女人 在空旷的原野上 散发着成熟的味道 一把月牙形的镰刀割下去 长满串串籽荚的油菜棵 在她身后 一...
    王春涞阅读 1,781评论 2 6
  • 概述 组织行为学家保罗·赫塞(PaulHersey)和管理学家肯·布兰佳(Ken Blanchard)在20...
    思考的犀牛阅读 4,417评论 0 1