HashSet&HashMap

1.HashSet
    底层是哈希表结构 
    不保证存入和取出元素顺序
    没有索引
    去重
哈希表结构特点:
    默认使用的是Object hashCode() 根据对象的地址值计算对应的哈希值
    自定义对象需要重写 hashCode() 根据对象的属性值去计算对应的哈希值
    为什么要 * 31 放大倍数 减少冲突几率
存储流程
    计算该对象的hash值  对象哈希值 & 数组长度 - 1; 算出元素落在数组的第几个索引位置上
1.7版本 hash表底层是 数组 + 链表
    该元素先去对应的索引位去判断是否为null 如果 null 直接存入
    不为null 产生hash冲突 会根据equals()进行值比对 如果不同 存入 并 将原有元素 进行拉链
    如果相同 不存
弊端: 链表过程 遍历性能较低
1.8版本 hash表底层是 数组 + 链表 + 红黑树
    存储元素过程一致 但是 链表长度 > 8 时 会进行树化操作
    树高 < 5 的时候 会退化为链表
常用方法: set集合常用方法
2.Map集合: 是双列集合的顶层接口
    存储的元素 是一对键值对 又称为entry对象
    键唯一 值可以重复
常用方法:
put(key,value) remove(key) containsKey(key) containsValue(value) clear() isEmpty() size()
map集合的两种遍历方式
    双列集合没有自己独有的遍历方式 必须通过方法转换为单列集合间接的使用单例结合的遍历方式进行遍历
    set<key> set = map.keySet()  Object value = map.get(key); 
    map.entrySet() entry.getKey() entry.getValue()
3.HashMap 自定义类型必须重写hashcode() 和 equals()方法 哈希值和是否相等判断的依据为key值与value无关
  TreeMap 排序也是根键值有关 与 value无关
加载因子为什么是0.75?
结合空间利用率和冲突几率算出来的一个值
  第三种遍历方式
  map.foreach((key,value)->sout(key,value));
4.map统计案例: 每次循环需要判断key是否存在于集合之中 如果存在 根据key取出value + 1 再put回去
  如果不存在 直接 put(key,1);
5.可变参数: 系统底层帮我们创建看了一个数组来接收参数
  int...arr   arr为数组名 如果存在多个参数 可变参数必须放在最后
6.创建不可变集合
List.of Set.of Map.of Map.ofEntries(Map.entry(k,v)....)
好处减少书写的行数 减少add的行数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值