String、StringBuffer和StringBuilder

String 继承于CharSequence,也就是说String也是CharSequence类型。StringBuffer和StringBuilder也实现了CharSequence接口。(CharSequence就是字符序列,String, StringBuilder和StringBuffer本质上都是通过字符数组实现的!)


      String str = new String(“jack”) 该语句会创建两个对象,首先会先检查字符串常量池中存不存在jack这个字符串对象,如果不存在就会创建,如果存在就返回内存地址值。创建了出来之后,new String这个语句就会在堆内存中开辟一个字符串对象。总共两个对象。


1.CharSequence源码(基于jdk1.7)

package java.lang;

public interface CharSequence {

    int length();

    char charAt(int index);

    CharSequence subSequence(int start, int end);

    public String toString();
}


2.StringBuilder和StringBuffer的异同


StringBuilder和StringBuffer都是可变的字符序列。它们都继承于AbstractStringBuilder,实现了CharSequence接口。默认缓冲区的容量是16。

StringBuffer所有的缓冲区操作方法都是同步的,线程安全但效率很低。StringBuilder 是JDK1.5之后提出的,线程不安全,但是效率要高。


3.扩容

/**
     * This implements the expansion semantics of ensureCapacity with no
     * size check or synchronization.
     */
    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;当然最大长度是  2 31 -1(JVM 内存够用下)。


集合中也有类似情况,ArrayList 和LinkedList也有默认值10 ,也有扩容算法采用的是右偏移1 + 原有长度  ,也就是变为1.5倍大小 ,如果不够用的话,就直接扩充到需要的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值