Hash表中的查找是以空间换时间的做法,什么是空间换时间呢?比如你查找10000这个数,它是存在arr[10000]里面,数值的下标值就是它存的内容。这样就就浪费大量的空间换取快速查找。 什么是Hash碰撞呢?比如一个数组长度为13,你要存一个数字15进去,它是这样存的:15%13=2 这个数字15就存在arr[2]这个位置。那么当对13求余等于2的数也都放在a[2]这个位置,这样就产生Hash碰撞,链表也随之而来。
默认加载因子是0.75(数据量/数组容量到 75%),当加载因子到0.75后,新建容量翻倍的新数组,这时所有的数据重新执行哈希运算,放入新数组;
Jdk1.8以后,链表长度到8时,会转变成红黑树,树上的数据减少到6时,会转回链表; HashMap加入红黑树来处理当链表过长导致查询效率低下的问题。
Hashtable 初始容量是11 ,扩容 方式为2N+1;
HashMap 初始容量是16,扩容方式为2N;
加载因子为什么是0.75?
提高空间利用率和减少查询成本的折中,主要是泊松分布,0.75碰撞最小
什么是泊松分布?嗯?自己去看看《概率论》吧!
看下脑图:
java中的集合分为value(Collection),和key-value(Map)两种;
List 有序,可重复
ArrayList
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高
Vector
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低
LinkedList
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高
Set 无序,唯一
HashSet
底层数据结构是哈希表。(无序,唯一)
如何来保证元素唯一性?
1.依赖两个方法:hashCode()和equals()
LinkedHashSet
底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一
TreeSet
底层数据结构是红黑树。(唯一,有序)
- 如何保证元素排序的呢? 自然排序、 比较器排序
2.如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定