StringBuilder,StringBuffer的深入了解

原创 2016年08月31日 10:57:40

StringBuilderStringBuffer 相对于String来说可以被多次修改而不会产生新的对象,而StringBuilderStringBuffer最大的不同就是在于StringBuilder的方法不是线程安全的(不能同步访问)。我们以StringBuilder为例:

StringBuilder可以被多次修改而不会产生新的对象可以从源码分析为什么:

StringBuilder对于变量的修改主要用了方法append(String),以append方法为例来分析:而StringBuilder继承了 AbstractStringBuilder类实现了Serializable, CharSequence,append方法调用了父类AbstractStringBuilderappendappend(String paramString)方法,该方法如下所示:

  public AbstractStringBuilder append(StringparamString)
  {
    if (paramString == null) {
      paramString = "null";
    }
    int i = paramString.length();
    if (i == 0) {
      return this;
    }
    int j = this.count + i;
    if (j > this.value.length) {
      expandCapacity(j);
    }
    paramString.getChars(0, i, this.value,this.count);
    this.count = j;
    return this;
  }


分析代码可以得到当传入的paramString为空的时候直接返回原来的值,如果不为null则获取this.count+ paramString.length()也就是合并的总长度,在判断是否大于以前this字符串的长度,大于调用expandCapacity(j)方法如下:

void expandCapacity(int paramInt)
 {
   int i = (this.value.length + 1) * 2;
   if (i < 0) {
     i = 2147483647;
   } else if (paramInt > i) {
     i = paramInt;
   }
   this.value = Arrays.copyOf(this.value, i);
 }


定义int变量i并赋值为原来字符长度2倍+2,如果长度小于0则将i赋值为int的最大值2^31-1,如果不小于0(一般都不小于0)合并总长度大于原来字符长度+2的话则将i的值变为合并的总长度值,最后调用Arrays.copyOf复制数组并扩建字符数组的长度为i,并赋值赋值给以前的字符串this;此方法的目的就是对以前字符数组进行扩容以此有足够的空间来添加新的字符串且不改变原来的对象还是this

 

接着看上面的append方法调用paramString.getChars(0, i, this.value, this.count)而此方法源码如下:

  

public void getChars(int paramInt1, intparamInt2, char[] paramArrayOfChar, int paramInt3)
  {
    if (paramInt1 < 0) {
      throw newStringIndexOutOfBoundsException(paramInt1);
    }
    if ((paramInt2 < 0) || (paramInt2 >this.count)) {
      throw newStringIndexOutOfBoundsException(paramInt2);
    }
    if (paramInt1 > paramInt2) {
      throw newStringIndexOutOfBoundsException("srcBegin > srcEnd");
    }
    System.arraycopy(this.value, paramInt1,paramArrayOfChar, paramInt3, paramInt2 - paramInt1);
  }

其实就是实现了一个System.arraycopy(src,srcPos, dest, destPos, length)方法,System.arraycopy其实是java的一个调用别的语言的本地接口,它会实现元对象src截取从srcPos位置开始到srcPos+length长度这段对象内容复制到目标对象destdest的放置位置destPos开始赋值的一个复制方法,它也可以自己对自己进行复制赋值,

这是对象内容修改而不改变的关键,我们分析传进来的参数

this.value就是paramString.value(paramString调用的getChars方法此处的this不同上面的this.value)

paramInt1源对象要复制的起始位置为0

paramArrayOfChar为以前的对象this.valuethis.value千万别搞混了)

paramInt3以前对象this的长度count

paramInt2 - paramInt1(也就是i)以前对象this放置的起始位置为ithis的末尾开始

根据上面的参数来看次方发就是将要appendString对象paramString复制并拼接赋值到扩容后的源this对象以此来实现修改对象的append操作并不改变原来的对象

版权声明:本文为博主原创文章,未经博主允许不得转载。

深入底层代码理解java中String、StringBuffer、StringBuilder

java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题。现在总结一下,看看他们的不同与相同。 1.可变...
  • sinat_36705710
  • sinat_36705710
  • 2017年03月21日 13:52
  • 1087

String StringBuilder StringBuffer 对比 总结得非常好

转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论。还是觉得有必要让这个讨厌又很可爱的Stri...
  • clam_clam
  • clam_clam
  • 2011年09月28日 19:00
  • 33230

StringBuilder的用法及String,StringBuffer与StringBuilder的区别

声明:本文大部分内容为参考别人的,自己简单汇总整理了一下。String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全)简要的说,...
  • u011489043
  • u011489043
  • 2017年03月30日 15:33
  • 551

String ,StringBuffer和StringBuilder最佳用法

String  首先我们要明确,String并不是基本数据类型,而是一个对象,并且是不可变的对象。查看源码就会发现String类为final型的(当然也不可被继承),而且通过查看JDK文档会发现...
  • Jo__yang
  • Jo__yang
  • 2016年06月14日 19:56
  • 630

Java中String,StringBuffer,StringBuilder常用方法及使用实例

package stringtest; public class StringOpera { public static void main(String[] args) { Strin...
  • u012768347
  • u012768347
  • 2017年03月12日 16:33
  • 485

String,StringBuffer, StringBuilder类的常用方法

一、String类的常用方法1.获取: 1)获取字符串str长度 int i = str.length(); 2)根据位置(ind...
  • zhao_yu_lei
  • zhao_yu_lei
  • 2017年05月12日 13:38
  • 785

Java常考面试题7 深刻认识String、StringBuilder、StringBuffer

深刻认识String、StringBuilder、StringBuffer
  • HZ_LIZX
  • HZ_LIZX
  • 2017年02月10日 10:22
  • 516

String,StringBuffer,StringBuilder 三者之间的区别是什么?

1.String 字符串产量 2.StringBuffer 字符串变量(线程安全) 3.StringBuilder 字符串变量 (非线程安全) 1.String类型,是java内的对象,...
  • qq_30278639
  • qq_30278639
  • 2016年05月10日 14:09
  • 860

线程安全性——从StringBuffer和StringBuilder的区别说起

面试的时候面试官问到了线程安全的问题,感觉答得不如人意。当时没答好,问面试官如何理解好,他说:可以参照StringBuffer和StringBuilder。于是赶紧回来自行恶补一下。这就是学渣的苦果呀...
  • DJJT10
  • DJJT10
  • 2016年10月19日 20:28
  • 1259

String/StringBuffer/StringBuilder区别

参考:http://blog.csdn.net/rmn190/article/details/1492013 String字符串常量 StringBuffer字符串变量(线程安全) StringBui...
  • pymqq
  • pymqq
  • 2015年07月23日 22:23
  • 602
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:StringBuilder,StringBuffer的深入了解
举报原因:
原因补充:

(最多只允许输入30个字)