讲讲数组、List和ArrayList、LinkedList 的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39136928/article/details/82227494

一直以来,我对集合这些东西只是会用,但是不知道为什么这么用,终于在工作中发现了问题,然后深入研究了一下。

问题来源:List<QueryScriptManageEntity> list = new ArrayList<>();

本来我想用的是 List<QueryScriptManageEntity> list = new List<>() 存储数据,结果跟组长提了一下被怼了,我在想为什么被怼了?ArrayList<>();能用, 为啥list()不能用?

然后一点点分析


 数组、List和ArrayList的区别:

  数组在内存中存储数据是连续的,所以它的索引速度非常快。而且赋值或者修改也非常快。如:

string[] s=new string[3];
//赋值
 s[0]="p"; s[1]="m"; s[2]="s";
//修改
 s[1]="p";

不足:在数组俩个数据间插入数据麻烦,声明数组时,还要申明数组的长度,若长度过长会造成内存浪费,长度过短,会造成数据溢出的错误。

ArrayList 正好克服这些缺点,ArrayList是.Net Framework提供的用于数据存储和检索的专用类,它的大小是按照其中存储的数据来动态扩充和收缩的,我们在声明ArrayList对象时并不需要指定它的长度。ArrayList继承了IList接口,所以它可以很方便的进行数据的添加,插入和移除.比如:

ArrayList list = new ArrayList();
//新增数据
 list.Add("abc"); list.Add(123);
//修改数据
 list[2] = 345;
//移除数据
 list.RemoveAt(0);
//插入数据 
list.Insert(0, "hello world"

ArrayList中插入不同类型的数据是允许的。因为ArrayList会把所有插入其中的数据都当作为object类型来处理。这样,在我们使用ArrayList中的数据来处理问题的时候,很可能会报类型不匹配的错误,也就是说ArrayList不是类型安全的。

既使我们保证在插入数据的时候都很小心,都有插入了同一类型的数据,但在使用的时候,我们也需要将它们转化为对应的原类型来处理。这就存在了装箱与拆箱的操作,会带来很大的性能损耗。

  装箱与拆箱的概念: 简单的来讲: 装箱:就是将值类型的数据打包到引用类型的实例中 比如将int类型的值123赋给object对象o

                    int i=123; object o=(object)i;

                  拆箱:就是从引用数据中提取值类型 比如将object对象o的值赋给int类型的变量i

                    object o=123; int i=(int)o;

           装箱与拆箱的过程是很损耗性能的。

  正是因为ArrayList存在不安全类型与装箱拆箱的缺点,所以在C#2.0后出现了泛型的概念。而List类是ArrayList类的泛型等效类。它的大部分用法都与ArrayList相似,因为List类也继承了IList接口。最关键的区别在于,在声明List集合时,我们同时需要为其声明List集合内数据的对象类型。 比如:

List<int> list = new List<int>();
//新增数据
 list.Add(123);
//修改数据 
list[0] = 345;
//移除数据
list.RemoveAt(0);

同时 List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造

List是一个接口,不能实例化对象的。ArrayList是List的实现类,所以可以这样用。实例化的ArrayList对象的引用会自动向上转型为List,这是多态的用法之一

List list;     //正确   list=null; 
List list=new List();    //   是错误的用法

List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。 而ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。 

  List泛型的好处: 
  通过允许指定泛型类或方法操作的特定类型,泛型功能将类型安全的任务从您转移给了编译器。不需要编写代码来检测数据类型是否正确,因为会在编译时强制使用正确的数据类型。减少了类型强制转换的需要和运行时错误的可能性。泛型提供了类型安全但没有增加多个实现的开销。

ArrayList 和 LinkedList 有什么区别。

ArrayList和LinkedList都实现了List接口,有以下的不同点:
1、ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。
2、相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。
3、LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

猜你喜欢

转载自blog.csdn.net/qq_39136928/article/details/82227494