StringBuilder的Length和Capacity属性实践

简介: 几天前的一次笔试中遇到了关于StringBuilder的Length和Capacity属性的问题,之前忽略了。今天实践下: 1.普通实践 官方解释如下: StringBuilder.Capacity:获取或设置可包含在当前实例所分配的内存中的最大字符数。

几天前的一次笔试中遇到了关于StringBuilder的Length和Capacity属性的问题,之前忽略了。今天实践下:

1.普通实践

官方解释如下:

StringBuilder.Capacity:获取或设置可包含在当前实例所分配的内存中的最大字符数。

StringBuilder.Length:获取或设置当前 StringBuilder 对象的长度。

    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder("0123456789");//长度为10
            Console.WriteLine("sb.Length:" + sb.Length + " sb.Capacity:" + sb.Capacity);
            Console.ReadKey();
        }
    }

输出结果为:10 16

这里可以说明StringBuilder的Capacity最小分配的长度是16.当初始化一个长度为17的字符串时,如StringBuilder sb = new StringBuilder("01234567891234567"),

显示的是17。

2.文艺实践

在代码里面更改Length的值,这时在看看它们的值各是多少。代码如下:

    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder("0123456789");//10
            sb.Length = 6;
            sb.Append("012345678");//9
            Console.WriteLine("sb.Length:" + sb.Length + " sb.Capacity:" + sb.Capacity+"  "+sb.ToString());
            Console.ReadKey();
        }
    }

输出结果为:

可以知道:当我们显示的更改了Length的值以后,字符串前面的部分保留,后面的丢弃了。最终的Length值为15,这时仍然小于16,所以Capacity为16。更改下代码:

 sb.Append("012345678910");在前面的基础上增加这里的长度到12位。这时输出结果为:Length为18,Capacity为32。说明Capacity是以16的倍数增长。

如果显示的更改Capacity的值会怎么样?

    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder("0123456789");//10
            sb.Length = 6;
            sb.Capacity=15;
            sb.Append("012345678910");//长度12
            Console.WriteLine("sb.Length:" + sb.Length + " sb.Capacity:" + sb.Capacity+"  "+sb.ToString());
            Console.ReadKey();
        }
    }

这时输出18,30.因为18超出了这里已经指定的Capacity的值15,成倍增长到30. 所以Capacity增长的基数默认是16,如果有显示指定,则为指定的值。

接着修改下代码,sb.Capacity=8。这样Capacity的2倍都比Length小,这时输出的结果为:18,18. 这里并不是在Capacity的初值8的基础上成倍增加。

3.2B实践

 其实从上面的实践可以看出,Capacity的大小分配是在满足Length的情况下,尽量少占用空间。跟Length和显示指定的Capacity大小有关系。

    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder("0123456789");//10
            sb.Length = 6;
            sb.Capacity=5;
            sb.Append("012345678910");//长度12
            Console.WriteLine("sb.Length:" + sb.Length + " sb.Capacity:" + sb.Capacity+"  "+sb.ToString());
            Console.ReadKey();
        }
    }

当Capacity小于Length时,会抛出异常System.ArgumentOutOfRangeException.

 

相关文章
|
1月前
|
C++ 容器
c++ STL 之 vector 的 capacity 和 size 属性区别
c++ STL 之 vector 的 capacity 和 size 属性区别
33 0
|
3月前
|
存储 人工智能 Oracle
initialCapacity
initialCapacity是Java中的一个概念,指的是类初始化时分配的内存大小。在Java中,当创建一个对象时,会根据该对象的类型和需要存储的数据量来分配一定大小的内存空间。这个大小就是initialCapacity。initialCapacity可以通过构造函数或静态代码块来设置。
31 2
|
3月前
|
网络协议 算法 Java
记录一道算法题-split和Integer.parseInt()
记录一道算法题-split和Integer.parseInt()
22 0
|
前端开发
前端学习案例-arr.map(parseInt)没有参数1
前端学习案例-arr.map(parseInt)没有参数1
61 0
前端学习案例-arr.map(parseInt)没有参数1
|
前端开发 索引
复习下 [1,2,3].map(parseInt)
今天继续来聊一个面试题,平时上班太忙的同学可以活动活动脑子。 这个题目只有一行代码,但是知识点不只一个。 当然我们的目的不在于做题,而在于解题的过程。 通过一步一步的分析,得出合理的答案。
81 0
复习下 [1,2,3].map(parseInt)
|
前端开发 JavaScript 索引
关于面试题:[1, 2, 3].map(parseInt)问题的剖析
最近有小伙伴在公号中咨询了胡哥这道面试题,窃以为是比较有意思的一道面试题,于此分享给各位小伙伴。先把答案给了各位,和你理解的一样吗?!
104 0
|
存储 缓存 NoSQL
Java 8 ArrayList hugeCapacity 函数与 MAX_ARRAY_SIZE
Java 8 ArrayList hugeCapacity 函数与 MAX_ARRAY_SIZE
337 0
Java 8 ArrayList hugeCapacity 函数与 MAX_ARRAY_SIZE