善用集合,提高工作效率

说到集合首先想到的肯定是ArrayList跟LinkedList了,那他们有什么区别跟联系呢:

                           2、善用集合,提高工作效率

接或间接的继承了AbstractList、AbstractCollection、Itrator,同时又实现了List<E>, RandomAccess, Cloneable, Serializable、Collection等接口

 

 

 

  1. RandomAccess接口,并无任何具体的实现,它更像是ArrayList支持随机访问的一个标志
  2. Cloneable接口,以为只ArrayList是支持对象克隆的;同时此处也需要注意浅克隆与深克隆的区别,ArrayList仅支持浅克隆
  3. Serializable接口,也就意味着ArrayList是可序列化的,可如果看源码的话可能会有点疑惑:transient Object[] elementData;transient 关键字意味着elementData不支持序列化,这不就前后矛盾了吗;当然不是,ArrayList实现了自己的序列话方法,即:writeObject、readObject.
  4. Itrator也显示着ArrayList是支持迭代器遍历的,不过就效率来说与for循环无二

LinkedList继承了 AbstractSequentialList、AbstractList、AbstractCollection、Itrator,同时又实现了List<E>, Deque,Queue, Cloneable, Serializable、Collection等接口

  1. linkedlist没有实现RandomAccess接口,说明它不支持随机访问
  2. 也同arraylist一样支持对象的浅克隆与序列化
  3. itrator也显示着linkedlist是支持迭代器遍历的,同时也是最快的遍历方式。

从数据结构特点来看arrayList是基于数组的,linkedlist是基于双端链表的,所以各自的优势显而易见:

    arrayList:查询、修改速度快,修改删除效率差,且容量有限,一旦涉及扩展更会引起数组的整体copy效率较低

    Linkedlist:删除、新增效率较好,查询、修改效率较差,1.7后jdk对其做了优化,将entity换成了Node,并去掉了header,新增了首尾两个节点的留存(first\last),在首尾部的新增将异常的快速,且还有size属性,针对指定位置插入,删除数据,将自动判断位置在前半段还是后半段,选定从后往前遍历,还是从前往后遍历比较迅速定位位置,且定位位置后再执行数据的删除、插入。

看下边测试数据

                                     2、善用集合,提高工作效率

                                2、善用集合,提高工作效率

                                 2、善用集合,提高工作效率

所以说,严格来看arraylist与linkedlist的新增与删除的效率还是要根据位置来决定。不是单纯的就是linkedlist新增与删除较快,这是不准确的

Stream

在jdk8新增了Stream类,java也开始逐步支持函数式编程,话不多说,看图说话:

                         2、善用集合,提高工作效率

                      2、善用集合,提高工作效率

在代码简洁度上确实比for来的好看,但这种方式,感觉会加速头发的脱落速度,烧(哈)脑(哈)。

这个模式有些类似scala的编程方式,分中间过程跟终止过程,同样也是惰性求值,只有遇到终结状态的操作才会按照之前的路线一次求值并获取结果,如果没有终结状态方法,任何中间流程的代码都不会计算。详情可自行百度下。也可参考下图:

2、善用集合,提高工作效率

 

 

 

 

 

相关文章: