java——集合框架之Set接口-HashSet类和TreeSet类 | Map接口-HashMap和TreeMap

1.Set接口

java——集合框架之Set接口-HashSet类和TreeSet类 | Map接口-HashMap和TreeMap_第1张图片

1)HashSet

特点:去重,不保证元素顺序

HashSet 底层实现是使用HashMap完成,具有类似的特点
java——集合框架之Set接口-HashSet类和TreeSet类 | Map接口-HashMap和TreeMap_第2张图片
java——集合框架之Set接口-HashSet类和TreeSet类 | Map接口-HashMap和TreeMap_第3张图片

官方类都重写了equals和hashcode方法可以正常比较类的值是否相等,而自定义类没有重写equals和hashcode方法,所以比较是否相等,无法去重;、,若想要去重,必须重写equals和hashcode方法。
java——集合框架之Set接口-HashSet类和TreeSet类 | Map接口-HashMap和TreeMap_第4张图片
java——集合框架之Set接口-HashSet类和TreeSet类 | Map接口-HashMap和TreeMap_第5张图片
java——集合框架之Set接口-HashSet类和TreeSet类 | Map接口-HashMap和TreeMap_第6张图片

使用HashSet集合时的注意事项:
1、应保证元素已经重写hashCode()方法和equals()。
2、如未重写,将会存入重复数据

2)TreeSet

特点:去重,自然排序升序

java——集合框架之Set接口-HashSet类和TreeSet类 | Map接口-HashMap和TreeMap_第7张图片

2.Map接口

java——集合框架之Set接口-HashSet类和TreeSet类 | Map接口-HashMap和TreeMap_第8张图片
java——集合框架之Set接口-HashSet类和TreeSet类 | Map接口-HashMap和TreeMap_第9张图片

Collection集合添加完成元素使用add()、Map集合使用put(); Map集合主要是根据key进行数据维护,很少遍历;
·

1)HashMap

HashMap去重 根据Key是否相同,跟value内容无关;
HashSet与HashMap当数据重复时,保留后添加的数据;
java——集合框架之Set接口-HashSet类和TreeSet类 | Map接口-HashMap和TreeMap_第10张图片
·

HashMap的两种遍历方法

在这里插入图片描述
java——集合框架之Set接口-HashSet类和TreeSet类 | Map接口-HashMap和TreeMap_第11张图片

HashMap分别遍历Key,Value

1)key在这里插入图片描述
2)value
在这里插入图片描述
·

HashMap扩容机制

HashMap默认长度16,永远存不满,每到75%,都会链表扩大当前长度的2倍
java——集合框架之Set接口-HashSet类和TreeSet类 | Map接口-HashMap和TreeMap_第12张图片

当向hashmap集合添加key/val时,会对key 进行hashcode()调用,生成一个哈希值,再使用哈希值(无符号整数) 进行求余操作 16(当前容量)

当再次添加key/val时,再次计算当前key存储位置,有两种可能性:
1、存储位置为空,直接将entry(key/value)
2、哈希冲突问题,多个key求取的hash值相同。

最好情况,不冲突(考验hash()方法,算法要尽可能的减少hash冲突)
java——集合框架之Set接口-HashSet类和TreeSet类 | Map接口-HashMap和TreeMap_第13张图片
java——集合框架之Set接口-HashSet类和TreeSet类 | Map接口-HashMap和TreeMap_第14张图片
JDK1.7之前的存储结构:java——集合框架之Set接口-HashSet类和TreeSet类 | Map接口-HashMap和TreeMap_第15张图片

Jdk1.8的存储结构:java——集合框架之Set接口-HashSet类和TreeSet类 | Map接口-HashMap和TreeMap_第16张图片

当哈希冲突之后,冲突的entry(key)数量>8个,会对该链表数据进行重构(红黑树)

00000010 2
<< >> 移位
2 << 2 00001000 8

<<      :    左移运算符,num <<1,相当于num乘以2
>>      :    右移运算符,num >>1,相当于num除以2

如果以快的速度完成除2操作(乘法)

10 >> 1 5

HashMap实现原理,如何保证HashMap的线程安全?
StringBuffer StringBuilder
HashTable早 HashMap(晚)
自行保证线程安全(线程同步)
·

链表与红黑树的性能比较:
链表:维护数据性能最佳,但查询性能较差。
红黑树:维护数据性能较差,但查询性能最好。

你可能感兴趣的:(java)