美文网首页java基础学习
Array 与ArrayList 与List 的前世今生

Array 与ArrayList 与List 的前世今生

作者: 迷糊银儿 | 来源:发表于2018-12-15 17:50 被阅读7次

一、既生瑜(Array)何生亮(ArrayList)

  • 数组优点
    数组在内存中是连续存储的,所以它的索引速度非常之快,而且赋值与修改元素也很简单。
  • 数组缺点
  1. 数组在声明的时候必须说明它所存储的元素类型与数组的长度,数组的长度过长,会造成内存浪费,数组和长度过短,会造成数据溢出的错误。
  2. 数组在插入、删除元素应用场景下的效率确实差强人意。

基于上述数组的缺点,ArrayList登上历史舞台,Array的缺点也自然而然成了ArrayList的优点

二、ArrayList

  • ArrayList优点
    在声明ArrayList的时候并不需要声明它的长度与存储的元素类型。秘密在这里:
    1. 容量可动态增长
    2. ArrayList存入对象时,抛弃类型信息,所有对象屏蔽为Object,编译时不检查类型,但是运行时会报错。
  • ArrayList缺点
    数组扩容是对ArrayList效率影响比较大的一个因素。
    每当执行Add、AddRange、Insert、InsertRange等添加元素的方法,都会检查内部数组的容量是否不够了,如果是,它就会以当前容量的两倍来重新构建一个数组,将旧元素Copy到新数组中,然后丢弃旧数组,在这个临界点的扩容操作,应该来说是比较影响效率的。

使用建议

基于效率和类型检验,应尽可能使用Array,无法确定数组大小时才使用ArrayList!

三、关List什么事

  • ArrayList的硬伤
    1. 我们往ArrayList中插入"abc"与123是没有问题的,因为ArrayList把所有插入其中的元素都当作object类型来处理。这样,在我们使用ArrayList中的数据来处理问题的时候,很可能会报类型不匹配的错误,也就是说ArrayList不是类型安全的。
    2. 我们保证在插入数据的时候都很小心,都有插入了同一类型的数据,但在使用的时候,我们也需要将它们转化为对应的原类型来处理。这就存在了装箱与拆箱的操作,会带来很大的性能损耗。
      装箱与拆箱的概念: 装箱:就是将值类型的数据打包到引用类型的实例中 比如将int类型的值123赋给object对象
      int i=123; object o=(object)i;
      拆箱:就是从引用数据中提取值类型 比如将object对象o的值赋给int类型的变量 object o=123; int i=(int)o;
      装箱与拆箱的过程是很损耗性能的。

基于上述ArrayList的硬伤,又出现了范型的概念。而而List类是ArrayList类的泛型等效类。

四、 List

它的大部分用法都与ArrayList相似,最关键的区别在于,在声明List集合时,我们同时需要为其声明List集合内数据的对象类型。

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

如果我们往List集合中插入string字符"hello world",IDE就会报错,且不能通过编译。这样就避免了前面讲的类型安全问题与装箱拆箱的性能问题了。

  • List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造。
List list;     //正确   list=null; 
List list=new List();    //   是错误的用法

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

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

相关文章

网友评论

    本文标题:Array 与ArrayList 与List 的前世今生

    本文链接:https://www.haomeiwen.com/subject/pomahqtx.html