浅谈Java集合

171 阅读3分钟

定义:Java的集合类定义在java.util包中,支持泛型,主要提供了3种集合类,包括List,Set和Map。Java集合使用统一的Iterator(迭代器)遍历。 数组也可以看作一种list集合。Collection:它是除Map外所有其他集合类的根接口。

List

定义:List是按索引顺序访问的有序表,它的长度可变,优先使用ArrayList而不是LinkedList,List可以和Array相互转换。

我们来比较一下ArrayList和LinkedList: ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构;

image.png

ArrayList和LinkedList的应用场景如下: ArrayList使用在查询比较多,但是插入和删除比较少的情况,而LinkedList用在查询比较少而插入删除比较多的情况。

Map

定义:Map是一种映射表(哈希表,散列表),可以通过key快速查找value。可以通过for each遍历entrySet()直接获取key-value。最常用的一种Map实现是HashMap。默认情况下Map中不存在重复的key,因为放入相同的key,只会把原有对应的value给替换掉。

HashMap

HashMap实现原理分析:HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。HashMap由数组+链表/红黑树(红黑树java 1.8后)组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,当碰撞导致链表的树形阈(yù)值(TREEIFY_THRESHOLD )大于8且数组长度大于64之后,链表转换为红黑树。

哈希函数:通过计算key得出数组下标,常用的哈希函数设计方法有:直接定址法,数字分析法,折叠法,随机数法和除留余数法。

哈希冲突:key通过哈希函数的计算,得出相同的数组下标,这就是哈希冲突,哈希冲突多就会链表多。HashMap中的链表出现越少性能才会越好。

相关知识点

  • 链表长度低于6,就把红黑树转回链表; (效率原因,低于6没必要用红黑树)
  • AVL树:AVL树是一种高度平衡的二叉树,所以查找的非常高,但是,有利就有弊,AVL树为了维持这种高度的平衡,就要付出更多代价。每次插入、删除都要做调整,复杂、耗时。
  • 红黑树:红黑树是特殊的平衡二叉查找树,但其本身并不是完全平衡的二叉树。红黑树牺牲了一些查找性能 ,因此插入删除操作效率略高于AVL树。每个节点非红即黑,根节点总是黑色的。
  • hashMap中如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找添加等操作很快仅需一次寻址即可;如果定位到的数组包含链表,首先遍历链表,存在即覆盖否则新增;对于查找操作来讲仍需遍历链表然后通过key对象的equals方法逐一比对查找。

Set

定义:一种保证没有重复元素的集合,Set实际上相当于只存储key、不存储值的Map。Set接口并不保证有序,就是遍历出来的顺序,并不是按照添加的顺序。

  • HashSet是无序的,因为它实现了Set接口,并没有实现SortedSet接口;
  • TreeSet是有序的,因为它实现了SortedSet接口。