C# 数组之ArrayList
一、引言
ArrayList类相当于一种高级的动态数组,是Array类的升级版本。
一般的Array,底层是数组实现的,对于数据的查找和修改十分高效。但是有2个大的缺点,其一为增删低效,其二为数组长度时固定的,无法动态增加长度。
与一般的Array相比,ArrayList主要可以动态增加数组的长度。尽管实现了数据增删,但是由于底层还是数组,增删效率还是不高。
二、函数
声明之前需要引用命名空间:using System.Collections
创建:
声明时可指定长度,也可不指定:
ArrayList myList = new ArrayList();
ArrayList myList = new ArrayList(100);
属性:
|
名称 |
说明 |
|
获取或设置 ArrayList 可包含的元素数。 |
|
|
获取 ArrayList 中实际包含的元素数。 |
|
|
获取一个值,该值指示 ArrayList 是否为只读。 |
方法:
|
名称 |
描述 |
|
增加(末尾) |
将对象添加到 ArrayList 的结尾处。 |
|
插入(任意位置) |
将元素插入 ArrayList 的指定索引处。 |
|
全部删除 |
从 ArrayList 中移除所有元素。 |
|
移除(某对象) |
从 ArrayList 中移除特定对象的第一个匹配项。 |
|
移除(某下标) |
移除 ArrayList 的指定索引处的元素。 |
|
RemoveRange(index,count) 移除(一段) |
移除ArrayList中,index开始,长度为count的数据 |
|
克隆 |
创建 ArrayList 的浅表副本。 |
|
复制 |
从目标数组的开头开始,将整个 ArrayList 复制到兼容的一维 Array。 |
|
复制一段 |
复制 ArrayList 中一个子集合的元素。 |
|
Int IndexOf(Object) 查找 |
搜索指定 Object 并返回整个内的第一个匹配项的从零开始索引 ArrayList。 |
|
Bool Contains(Object) 包含 |
确定某元素是否在 ArrayList 中。 |
|
逆序 |
将整个 ArrayList 中元素的顺序反转。 |
|
排序 |
对整个 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的更多相关文章
- (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)
目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...
- C#中数组、ArrayList和List三者的区别
在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢. 数组 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. ...
- C# 数组,ArrayList与List对象的区别
在C#中,当我们想要存储一组对象的时候,就会想到用数组,ArrayList,List这三个对象了.那么这三者到底有什么样的区别呢? 我们先来了解一下数组,因为数组在C#中是最早出现的. 数组 数组有很 ...
- C#中数组、ArrayList和List<T>三者的发展历程
在C#中数组,ArrayList,List使我们用的最多的类型之一.他们共同的作用都是能够存储一组对象. 那么问题来了: (1)为什么要有三个一样作用的东西呢?他们都很完美吗? (2)谁先出生,又是因 ...
- 在Java中怎样把数组转换为ArrayList?
翻译自:How to Convert Array to ArrayList in Java? 本文分析了Stack Overflow上最热门的的一个问题的答案,提问者获得了很多声望点,使得他得到了在S ...
- Java学习笔记51:数组转ArrayList和ArrayList转数组技巧
ArrayList转数组: public class Test { public static void main(String[] args) { List<String> list = ...
- C#中数组,ArrayList与List对象的区别
在C#中,当我们想要存储一组对象的时候,就会想到用数组,ArrayList,List这三个对象了.那么这三者到底有什么样的区别呢? 我们先来了解一下数组,因为数组在C#中是最早出现的. 数组 数组有很 ...
- C# 数组、ArrayList、List、Dictionary的用法与区别
前言 在工作中经常遇到C#数组.ArrayList.List.Dictionary存取数据,但是该选择哪种类型进行存储数据,对于初学者的我一直不知道该怎么取舍.于是抽空好好看了下他们的用法和比较,在这 ...
- 数组,arrayList和List
数组,arrayList和List (1)数组在C#中是最早出现的.它在内存中是连续的存储的,所以索引速度很快,而且赋值与修改元素也很简单.可以利用偏移地址访问元素,时间复杂度为O(1);可以用折半查 ...
- C#中数组、ArrayList和List三者的区别 转
在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢. 数组 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. ...
随机推荐
- 分享知识-快乐自己:Oracle中定义及使用同义词
Oracle 同义词概念: Oracle的同义词(synonyms)从字面上理解就是别名的意思,和视图的功能类似,就是一种映射关系. 它可以节省大量的数据库空间,对不同用户的操作同一张表没有多少差别; ...
- openfire build
1. build path: a) source folder:包括openfire和各插件的代码. b) libraries:build/lib下jar包和插件下jar包,jdk/lib/tools ...
- npm-install camo
camo是针对Node.js和MongoDB的对象模型mapper(object document mapper)(ODM) 可以喝Mongoose ODM互换,但是和其有显著的不同 文章主要关注了M ...
- redis持久化的方式RDB 和 AOF
redis持久化的方式RDB 和 AOF 一.对Redis持久化的探讨与理解 目前Redis持久化的方式有两种: RDB 和 AOF 首先,我们应该明确持久化的数据有什么用,答案是用于重启后的数据恢复 ...
- T57
“期待使我产生了介于幸福与恐惧之间的激动”The anticipation produced in me a sensation somewhat between bliss and fear他猛一下 ...
- 生成0-42之间的7个不重复的int值
public static void main(String[] args) { //set集合存储不重复无序的值 Set<Integer> set = new HashSet<In ...
- java面试题06
题目: 数据库 1. 表名:g_cardapply 字段(字段名/类型/长度): g_applyno varchar 8://申请单号(关键字) g_applydate bigint 8://申请日期 ...
- Mesos和Marathon
libz is required for mesos to build 需要安装zlib-devel-1.2.7-17.el7.x86_64.rpm 其实跨Shell的Profile文件同步只要执 ...
- HL7 ADT Message Sample
http://pixpdqtests.nist.gov:8080/#tests%2Fdriver%2Fversion.htm 可以打开上述连接, 选中version和actor, 然后获取对于samp ...
- Jenkins安装配置简单使用
安装启动是十分简单的,直接去https://jenkins.io/download/下载对应的rpm包就好了,需要注意的是我们的机器上要提前有java环境,相对应要选择你java环境可以支持的jenk ...