C#中的Array,ArrayList和List

Array:数组的基类,数组在内存中是一块连续的内存地址,在数组声明时便已经分配了地址,在C语言中,我们想要使用数组的话我们需要使用malloc函数来手动分配内存,这也造成了Array的不便,假如我们要向数组中某个位置插入一个元素,其后面的所有元素都需要进行移位,这势必造成操作不便,具体是如何移位可以参考点击此处查看我的这篇文章中关于动态数组的实现(C语言实现)

ArrayList:很少使用的一个类,实际上其是对数组的一个优化与改进,其实现了动态数组,官方的描述是: 使用大小可按需动态增加的数组实现 System.Collections.IList 接口,对于这个IList接口,我们F12进去后发现,里面有一堆我们熟知的方法:Add,Insert,Remove等,这些我们在List中非常常用,实际上ArrayList最让人感到有趣的一点在于其存储元素时我们可以将不同类型的元素全部都放进去,如下列代码所示:

        ArrayList test =new ArrayList();
        int a=123;
        string st= "123";
        test.Add(a);
        test.Add(st);

此时编译器并不会报错,因为ArrayList类实现的IList接口方法Add()实际上参数是object类型,如下图所示:
ArryList中的Add()方法这样做的话有非常有意思了,一个容器中能放多种不同类型的元素,那我们在使用它时很可能造成类型错误,说明了其并不是类型安全的,其次我们要取得其里面的元素或者向其存储元素时,由于其接收的是一个object类型的元素,取出来也是一个object类型的元素,所以势必会进行装箱和拆箱操作,装箱和拆箱操作会极大地损耗性能,所以我们还是尽量少使用ArrayList为妙,这里还有一个有趣的点,ArrayList实际上就是List,没有声明类型的List,让我们来看看java声明List的做法:

List<T> list=new ArrayList<T>();

C#在编写的时候是很多是借鉴了java并优化了java,从上面可以看出实际上List就是定义了储存元素类型后的ArrayList,保证了类型安全,并且不需要进行拆装箱操作,C#可能为了语句的优雅,所以重新定义了类List,这样C#的声明语句就如下:

  List<T> list = new List<T>();

更有了对称美,展现了C#的优雅所在。
List:上面其实已经说到了,其的不同点在于其引入了泛型的概念,所以我们固定化了传入元素类型,保证了线程安全,也去除掉了拆箱与装箱操作,极大地提高了性能,List也成为了我们现在使用的最多最广的数据结构之一。
That’s All.

原创文章 24 获赞 2 访问量 911

猜你喜欢

转载自blog.csdn.net/weixin_43653187/article/details/105993088