关于ArrayList

1、什么是ArrayList

ArryList是实现了Icollection和List接口的类,采用数组方式进行数据存放的“动态数组”。可以动态地增加和减少元素,灵活的设置数组的大小。

2、ArrayList的使用及提供的方法

1)构造器

ArrayList提供了三个构造器:

#public ArrayList();

默认的构造器,将会以默认(16)的大小来初始化内部的数组

#public ArrayList(ICollection);

用一个ICollection对象来构造,并将该集合的元素添加到ArrayList

#public ArrayList(int);

用指定的大小来初始化内部的数组

2)IsSynchronized属性和ArrayList.Synchronized方法

IsSynchronized属性指示当前的ArrayList实例是否支持线程同步,而ArrayList.Synchronized静态方法则会返回一个ArrayList的线程同步的封装。

如果使用非线程同步的实例,那么在多线程访问的时候,需要自己手动调用lock来保持线程同步。

3)Count属性和Capacity属性

Count属性是目前ArrayList包含的元素的数量,这个属性是只读的。

Capacity属性是目前ArrayList能够包含的最大数量,可以手动的设置这个属性,但是当设置为小于Count值的时候会引发一个异常。

4)Add、AddRange、Remove、RemoveAt、RemoveRange、Insert、InsertRange

Add方法用于添加一个元素到当前列表的末尾

AddRange方法用于添加一批元素到当前列表的末尾

Remove方法用于删除一个元素,通过元素本身的引用来删除

RemoveAt方法用于删除一个元素,通过索引值来删除

RemoveRange用于删除一批元素,通过指定开始的索引和删除的数量来删除

Insert用于添加一个元素到指定位置,列表后面的元素依次往后移动

InsertRange用于从指定位置开始添加一批元素,列表后面的元素依次往后移动

另外,还有几个类似的方法:

Clear方法用于清除现有所有的元素

Contains方法用来查找某个对象在不在列表之中

5)TrimSize方法

这个方法用于将ArrayList固定到实际元素的大小,当动态数组元素确定不在添加的时候,可以调用这个方法来释放空余的内存。

6)ToArray方法

这个方法把ArrayList的元素Copy到一个新的数组中。

7)ArrayList与数组转换

例1:
ArrayList List = new ArrayList();
List.Add(1);
List.Add(2);
List.Add(3);
Int32[] values = (Int32[])List.ToArray(typeof(Int32));
例2:
ArrayList List = new ArrayList();
List.Add(1);
List.Add(2);
List.Add(3);
Int32[] values = new Int32[List.Count];
List.CopyTo(values);

例3:
ArrayList List = new ArrayList();
List.Add( “string” );
List.Add( 1 );
//往数组中添加不同类型的元素
object[] values = List.ToArray(typeof(object)); //正确
string[] values = (string[])List.ToArray(typeof(string)); //错误
和数组不一样,因为可以转换为Object数组,所以往ArrayList里面添加不同类型的元素是不会出错的,但是当调用ArrayList方法的时候,要么传递所有元素都可以正确转型的类型或者Object类型,否则将会抛出无法转型的异常。 

3、与ArrayList有关的层级关系

            Collection  
├List  
│├LinkedList(链表)
│├ArrayList (动态数组)
│└Vector  
│ └Stack  
└Set 

# Collection:Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。

由Collection接口派生的两个接口是List和Set。

#List接口:List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素。和下面要提到的Set不同,List允许有相同的元素。

   补充:List指的是集合,<>是泛型,里面指定了这个集合中存放的是什么数据

#Set接口:Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。

  补充:Set一个不包含重复元素的容器

# LinkedList类:LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

  补充:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。  链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储  数据元素的数据域,另一个是存储下一个结点地址的指针域。相比于线性表顺序结构,链表比较方便插入和删除操作。

# ArrayList类:ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。

size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。和LinkedList一样,ArrayList也是非同步的(unsynchronized)。

# Vector类:Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。

#Stack类:Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

4、LinkedList与ArrayList的比较

①如果涉及到堆栈,队列等操作,应该考虑用List(集合),对于需要快速插入,删除元素,应该使用LinkedList(链表式存储),如果需要快速随机访问元素,应该使用ArrayList(动态数组式存储)。

②ArrayList的内部实现是基于内部数组Object[], 所以从概念上讲,它更象数组,但LinkedList的内部实现是基于一组连接的记录,所以,它更象一个链表结构,所以,它们在性能上有很大的差别。

 待补充… 

 

 

申明:

本文作者:逍破孩  

未经许可,不得转载。转载请注明出处。

注:新晋菜鸟欢迎大家纠错,讨论。

转载于:https://www.cnblogs.com/xiaopohai97/p/5780241.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值