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

本文深入探讨了Java集合框架中的Set接口,包括HashSet和TreeSet的特点及去重机制。HashSet依赖于HashMap实现,不保证元素顺序,去重依赖于重写equals和hashCode方法。TreeSet则保证元素自然排序且去重。接着,文章转向Map接口的HashMap,讨论了其遍历方式、Key与Value的遍历、扩容机制以及哈希冲突的处理。HashMap的扩容策略是在达到75%负载因子时扩展容量,并采用链表或红黑树解决冲突。最后,文章提及了线程安全与HashMap的关系,以及链表与红黑树在性能上的权衡。
摘要由CSDN通过智能技术生成

1.Set接口

在这里插入图片描述

1)HashSet

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

HashSet 底层实现是使用HashMap完成,具有类似的特点
在这里插入图片描述
在这里插入图片描述

官方类都重写了equals和hashcode方法可以正常比较类的值是否相等,而自定义类没有重写equals和hashcode方法,所以比较是否相等,无法去重;、,若想要去重,必须重写equals和hashcode方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

2)TreeSet

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

在这里插入图片描述

2.Map接口

在这里插入图片描述
在这里插入图片描述

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

1)HashMap

HashMap去重 根据Key是否相同,跟value内容无关;
HashSet与HashMap当数据重复时,保留后添加的数据;
在这里插入图片描述
·

HashMap的两种遍历方法

在这里插入图片描述
在这里插入图片描述

HashMap分别遍历Key,Value

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

HashMap扩容机制

HashMap默认长度16,永远存不满,每到75%,都会链表扩大当前长度的2倍
在这里插入图片描述

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

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

最好情况,不冲突(考验hash()方法,算法要尽可能的减少hash冲突)
在这里插入图片描述
在这里插入图片描述
JDK1.7之前的存储结构:在这里插入图片描述

Jdk1.8的存储结构:在这里插入图片描述

当哈希冲突之后,冲突的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(晚)
自行保证线程安全(线程同步)
·

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值