集合

1. 概述

java中的集合主要指的Collection和Map两个接口大类
主要区别在于Collection是单列集合,Map是键值对的集合
相对于数组而言除了更加强大API使用,还有对通过对数据结构的灵活使用可以更加贴合实际的生产使用

2. Collection

collection接口主要包括两大类ListSet
区别在于List中的元素是可重复,Set中的元素是不可重复的

2.1 List

List 主要有ArrayList,LinkedList,两者之间的主要区别在于数据结构的不同导致的性能的差异性。

2.1.1 ArrayList

ArrayList基于数组来实现

特点:

  1. 查询快,能够根据下标快速定位数据
  2. 插入数据慢,设计到数据的移位等问题。

2.1.2 LinkedList

LinkedList基于链表来实现

特点:

  1. 查询慢,因为不知道数据的具体存放地址
  2. 插入数据块,因为设计到更少的数据迁移

这两个集合特点和区别也非常鲜明,主要是数组和链式来决定的。

数组实际是一个整齐排放的数据结构,所以当你知道数据的下标,便能直接获取数据。如果不知道下标,其实查询效率和链表也没什么区别了。而当你插入数据的时候,除非插入到坐标尾部,否则都会涉及到数据的迁移以保证其规则性(如果数组满了,申请扩容也会迁移)

链表 相对于数组也比较清晰了。实际每个数据体都存放了上个节点和下个节点的地址,所以查询会慢,而对数据的插入基本不会涉及数据的迁移,所以插入效率会比较高

2.2 Set

Set 主要使用的HashSet,LinkedHashSet,TreeSet

2.2.1 HashSet,LinkedHashSet

其中HashSetLinkHashSet在了解HashMap后会比较好理解,因为他的底层也是实际利用HashMapLinkHashMap来实现的

HashSet利用HashMap的key的唯一性来实现HashSet

LinkedHashSet利用LinkedHashMap的key值唯一性,以及其顺序性来实现

2.2.2 TreeSet

TreeSet底层采用二叉树实现,效率高,元素有序且唯一。如果排序需求可以考虑使用。

3.1 Map

map在实际使用中最典型的可能就是HashMap,也是必须要掌握的,具体可查询另外一篇详细文档!

3.1.1 LinkedHashMap

LinkedHashMap继承了HashMap,和它的区别在于HashMap的存放规则是随机的。而LinkedHashMap在其基础上了做了一个链表的结构。实际就是HashMap.Node<K,V> 有加了一个before和after属性。

LinkedHashMap的使用时,有两种排序规则,一种是按插入排序和访问排序

  • 插入排序: 调用put时来排序,也是默认的
  • 访问排序: 每次get会改变其排序,get的数据会自动到尾部

3.4 Collections

Collections.unmodifiableXXX:collection、List、Set、Map
通过Java自带的工具类来创建一个只读的集合。底层主要是对get操作直接抛出异常来保证其只读行。

Guava.ImmutableXXX:Collection、List、Set、Map
有可以通过GuavaCache下的Immu..包来保证只读性。实现都差不多。