版权声明:本文为作者原创,转载必须注明出处。
转载请注明出处:https://www.jianshu.com/p/fec3a8c3cc9b
Set:体现集合的概念,无序、唯一性。适合做交、差、并、补的操作
1)HashSet : hashMap实现,基于散列表,存储无序。
判断重复的标准:先hashCode再equals 计算得到的hash值相同的话则会造成散列冲突
2)TreeSet : treeMap 基于排序树,key 有序(升或降):要求存入的元素具备比较大小的能力
3)LinkedHashSet : LinkedHashMap, 值是按插入的顺序有序的输出
add方法:添加的值做为对应map的key,value是 new Object();
List: 有序、可重复的线性结构
1)ArrayList: 动态数组: 通过 System.arraycopy来实现,改查高效。
如果超过当前的数组的存储长度,那么新建一个数组长度为之前长度的1.5倍,
2) LinkedList: 双向链表, 增删高效。
3) Vector: 动态数组 也是通过 System.arraycopy来实现 ,安全性源于方法都加了锁
Map:体现的是函数的概念:若对X中的每个x,按对应法则f,使Y中存在唯一的一个元素y与之对应 , 就称对应法则f是X上的一个函数,记作y=f(x),体现一种映射关系
HashMap:无序输出;
TreeMap: 按Key排序输出;
LinkedHashMap:根据输入的顺序输出;
HashTable和HashMap区别 :
HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行.
HashMap的数据结构
HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快的查询速度主要是因为它是通过计算散列码来决定存储的位置。HashMap中主要是通过key的hashCode来计算hash值的,只要hashCode相同,计算出来的hash值就一样。如果存储的对象对多了,就有可能不同的对象所算出来的hash值是相同的,这就出现了所谓的hash冲突。学过数据结构的同学都知道,解决hash冲突的方法有很多,HashMap底层是通过链表来解决hash冲突的。
图中,紫色部分即代表哈希表,也称为哈希数组,数组的每个元素都是一个单链表的头节点,链表是用来解决冲突的,如果不同的key映射到了数组的同一位置处,就将其放入单链表中。