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#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. ...
随机推荐
- html-webpack-plugin 中使用 title选项设置模版中的值无效
原文地址:https://segmentfault.com/q/1010000004555431 webpack.config.js配置: var webpack = require("we ...
- html5实现进度条功能效果非常和谐
1. [图片] html5.jpg 2. [代码][HTML]代码 <script type="text/javascript"> var i = 0; ...
- BZOJ 3624 [Apio2008]免费道路:并查集 + 生成树 + 贪心【恰有k条特殊路径】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3624 题意: 给你一个无向图,n个点,m条边. 有两种边,种类分别用0和1表示. 让你求一 ...
- CF785CAnton and Permutation(分块 动态逆序对)
Anton likes permutations, especially he likes to permute their elements. Note that a permutation of ...
- HDU5875Function(单调队列)
The shorter, the simpler. With this problem, you should be convinced of this truth. You are giv ...
- Python基础入门知识
本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...
- VijosP1443:银河英雄传说
描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集 ...
- 动态库*.so制作
转自:http://www.2cto.com/os/201308/238936.html 在linux下制作动态库*.so. 1.linux下动态库的制作 //so_test.h #include ...
- Haproxy 安装配置详解-端口映射
Haproxy 简介: HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProxy特别适用于那些负载特大的web站点, ...
- Spring boot 2.0 学习
Spring boot 2.0出来了,支持java 9, 好多新特性,应该学习. 待续... ...