原理
Array数组是包含n个相同类型的变量,这些变量可以通过索引来访问,在内存中保存的是连续的空间,一但声明变量长度是不可更改的。
int[] array = new int[10];//长度固定,超出长度读取会报错。
ArrayList 你解决array数组不可变的问题,本质上是对array的封装,可以动态改变数组的,他还有添加删除功能,也能通过索引访问,使用比较灵活,它在不变的情况下内存空间是连续的,但是在不同时刻不能期待他不能在同一块内存。.
//这是开源的arrylist构造代码片段,里面new了个object数组
public ArrayList(ICollection c)
{
ArgumentNullException.ThrowIfNull(c);
int count = c.Count;
if (count == 0)
{
_items = Array.Empty<object>();
}
else
{
_items = new object[count];
AddRange(c);
}
}
//感兴趣可以看看源码:
// https://github.com/dotnet/runtime/blob/215b39abf947da7a40b0cb137eab4bceb24ad3e3/src/libraries/System.Private.CoreLib/src/System/Collections/ArrayList.cs
为啥不推荐使用?
由于声明后默认是包含若干个object,可以添加任何类型, 由于类型可以不同,在使用的时频繁的装箱拆箱,不建议使用,如果长度可控,建议使用下标数组,以提高性能。
另外在.NET 2.0微软推出泛型,主要解决固定类型问题,类型固定的用List,而arrayList不固定,List兼容了arrayList添加删除等功能,完美的替代了ArrayList,并且不存在拆箱装箱的问题。
List<T> a=new List<T>();
//List中的T是指定的类型,不存在同一变量下
什么时候合适用ArrayList呢?
当List<Object>可以用ArrayList,List<Object>运行时泛型不存在,List<Object>原理上是不等于ArrayList的。