梳理Java中关于集合的知识

梳理Java中关于集合的知识

常见接口简介

  1. List 有序、可重复

    ArrayList 查改速度快,初始大小10,扩容一次是原来的1.5倍。

    LinkedList 增删速度快,双向链表结构。

    Vector 线程安全,初始大小10,扩容一次是原来的2倍。其他集合可通过java.util.Collections类的静态方法如synchronizedListsynchronizedSet等实现线程安全。

  2. Set 无序、不可重复

    HashSet 底层就是一个HashMap的实例

    LinkedHashSet 相比于HashSet其保存了记录的插入顺序。

    TreeSet 二叉树排序树

  3. Map

    HashMap key和value允许null值的存在,key不许重复,value允许重复。初始大小是16。

    LinkedHashMap 相比于HashMap其保存了记录的插入顺序。

    TreeMap 实现SortMap接口,可根据key进行排序。不允许key为null,非同步的。

    Hashtable 在JDK1.0版本就已经存在了,线程安全效率较低。

    PropertiesHashtable的子类,常用于加载配置文件。

    ConcurrentHashMap 线程安全,并且锁分离。

为何Map接口不继承Collection接口?

Map是集合框架的一部分,但是Map与List、Set等结构不同,所以无需继承Collection接口。

HashMap是如何工作的?

首先根据hashCode()方法获取hash值,根据hash值计算出在应放置在数据的位置,假如该位置为空,那么直接将其插入;假如该位置不为空,检查其equals(Object obj)方法,如果返回true,将其抛弃,反之插入。hash值若一样,将以链表的形式存放在数组中。

假设hash值计算相同,将以链表的形式存储。JDK7和JDK8有点不同,JDK7是将新的值追加在链表上,JDK8是将链表追加在新的值上。

Collections类是什么?

其位于java.util包下,它是一个工具类,有关于List、Set、Map等操作的静态方法。如:排序、交换、反转、复制、最大值、最小值等。

HashMap在多线程时可能会死循环

在并发情形下,Rehash会造成元素间形成一个循环链表。并发情形下推荐使用 ConcurrentHashMap。