Capacity

在.NET中List的容量应该只是受到硬件限制。

属性Capacity的真正含义,是创建List时给它预分配的容量。

一旦项的数量超过了当前的Capacity,Capacity会以

Capacity = (Capacity==0)?A_VALUE_YOU_CANNOT_SURE:(Capacity*2)

的方式增长。

当使用默认构造函数创建一个List时,Capacity就是0。(或者你非要用一个0作为capacity参数调用构造)

所以当Capacity是0时,我们为List添加了第一个项目后,Capacity是多少呢?

对,是A_VALUE_YOU_CANNOT_SURE

不过,在.NET2.0和.NET4.5中,这个值看上去都是4。

            System.Diagnostics.Debug.WriteLine(string.Format("default capacity is : {0}", new List<string>().Capacity));

            int initCapacity = ;
List<string> l = new List<string>(initCapacity);
System.Diagnostics.Debug.WriteLine(string.Format("constructe a list with capacity: {0}", l.Capacity)); for (int u = ; u < ; ++u)
{
System.Diagnostics.Debug.WriteLine(string.Format("Count: {0}, Capacity: {1}", l.Count, l.Capacity));
//l.TrimExcess();
//System.Diagnostics.Debug.WriteLine(string.Format(" TrimExcess() -> Count: {0}, Capacity: {1}", l.Count, l.Capacity));
l.Add("");
}

输出

default capacity is :
constructe a list with capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:
Count: , Capacity:

TrimExcess()

TrimExcess()的意思就是,如果Capacity大于Count,清掉哪些没有使用的空间。基本上可以理解成让Capacity等于Count,只是基本上,不能信赖这一点。.NET毕竟还要考虑很多性能问题。TrimExcess method does nothing if the list is at more than 90 percent of capacity——这就是.NET的方式。实际上把上面那段代码中的注释放开,就会看到确实存在Capacity和Count不等的情况(然而,并不是90%哟)。Capacity不够以后的增长规则,仍然是*2,并不会因为被Trim过就只是加1。

放开注释后的输出

default capacity is :
constructe a list with capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:

发现并不是90%以后

System.Diagnostics.Debug.WriteLine(string.Format("default capacity is : {0}", new List<string>().Capacity));

int initCapacity = ;
List<string> l = new List<string>(initCapacity);
System.Diagnostics.Debug.WriteLine(string.Format("constructe a list with capacity: {0}", l.Capacity)); int initCount = ;
for (int u = ; u < initCount; ++u)
{
l.Add(u.ToString());
} for (int u = ; u < initCount; ++u)
{
System.Diagnostics.Debug.WriteLine(string.Format("Count: {0}, Capacity: {1}", l.Count, l.Capacity));
l.TrimExcess();
System.Diagnostics.Debug.WriteLine(string.Format(" TrimExcess() -> Count: {0}, Capacity: {1}", l.Count, l.Capacity));
l.Remove(u.ToString());
}

得到

default capacity is :
constructe a list with capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:
Count: , Capacity:
TrimExcess() -> Count: , Capacity:

貌似条件是酱紫的

if( count<(int)Math.Floor((double)capacity*0.9) )

do trim

我也不知道我要干嘛

