赞
踩
C#的list底层原理
C#底层的List用数组实现。
直接在数组的末尾添加元素。时间复杂度n(1)。
3、EnsureCapacity 函数:扩容
假如添加元素时数组空间已满,则扩充一倍。 (会造成空间浪费,且扩容时数组空间越大浪费越多)
使用Remove方法时,先调用Indexof()方法,找到元素对应的下标
IndexOf实际上又调用的是Array.IndexOf()函数
Array.Index通过for循环来遍历数组,找到对应数组下标。时间复杂度O(n)。
找到后通过RemoveAt(index)方法 来删除元素
RemoveAt里面用的是 Array.Copy 来拷贝数组,从index处之后的元素往前移一位。时间复杂度为O(n)线性时间。
insert方法,引用Array.Copy方法, 和java的Copy方法类似
public static void arraycopy(Object src,int srcPos, Object dest,int desPos,int length) 数组拷贝操作
第一个参数默认是src 来源数组 类型为数组
第二个参数默认是srcPos 从来源数组开始复制的位置 类型为整行(其实就是下标)
第三个参数默认是dest 目标数组 类型为数组
第四个参数默认是destPos 目标数组接收起始位置类型为整行(其实就是下标)
第五个参数默认是length 复制的长度。
现在给出两个数组:
· 数组A:“1,7,9,11,13,15,17,19:;
· 数组b:“2,4,6,8,10”
两个数组合并为数组c
public class T5 {
public static void main(String[] args) {
int []a = {1,7,9,11,13,15,17,19};
int []b = {2,4,6,8,10};
int []c = new int [a.length+b.length];
System.arraycopy(a, 0, c, 0, a.length);
System.arraycopy(b, 0, c, a.length, b.length);
for (int i = 0; i < c.length; i++) {
System.out.print(c[i]+ " ");
}
}
Clear方法直接将数组size设为0,用GC回收去删除不需要元素
Contain遍历数组,时间复杂度O(n)。
调用的是Array.Sort方法
时间复杂度为O(n logn)快速排序
List 源码用数组实现的,常用接口的时间复杂度为线性时间,多次元素增加,扩容方式为2的指数,如果元素数量有65个,则扩容(64*2)128,造成大量的内存空间的浪费。
没有对多线程做任何的加锁安全处理,无法处理并发情况下_size++ 的执行顺序,因此在多线程使用的时候 要进行加锁等安全处理操作。List 兼容性强,但效率并不高。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。