1、哈希结构集合(HashMap,HashSet)
HashSet集合的的底层是用HashMap实现的,其中HashSet中的元素是放在HashMap的key部分的,而HashMap的底层实现数据结构是哈希表,哈希表的结构如图所示:
哈希表是数组+单向链表的集合,拥有了数组和单向链表的共同优点。较新版本的JDK会在哈希表中的单向链表达到一定数量之后,自动转化为红黑树数据结构,数量减少后,又会恢复单向链表的数据结构。
#哈希表是通过hashCode经过哈希函数算法得到一个值,来辨别是否同一个节点的,如果经过哈希函数值相同,则属于同一个节点,否则开辟一个新的节点。其中每一个创建的对象都有一个hashcode,hashcode是通过hash算法利用物理地址得到的,主要用于类似HashMap、Hashtable和HashSet等的哈希集合(散列集合),识别同一节点使用的。
###数据结构逻辑(用HashMap、0节点举例)

| 类型 | 优点 | 缺点 |
|---|---|---|
| 数组 | 随机访问性强,可以通过计算数组下标直接读取数组元素,由于元素的存放地址是连续的,所以查找速度快 | 插入,删除等对数组有结构性改变的操作时,效率较低,而且数组的连续内存需要开辟,所以可能造成内存浪费,对内存要求较高 |
| 链表 | 插入和删除速度相对较快,内存利用率高,很容易拓展 | 不能随机查找,要从第一个开始遍历,所以查询效率较低 |
在使用哈希数据结构的集合时,使用的类对象一定要重写equals和hashCode两个方法。
注意:在单个节点的Entry达到75%时,就会在该节点上将Entry以红黑树的数据结构存储,以提高效率,防止单向链表过长。
2、二叉树集合(TreeMap,TreeSet)
二叉树集合介绍:结构图如下

其中,二叉树是一种排序的数据结构,遵循左小右大的排序规则
TreeSet:public class Test {public static void main(String[] args) {test01 t1 = new test01("c");test01 t2 = new test01("b");test01 t3 = new test01("a");Set<test01> test01s = new TreeSet<>();test01s.add(t1);test01s.add(t2);test01s.add(t3);for (test01 t :test01s){System.out.println(t);}}}class test01 implements Comparable<test01>{private String name;public test01(String name) {this.name = name;}@Overridepublic String toString() {return "test01{" +"name='" + name + '\'' +'}';}@Overridepublic int compareTo(test01 o) {return this.name.compareTo(o.name);}}结果:test01{name='a'}test01{name='b'}test01{name='c'}
TreeMap:
public class Test {public static void main(String[] args) {test01 t1 = new test01("c");test01 t2 = new test01("b");test01 t3 = new test01("a");Map<test01,Integer> test01s = new TreeMap<>();test01s.put(t1,2);//ctest01s.put(t2,4);//btest01s.put(t3,5);//afor (Map.Entry<test01,Integer> node :test01s.entrySet()){System.out.println(node);}}}class test01 implements Comparable<test01>{private String name;public test01(String name) {this.name = name;}@Overridepublic String toString() {return "test01{" +"name='" + name + '\'' +'}';}@Overridepublic int compareTo(test01 o) {return this.name.compareTo(o.name);}}结果:test01{name='a'}=5test01{name='b'}=4test01{name='c'}=2
终极结论:使用二叉树集合时,需要在所用的类中继承Comparable
接口,而且要重写CompareTo方法,this表示当前对象。 3、最终结论:
哈希结构的集合中,HashSet的底层实现是HashMap,HashSet中对象放在HashMap的Key部分,
二叉结构树的集合中,TreeSet的底层实现是TreeMap,TreeSet中对象放在TreeMap的Key部分,
HashSet和TreeSet中的对象都是放在HashMap和TreeMap的Key部分,并通过Key来排序的。4、继承图


