String和StringBuilder的区别详解(源码)

String是Object类的子类。
StringBuilder和StringBuffer同为AbstractStringBuilder的子类,而
AbstractStringBuilder这个抽象类中定义了该参数

char[] value;

回忆一下在String类的源码中是这样定义的;

private final char value[];

两者的区别就在于String中的value[]虽然是final但是该引用指向的内容是可变的,不过String中没有提供更改的接口,所以内容也是不可变的。反观AbstractStringBuilder中的value[]则可以供他人更改。
*StringBuilder(可变字符序列),String(不可变字符序列)

1.内存分析:
举个例子:我们要把1到100的所有数字拼起来,组成一个字符串

StringBuffer sbf = new StringBuffer();
for(int i = 0;i<100;i++)
{
      sbf.append(i);
}

上面使用StringBuffer和append()方法拼接字符串的方法要比下面使用String的方法高效很多。原因就在于,String在jvm中是不可变的下面看起来str改变了是因为创建了多个字符串,且让str指向改变。
这样一来,用String来实现的方法会创建101个对象。远多于StringBuffer。

String str= new String();
for(int i = 0;i<100;i++)
{
      str = str+i;
}

2.动态数组扩容:数组一旦创建它的大小就不可变了。(注:在数组中length是属性,而在String中length()是方法,而在StringBuffer的父类AbstractStringBuilder中也有length方法)那么StringBuffer是如何实现数组扩容的呢?
StringBuffer在扩容时会用super()调用父类的重载构造方法。

public StringBuilder(String str) {
        super(str.length() + 16);
        append(str);
    }

父类AbstractStringBuilder中:

void expandCapacity(int minimumCapacity) {
        int newCapacity = value.length * 2 + 2;
        if (newCapacity - minimumCapacity < 0)
            newCapacity = minimumCapacity;
        if (newCapacity < 0) {
            if (minimumCapacity < 0) // overflow
                throw new OutOfMemoryError();
            newCapacity = Integer.MAX_VALUE;
        }
        value = Arrays.copyOf(value, newCapacity);
    }

先判断是否需要扩容再讲述组扩容成原来的2倍加2。并把原来的数组复制到新数组中去。

3.equals方法的实现重写:
String中重写了equals()方法和hashCode()方法,而StringBuffer并没有重写,所以将StringBuffer类储存进集合类中时会出现问题。

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

推荐阅读更多精彩内容

  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,532评论 0 3
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,806评论 18 399
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,296评论 0 16
  • 走在路上,俩室友在哪儿你一首、我一首唱凤凰传奇的歌。 一室友忘词儿了,也没人再和她逗趣,这时她看见草丛中飞的小鸟,...
    庄园大小姐阅读 181评论 0 0
  • 【转自培宁老师微信】你只看到马背上的女人,却不明白背后的故事!1040年,英国考文垂市的利奥夫里克伯爵迎娶了葛黛瓦...
    汪一一同学阅读 4,629评论 2 0