一、引言

  ArrayList类相当于一种高级的动态数组,是Array类的升级版本。

  一般的Array,底层是数组实现的,对于数据的查找和修改十分高效。但是有2个大的缺点,其一为增删低效,其二为数组长度时固定的,无法动态增加长度。

  与一般的Array相比,ArrayList主要可以动态增加数组的长度。尽管实现了数据增删,但是由于底层还是数组,增删效率还是不高。


二、函数

  声明之前需要引用命名空间:using System.Collections

创建:   

  声明时可指定长度,也可不指定:

  ArrayList myList = new ArrayList();

  ArrayList myList = new ArrayList(100);

 

属性:

名称

说明

Capacity

获取或设置 ArrayList 可包含的元素数。

Count

获取 ArrayList 中实际包含的元素数。

IsReadOnly

获取一个值,该值指示 ArrayList 是否为只读。

方法:

名称

描述

Add(Object)

增加(末尾)

将对象添加到 ArrayList 的结尾处。

Insert(index, Object)

插入(任意位置)

将元素插入 ArrayList 的指定索引处。

Clear()

全部删除

从 ArrayList 中移除所有元素。

Remove(Object)

移除(某对象)

从 ArrayList 中移除特定对象的第一个匹配项。

RemoveAt(index)

移除(某下标)

移除 ArrayList 的指定索引处的元素。

RemoveRange(index,count)

移除(一段)

移除ArrayList中,index开始,长度为count的数据

Clone()

克隆

创建 ArrayList 的浅表副本。

CopyTo(Array)

复制

从目标数组的开头开始,将整个 ArrayList 复制到兼容的一维 Array

SetRange(Int32, ICollection)

复制一段

复制 ArrayList 中一个子集合的元素。

Int IndexOf(Object)

查找

搜索指定 Object 并返回整个内的第一个匹配项的从零开始索引 ArrayList。

Bool Contains(Object)

包含

确定某元素是否在 ArrayList 中。

Reverse()

逆序

将整个 ArrayList 中元素的顺序反转。

Sort()

排序

对整个 ArrayList 中的元素进行排序。

访问:

  ArrayList是数组,因此支持下标直接访问

  ArrayList[index] = value;

遍历:

  因为ArrayList可以存放任意类型的数据,因此遍历的时候,无法指定一种数据类型,因此:

  foreach(Object obj in myList)

           {

                 Console.WritLine(obj);

           }

与数组转换:

  • 如果ArrayList里面,全是同一种类型,比如int,可以如下转换:  

    int[] A = ( int[] )Arrlist.ToArray( typeof(int) );

    或者

    int[] A= new int[Arrlist.Count];

    Arrlist.CopyTo(A);

 
  • 如果ArrayList里面,不一定是同一种类型,可以如下转换:

    object[] A = Arrlist.ToArray();


三、总结

关于数组扩容:

这是对ArrayList效率影响比较大的一个因素。
每当执行Add、AddRange、Insert、InsertRange等添加元素的方法,都会检查内部数组的容量是否不够了,如果是,它就会以当前容量的两倍来重新构建一个数组,将旧元素Copy到新数组中,然后丢弃旧数组,在这个临界点的扩容操作,应该来说是比较影响效率的。

比如,一个可能有200个元素的数据动态添加到一个以默认16个元素大小创建的ArrayList中,将会经过:

16*2*2*2*2 = 256

四次的扩容才会满足最终的要求,那么如果一开始就以:

ArrayList List = new ArrayList( 210 );

的方式创建ArrayList,不仅会减少4次数组创建和Copy的操作,还会减少内存使用。

所以说,正确的预估可能的元素,并且在适当的时候调用TrimSize方法是提高ArrayList使用效率的重要途径。

(1)数组的容量是固定的,而ArrayList的容量可以根据需要自动扩充

(2)ArrayList可以插入任意类型的数据,而数组必须是同一种类型

(3)ArrayList提供将只读和固定大小包装返回到集合的方法,而数组不提供

(4)ArrayList只是一维形式,而数组可以是多维的

(5)因为ArrayList主打动态数组,但是频繁的扩容会影响效率。因此在初始化的时候,就考虑好大概需要N个数据,初始大小比N稍大就好。

(6)不用频繁的使用indexOf、contains等,数组的查找也是遍历,并没有key、value等映射,效率不高。

写在最后的话:

  对于一般的引用类型来说,这部分的影响不是很大,但是对于值类型来说,往ArrayList里面添加和修改元素,都会引起装箱和拆箱的操作,频繁的操作可能会影响一部分效率。但是恰恰对于大多数人,多数的应用都是使用值类型的数组。消除这个影响是没有办法的,除非你不用它,否则就要承担一部分的效率损失,不过这部分的损失不会很大。