List的Capacity的更多相关文章

  1. 大数据之Yarn——Capacity调度器概念以及配置

    试想一下,你现在所在的公司有一个hadoop的集群.但是A项目组经常做一些定时的BI报表,B项目组则经常使用一些软件做一些临时需求.那么他们肯定会遇到同时提交任务的场景,这个时候到底如何分配资源满足这 ...

  2. Hadoop Capacity Scheduler源码实现剖析

    作者: 大圆那些事 | 文章可以转载,请以超链接形式标明文章原始出处和作者信息 网址: http://www.cnblogs.com/panfeng412/archive/2013/09/13/had ...

  3. Sizing and Capacity Planning for SharePoint 2013 - Resources

    http://blogs.msdn.com/b/sanjaynarang/archive/2013/04/06/sizing-and-capacity-planning-for-sharepoint- ...

  4. 用了skin皮肤控件之后,报错:容量超出了最大容量 参数名:capacity

    http://blog.csdn.net/keenweiwei/article/details/7403869 用了皮肤控件之后,报错:容量超出了最大容量 参数名:capacity MessageBo ...

  5. Capacity Scheduler 队列设置

    先附一个官网地址 Capacity Scheduler是YARN中默认的资源调度器. 相关参数配置: 资源分配相关参数 ``` (1) capacity:队列的资源容量(百分比). 当系统非常繁忙时, ...

  6. STL:string 大小(Size)和容量(Capacity)

    strings存在三种“大小”: 1.size()和length() 返回string中现在的字符个数.上述两个函数等效. 成员函数empty()用来检验字符数是否为0,亦即字符串是否为空.你应该优先 ...

  7. hdu 1839 Delay Constrained Maximum Capacity Path 二分/最短路

    Delay Constrained Maximum Capacity Path Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu. ...

  8. Web Capacity Analysis Tool 压力测试工具使用笔记

    一.背景介绍 Web Capacity Analysis Tool是微软轻量级Web压力测试工具, 早先是IIS 6.0Resource Tool kit 工具包中的一个组件,现在独立出来有一个社区版 ...

  9. max_size, capacity and size 的区别

    The max_size() function returns the maximum number of elements that the container can hold. The max_ ...

随机推荐

  1. 一、Android屏幕的计量单位

    px  :是屏幕的像素点in   :英寸mm:毫米pt   :磅,1/72英寸dp  :一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1pxdip :等同于dpsp  :同dp ...

  2. Junity测试最大子数列和的Java程序

    1.Java环境的安装与配置: Jdk的安装: Jdk下载链接:http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-13 ...

  3. JAVA 语法基础综合练习——学生成绩管理系统

    代码如下:package com.lovo.manager; import java.util.Scanner; /** * 学生管理 * * @author Administrator * */ p ...

  4. 关于python函数的学习记录

    1.默认参数必须指向不变对象! 2. extra = {'city': 'Beijing', 'job': 'Engineer'}注意kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函 ...

  5. oracle 行转列、列转行

    最近做数据处理,经常遇到需要行转列.列转行的场景,记录个非常简单实用的oracle  列转行.行转的列方法 1.行转列,基础数据如下 做行转列处理 处理SQL select user_name,max ...

  6. cocos2dx 之 android java 与 c++ 互相调用 代码(以百度定位为例子)

    在作cocosdx项目移植到android上时,预见各种头痛问题,今天首先就说说如何在 java 中调用c++ 代码. 这里就用百度定位为例吧,也是我项目中的一小块内容.首先,先百度一下 “百度定位s ...

  7. windows下开启mysql表名大小限制

    找到my.ini文件 在文件中找到 [mysqld]的下面, 看有没有 [mysqld] lower_case_table_names 的设置, 如果没有 添加lower_case_table_nam ...

  8. Web Deploy安装时显示Web Management Service无法启动

      在安装显示如题错误,看了日志: IISWMSVC_STARTUP_UNABLE_TO_READ_CERTIFICATE 无法读取带有指纹"3f60e39108a7e4c54f671b75 ...

  9. 修改hive分区表,在分区列前增加一个字段

    本文主要为了测试,在有数据的分区表中增加新的一个非分区字段后,新数据加入表中是否正常. 原始数据 1;zhangsan 2;zhangsan 3;zhangsan 4;lisi 5;lisi 6;li ...

  10. MCMC: The Metropolis Sampler

    本文主要译自 MCMC: The Metropolis Sampler 正如之前的文章讨论的,我们可以用一个马尔可夫链来对目标分布 \(p(x)\) 进行采样,通常情况下对于很多分布 \(p(x)\) ...