Java里面的StringBuffer剖析

     1.StringBuffer实际上是一个可变的字符串序列,它实现了可变的String,它的内容和长度可以通过调用指定的方法可以改变。并且它是线程安全的,在多线程使用方面。它的主要的两个方法是append(String str)和insert(int index,String str)方法,前面的方法是在字符串的末尾添加,insert是在指定的位置添加。

     2.看下它的构造函数:

  public StringBuffer() {
        super(16);
    }

无参数的构造函数是指定大小为16的可变字符串。

 public StringBuffer(int capacity) {
        super(capacity);
    }

这个是指定大小的可变字符串。

     public StringBuffer(String str) {
        super(str.length() + 16);
        append(str);
    }
这个是把字符串的大小设为str.length+16那么大的长度,并把字符串添加进去。

   3.如果我们添加的内容大小没有超过字符串的size时,那么我们就可以把字符串直接添加进去,当我们的要添加的字符串长度大于可用的空间剩余大小,那么将调用

    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;

这里提下"+"方面的内容。

String str=hello“”;//1

str=str+"world";//2

上面的例子是在运行期间决定字符串"hello"和"world"的连接,根据String的内存分配原理,编译后的字节码等同于以下代码:

String str="hello";//3

StringBuffer temp=new StringBuffer();//4

temp.append(str);//5

temp.append("world");//6

String s=temp.toString();//7

因此,如下代码的执行效率将比前述例子更高。

StringBuffer sb=new StringBuffer();//8

sb.append("hello");//9

sb.append("world");//10

又如:

String s="hello"+"world";//11等同于:

String s="hello world";//12

由此可见:当使用第一条语句的时候,用"+"内存开销较大,因为要用重建一个Sting类的对象,然而我们在第11条使用"+"号在编译期间进行字符串连接,那么它比使用StringBuffer来做的效率更高。所以当我们的字符串需要频繁的增删改时,最好使用StringBuffer;当我们想编译时就把字符串确定的时候最好用String来定义,可以被其他对象共享,还有一点String类最好不要用new来创建,可以直接用String str="wang";这样建的好处是它直接就把它存在字符串缓冲池中,得以共享。String str=new String("wang")这种方式不推荐使用。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值