java的StringBuilder类的长度和容量有什么区别呢?

我看了一下随便一个字符串 长度比容量小一个 有什么意义呢?明明有一个长度了还搞一个容量出来 还有一个setlength是什么意思? 长度还能往回缩么?

阅读 10.6k
3 个回答

可以看看jdk的说明:

capacity
public int capacity()
返回当前容量。容量指可用于最新插入字符的存储量,超过这一容量便需要再次分配。
返回:
当前容量。

setLength
public void setLength(int newLength)
设置字符序列的长度。序列将被更改为一个新的字符序列,新序列的长度由参数指定。对于每个小于 newLength 的非负索引 k,如果 k 小于原字符序列的长度,则新字符序列索引 k 处的字符与原字符序列索引 k 处的字符相同;否则,新字符序列索引 k 处的字符将是 null 字符 'u0000'。换句话说,如果 newLength 参数小于当前长度,则长度将更改为指定的长度。
如果 newLength 参数大于或等于当前长度,则将追加有效的 null 字符 ('u0000'),使长度满足 newLength 参数。
newLength 参数必须大于等于 0。
参数:
newLength - 新长度
抛出:
IndexOutOfBoundsException - 如果 newLength 参数为负。

新手上路,请多包涵

容量是初始化可存储的空间 sb应该是8k的缓存大小。
长度是已经存的东西
集合扩容也是基于长度与容量的关系。比如arraylist的默认初始化容量好像是16 但是你存的东西只有2个,所以长度(size)等于2

StringBuilder是使用char[] value;存储数据的

 @Override
    public int length() {
        return count;
    }
AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }

长度表示的是字符的个数,容量表示的是可用于最新插入字符的存储量。
例如:

StringBuilder sb=new StringBuilder();
sb.append("666");
sb.setLength(2);
System.out.println(sb.length());//追加了长度为3的字符串,count=count+3,所以结果为3
System.out.println(sb.capacity());//调用父类构造器super(16);即是new char[16],所以结果16
String s=sb.toString();
System.out.println(s);
 public void setLength(int newLength) {
        if (newLength < 0)
            throw new StringIndexOutOfBoundsException(newLength);
        ensureCapacityInternal(newLength);

        if (count < newLength) {
            Arrays.fill(value, count, newLength, '\0');
        }

        count = newLength;
    }

执行sb.setLength(2);char[]数组内容没有变化,下标0,1,2还是存储6,6,6
就是把count值设置为2而已,下面调用toString();方法重新构造一个String对象,char数组存储6,6
如果设置sb.setLength(4);构造新的String对象,最后一个补上'0'。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题