Java中的集合

113 阅读2分钟

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碰撞最小

什么是泊松分布?嗯?自己去看看《概率论》吧!

看下脑图:

image.png

java中的集合分为value(Collection),和key-value(Map)两种;

List 有序,可重复

ArrayList

优点: 底层数据结构是数组,查询快,增删慢。

缺点: 线程不安全,效率高

Vector

优点: 底层数据结构是数组,查询快,增删慢。

缺点: 线程安全,效率低

LinkedList

优点: 底层数据结构是链表,查询慢,增删快。

缺点: 线程不安全,效率高

Set 无序,唯一

HashSet

底层数据结构是哈希表。(无序,唯一)

如何来保证元素唯一性?

1.依赖两个方法:hashCode()和equals()

LinkedHashSet

底层数据结构是链表和哈希表。(FIFO插入有序,唯一)

1.由链表保证元素有序

2.由哈希表保证元素唯一

TreeSet

底层数据结构是红黑树。(唯一,有序)

  1. 如何保证元素排序的呢? 自然排序、 比较器排序

2.如何保证元素唯一性的呢?

根据比较的返回值是否是0来决定