Java集合类List,Set,Map梳理

262 阅读2分钟

Java集合是java里非常庞大的一类,他们存放在Java.util包中。从名字‘集合’就可以看出,是以各种方式用来存放各种各样的object们的。集合主要分为三大类: set,list和map。这篇我们只总结list和hash,map因为内容复杂,专门额外用另一篇总结。

List

List是有序的集合。一共有三个实现类:ArrayList,Vector,LinkedList。

ArrayList

最常见的List实现类,内部是通过数组实现的,又名动态数组。允许对元素进行快速随机访问,可以动态添加或者删除元素。每次添加新元素时,ArrayList都会检查是否需要进行扩容操作,默认是原来的50%。

Array 和 ArrayList的不同

Array即数组,他是静态的,一旦初始化后,长度就不能改变了。而动态数组ArrayList可以随时对元素进行增删。所以,当我们不知道有多少个元素时,我们用ArrayList,如果知道有多少个元素,就用Array。

Vector

也是通过数组实现。不同的是,它支持线程的同步,每个时刻只能有一个线程对他进行修改,因此同步花费的时间会使Vector相比较于ArrayList要慢。

LinkList

用链表结构储存数据,适合数据的动态插入和删除,但是因为不支持直接按index查找,所以随机访问和遍历速度慢。而且,因为他有专门定义的操作表头和表尾元素的方法,可以当作堆,栈,队列和双向队列使用。

Set

Set中,值不能重复,对象相等性本质是对象hashcode值判断的。

HashSet

  • 储存元素的顺序并不是按照存入时的顺序,而是按照hash值来存取的。
  • HashSet会首先判断两个元素的hash值,如果hash值一样,就会比较equals方法,如果equals为true,则为同一个元素,反之则为不同元素。
  • 如果存在equals不同而hash值相同的元素,说明这两个元素在同一个hash桶中。

TreeSet

  • 使用二叉树原理对新加入的对象按照指定顺序排序,每次对象更新都会进行重排序。
  • Integer和String对象都可以进行默认排序,而自定义对象需要自己实现Comparable接口,然后覆盖CompareTo()函数,才可以正常使用排序功能。

LinkHashSet

继承了HashSet和LinkedHashMap来实现

HashTable

HashTable是线程安全的,继承自Dictionary类,任一时间只有一个线程能写Hashtable。

Treemap

实现了SortedMap接口,把保存的记录按键排序。