Java 集合详解

/ JavaMapListArray / 没有评论 / 4171浏览

Java 集合详解

收集了几张集合结构图,可对比看:

202032184726-java-collection

202032184848-java-collection-1

集合和数组的区别

202032185135-collectin-array

Collection集合接口的方法

202032185344-collection-interface

常用集合的分类

实现Collection接口的集合

├——-List 接口:元素按进入先后有序保存,可重复
│—————-├ LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
│—————-├ ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
│—————-└ Vector 接口实现类 数组, 同步, 线程安全
│ ———————-└ Stack 是Vector类的实现类
└——-Set 接口: 仅接收一次,不可重复,并做内部排序
├—————-└HashSet 使用hash表(数组)存储元素
│————————└ LinkedHashSet 链表维护元素的插入次序
└ —————-TreeSet 底层实现为二叉树,元素排好序

实现Map接口集合

├———Hashtable 接口实现类, 同步, 线程安全
├———HashMap 接口实现类 ,没有同步, 线程不安全-
│—————–├ LinkedHashMap 双向链表和哈希表实现
│—————–└ WeakHashMap 引用的典型应用,可以作为简单的缓存表解决方案
├ ——–TreeMap 红黑树对所有的key进行排序
└———IdentifyHashMap

List和Set集合详解

list和set的区别

20203219254-list-set-difference

List

2020321957-list-architecture

Set

HashSet

底层数据结构采用哈希表实现,元素无序且唯一,线程不安全,效率高,可以存储null元素,元素的唯一性是靠所存储元素类型是否重写 hashCode()equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。

具体实现唯一性的比较过程:

Hash算法是一种散列算法:

Set hs = new HashSet();
o.hashCode();
o%当前总容量 (0–15)
不发生冲突——–>直接存放
发生冲突
o1.equals(o2)——(false)——-找一个空位添加  
true -> 不添加  

覆盖hashCode()方法的原则:

  1. 一定要让那些我们认为相同的对象返回相同的 hashCode
  2. 尽量让那些我们认为不同的对象返回不同的hashCode值,否则,就会增加冲突的概率。
  3. 尽量的让hashCode值散列开(两值用异或运算可使结果的范围更广)

我们应该为保存到HashSet中的对象覆盖hashCode()和equals(),因为再将对象加入到HashSet中时,会首先调用hashCode方法计算出对象的hash值,接着根据此hash值调用HashMap中的hash方法,得到的值& (length-1)得到该对象在hashMap的transient Entry[] table中的保存位置的索引,接着找到数组中该索引位置保存的对象,并调用equals方法比较这两个对象是否相等,如果相等则不添加。

注意:所以要存入HashSet的集合对象中的自定义类必须覆盖hashCode(),equals()两个方法,才能保证集合中元素不重复。在覆盖equals()和hashCode()方法时, 要使相同对象的hashCode()方法返回相同值,覆盖equals()方法再判断其内容。为了保证效率,所以在覆盖hashCode()方法时, 也要尽量使不同对象尽量返回不同的Hash码值。

如果数组中的元素和要加入的对象的hashCode()返回了相同的Hash值(相同对象),才会用equals()方法来判断两个对象的内容是否相同。

LinkedHashSet

底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。线程不安全,效率高。

TreeSet

小结

List和Set总结

ArrayList与Vector的区别和适用场景

Map详解

Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value。

2020321222156-other-map