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的行数
HashSet&HashMap
最新推荐文章于 2024-07-23 10:15:00 发布