哈希表
HashMap
最简单的数据结构是数组和对象(指针)
一切复杂的数据结构都可以基于数组和对象实现
HashMap的底层实现
数组+单向链表/红黑树
HashMap签名上有两个泛型k,v
k是key类型,v是value类型
什么是哈希码和哈希函数
哈希函数:就是一个方法
同一个字符串使用同样的哈希函数计算出来的哈希码必是一样
不同的字符串使用同样的哈希函数计算出来的哈希码大概率是不一样,小概率是一样的
什么是哈希碰撞/哈希冲突
如果两个字符串通过同样的哈希算法计算出来的哈希码是一样的,那称他们发生了哈希碰撞,哈希冲突
怎么解决哈希碰撞/冲突?
1.开放地址法 课后自己看资料
2.拉链法(链地址法)HashMap默认使用的就是这种
链表的缺点
当某一个链表的长度超过阈值8的时候,此时链表转换为红黑树
如何保证集合中元素的唯一性
1.遍历+比较,性能是硬伤
2.通过hash运算,给字符串生成指纹
HashSet类
无序,唯一
HashSet的底层是HashMap
存储在HashSet集合中的元素,实际上是存储在一个HashMap中的key位值
遍历HashMap和HashSet 的几种方式
不可以用普通for循环, 非线性结构不支持用索引号遍历
不可以用增强型for循环
可以forEach循环
可以用迭代器 1.先获取Entry集合,然后再获取Entry集合的迭代器
2.先获取key集合,然后再获取key集合的迭代器
遍历HashSet的几种方式
1.测试唯一性‘
2.测试无序性
3.遍历
HashSet<String> set=new HashSet();
set.add("张飞");
set.add("马超");
set.add("赵云");
set.add("黄忠");
set.add("关羽");
//直接打印
System.out.println(set);
//增强型for
for (String o : set) {
System.out.print(o+" ");
}
//forEach
System.out.println();
set.forEach((key)->{
System.out.print(key+" ");
});
//迭代器
System.out.println();
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.print(iterator.next()+" ");
}