C# 数组之ArrayList的更多相关文章

  1. (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)

    目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...

  2. C#中数组、ArrayList和List三者的区别

    在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢. 数组 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. ...

  3. C# 数组,ArrayList与List对象的区别

    在C#中,当我们想要存储一组对象的时候,就会想到用数组,ArrayList,List这三个对象了.那么这三者到底有什么样的区别呢? 我们先来了解一下数组,因为数组在C#中是最早出现的. 数组 数组有很 ...

  4. C#中数组、ArrayList和List<T>三者的发展历程

    在C#中数组,ArrayList,List使我们用的最多的类型之一.他们共同的作用都是能够存储一组对象. 那么问题来了: (1)为什么要有三个一样作用的东西呢?他们都很完美吗? (2)谁先出生,又是因 ...

  5. 在Java中怎样把数组转换为ArrayList?

    翻译自:How to Convert Array to ArrayList in Java? 本文分析了Stack Overflow上最热门的的一个问题的答案,提问者获得了很多声望点,使得他得到了在S ...

  6. Java学习笔记51:数组转ArrayList和ArrayList转数组技巧

    ArrayList转数组: public class Test { public static void main(String[] args) { List<String> list = ...

  7. C#中数组,ArrayList与List对象的区别

    在C#中,当我们想要存储一组对象的时候,就会想到用数组,ArrayList,List这三个对象了.那么这三者到底有什么样的区别呢? 我们先来了解一下数组,因为数组在C#中是最早出现的. 数组 数组有很 ...

  8. C# 数组、ArrayList、List、Dictionary的用法与区别

    前言 在工作中经常遇到C#数组.ArrayList.List.Dictionary存取数据,但是该选择哪种类型进行存储数据,对于初学者的我一直不知道该怎么取舍.于是抽空好好看了下他们的用法和比较,在这 ...

  9. 数组,arrayList和List

    数组,arrayList和List (1)数组在C#中是最早出现的.它在内存中是连续的存储的,所以索引速度很快,而且赋值与修改元素也很简单.可以利用偏移地址访问元素,时间复杂度为O(1);可以用折半查 ...

  10. C#中数组、ArrayList和List三者的区别 转

    在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢. 数组 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. ...

随机推荐

  1. BZOJ 1647 [Usaco2007 Open]Fliptile 翻格子游戏:部分枚举 位运算

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1647 题意: 在一个n*m(1 <= n,m <= 15)的棋盘上,每一个格子 ...

  2. BZOJ 1626 [Usaco2007 Dec]Building Roads 修建道路:kruskal(最小生成树)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1626 题意: 有n个农场,坐标为(x[i],y[i]). 有m条原先就修好的路,连接农场( ...

  3. bzoj 4032 [ HEOI 2015 ] 最短不公共子串 —— 后缀自动机+序列自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 序列自动机其实就是每个位置记录一下某字母后面第一个出现位置,为了子序列能尽量长. 对字 ...

  4. poj3662Telephone Lines——二分+最短路

    题目:http://poj.org/problem?id=3662 二分答案找出符合条件的最小长度: 假设了每个长度后,以这个为标准对每条边赋值,0为小于等于,1为大于,然后按这个值来跑最短路,在看看 ...

  5. tyvj1124花店橱窗——有限制的DP

    题目:http://www.joyoi.cn/problem/tyvj-1124 此题首先注意一束花能往哪些花瓶中放置:原本应放在本位置,但因为有多余花瓶,故可以有些变动,范围在i~i+v-f间: 假 ...

  6. VijosP1595:学校网络(有向图变强连通图)

    描述 一些学校的校园网连接在一个计算机网络上.学校之间存在软件支援协议.每个学校都有它应支援的学校名单(学校a支援学校b,并不表示学校b一定支援学校a).当某校获得一个新软件时,无论是直接得到的还是从 ...

  7. linux 遍历目录+文件(优化版本)

    c++17 filesystem, regex 遍历目录 #include <stdio.h> #include <sys/types.h> #include <dire ...

  8. why std::stack has separate top() and pop()

    SGI explanation: http://www.sgi.com/tech/stl/stack.html One might wonder why pop() returns void, ins ...

  9. SSE优化指令集编译错误: inlining failed in call to always_inline 'xxx': target specific option mismatch xxx

    在用QtCreator编译SSE优化指令的时候,出现了如下错误, inlining failed in call to always_inline '__m128i _mm_packus_epi32( ...

  10. Regex Golf 练习记录

    正则表达式的练习网站:https://alf.nu/RegexGolf 共17道题:只能说从第10题开始就很变态了,就是看看答案好了 .Warmup: foo .Anchors: k$ 或 ick$ ...