1         void Test1()
{
ArrayList arrayList = new ArrayList();
int length = ;
for (int i = ; i < length; i++)
{
arrayList.Add("TestData");
}
Console.WriteLine("count = " + arrayList.Count);
Console.WriteLine("capacity = " + arrayList.Capacity);
}
          static void Main(string[] args)
{
Test t = new Test();
t.Test1();
Console.ReadKey();
}

新建一个Test 类,添加一个方法Test1(),添加如上代码,在main方法中调用。

输出结果为:count = 3

      capacity = 4

如果length = 0,输出结果为

      count = 0

      capacity = 0

如果length = 1,输出结果为

      count = 1

      capacity = 4

如果length = 4,输出结果为

      count = 4

      capacity = 4

如果length = 5,输出结果

      count = 5

      capacity = 8

先介绍下ArrayList的两个字段就不难理解为什么会输出这样的结果。

Count字段含义为动态数组的实际长度,Capacity含义为动态数组的实际容量,这两个字段的含义是不同的。我们借助反编译工具来一探究竟。

public virtual int Add(object value)
{
if (this._size == this._items.Length)   //如果长度和容量相等,则调用EnsureCapacity方法       
{
this.EnsureCapacity(this._size + );
}
this._items[this._size] = value;
this._version++;
int num = this._size;
this._size = num + ;            //否则长度+1,容量不变
return num;
}

这是ArrayList源码中的Add方法,_size相当于count,  _items.Length相当于Capacity.我们把注意力放在这一行代码:

 this.EnsureCapacity(this._size + 1);
 private void EnsureCapacity(int min)
{
if (this._items.Length < min)
{
int num = (this._items.Length == ) ? : (this._items.Length * );
if (num > 0x7fefffff)
{
num = 0x7fefffff;
}
if (num < min)
{
num = min;
}
this.Capacity = num;
}
}

把注意力放在第5行发现,如果容量为0,则设置为4,否则翻倍。

以上就是动态数组ArrayList自动扩容原理。

C#深入研究ArrayList动态数组自动扩容原理的更多相关文章

  1. ArrayList类源码解析——ArrayList动态数组的实现细节(基于JDK8)

    一.基本概念 ArrayList是一个可以添加对象元素,并进行元素的修改查询删除等操作的容器类.ArrayList底层是由数组实现的,所以和数组一样可以根据索引对容器对象所包含的元素进行快速随机的查询 ...

  2. JAVA数据结构--ArrayList动态数组

    在计算机科学中,动态数组,可扩展数组,可调整数组,动态表,可变数组或数组列表是一种随机存取可变大小列表数据结构,允许添加或删除元素.它提供许多现代主流编程语言的标准库.动态数组克服了静态数组的限制,静 ...

  3. ArrayList动态数组System.Collections命名空间下

    using System.Collections; namespace myspace { class myclass { ArrayList myList=new ArrayList(); } }

  4. C#动态数组ArrayList和List<T>的比较

    C#中一维动态数组(即列表)分ArrayList和List<T>两种,其容量可随着我们的需要自动进行扩充 一.ArrayList类(少用) ArrayList位于System.Collec ...

  5. 算法入门 - 动态数组的实现(Java版本)

    静态数组 Java中最基本的数组大家肯定不会陌生: int[] array = new int[6]; for (int i = 0; i < array.length; i++){ array ...

  6. 【数组】- ArrayList自动扩容机制

    不同的JDK版本的扩容机制可能有差异 实验环境:JDK1.8 扩容机制: 当向ArrayList中添加元素的时候,ArrayList如果要满足新元素的存储超过ArrayList存储新元素前的存储能力, ...

  7. Arraylist动态扩容详解

    ArrayList 概述 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长. ArrayList不是线程安全的,只能用在单线程环境下. 实现了Serializable接口,因此它支 ...

  8. Java ArrayList自动扩容机制

    动态扩容 1.add(E e)方法中 ①  ensureCapacityInternal(size+1),确保内部容量,size是添加前数组内元素的数量 ②  elementData[size++] ...

  9. ArrayList源码解析(二)自动扩容机制与add操作

    本篇主要分析ArrayList的自动扩容机制,add和remove的相关方法. 作为一个list,add和remove操作自然是必须的. 前面说过,ArrayList底层是使用Object数组实现的. ...

随机推荐

  1. JDBC---Mysql(2)

    SQL注入攻击: 用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想知道的数据,这就是所谓的SQL注入攻击, 例如:判断username='a' or 'a'='a';  true从而为 ...

  2. oracle基本命令笔记

    最近由于工作原因,再次接触oracle,因此重新来熟知下oracle基本的命令. --改密码 1.运行——键入“cmd” 回车2.键入“sqlplus/nolog” 回车3.键入“conn/as sy ...

  3. vue中watch的详细用法

    在vue中,使用watch来响应数据的变化.watch的用法大致有三种.下面代码是watch的一种简单的用法: <input type="text" v-model=&quo ...

  4. 【PyQt5-Qt Designer】工具箱(QToolBox)控件的使用

    工具箱(QToolBox)+toolButton+tabWidget 总体介绍 QToolBox类提供了一列选项卡的小部件(选项卡内含项目). 工具箱是一个小部件,它将选项卡一个一个的显示,当前项目显 ...

  5. 教你使用SQL数据库复制系列(1-7)

    SQL Server 复制系列(文章索引) 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 前言(Introduction) 复制逻辑结构图(Construction) ...

  6. Linux发展历程

    阅读内容 一.linux基础 二.linux发展史 三.linux图形界面 回到顶部 一.linux基础 1.操作系统的分类 1.1 Windows 系统 优点:Windows 用户群体大:应用软件多 ...

  7. 工具篇-Mac上搭建本地svn服务器以及使用Cornerstone进行本地版本控制

    1.在桌面上见一个文件夹命名为svn,然后打开终端: 创建一个mycode仓库:svnadmin create /Users/gaoyizhen736(自己的mac的用户名)/Desktop/svn/ ...

  8. golang 的 TUI 及 GUI 库

    interactive prompt library: abiosoft/ishell                           https://github.com/abiosoft/is ...

  9. Python 全栈开发七 面向对象

    一.编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式 ...

  10. Spring Hibernate Transaction示例

    JDBCDAO.java package com.bf; import java.sql.ResultSet; import java.sql.SQLException; import java.ut ...