HashMap 与 HashSet

Set

什么是 Set

Set 内部只存储 key,并且要求 key 是唯一的
在这里插入图片描述

方法

K 是泛型

方法效果返回值
add(K key)添加 如果已经有 返回 false 否则就是 trueboolean flag
remove(K key)移除 如果已经有 返回 false 否则就是 trueboolean flag
contains(K key)判断是否有该数值 如果已经有 返回 false 否则就是 trueboolean flag

以下列代码(HashSet)为例

    public static void main(String[] args) {
        Set<Integer> set = new HashSet<>();
        System.out.println(set.add(1));// 1
        System.out.println(set.add(12));// 2
        System.out.println(set.add(1));// 3
        System.out.println(set);// 4
        System.out.println(set.remove(12));// 5
        System.out.println(set.remove(12));// 6
    }

结果
在这里插入图片描述

过程
在这里插入图片描述

Map

什么是 Map

Map 由两部分组成 : key --> value
其中 key 是唯一的不能重复 ,但是 value 是可以不唯一
所以当对同一个 key 赋予相同的值的时候,就只会保留最后一个值

内部组成(近似)

一个 map 是由多个 Entry 组成,而 一个 Entry 是由 一对 key-value 组成,关系大致如下
在这里插入图片描述

方法

K V 都是泛型

方法效果返回值
get(K key)从中获取对应的值V value
put(K key, V value)添加 如果没有重复 返回 null 重复就返回 被覆盖的值V value
entrySet()获取 entry 的集合类,可以用 forEach 遍历Set<Map.Entry<K, V>> set
keySet()获取 key 的集合类,可以用 forEach 遍历Set< K> set

以下面代码(HashMap)为例

    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        System.out.println(map.put("1", 1)); // 1
        System.out.println(map.put("1", 11));// 2
        System.out.println(map.put("2", 1));// 3
        System.out.println(map);
    }

结果
在这里插入图片描述

它的创建过程如下

在这里插入图片描述

注意

在这里插入图片描述
由上图可知:上面两种方法 entrySet()、keySet() 都可以 用 迭代器遍历,但是 Map 本身却不可以,因为这两种方法返回都是 Set 类型,而 Set 类型是继承 Iterable 但是 Map 是没有继承

Hash(哈希表)

需要知道的概念

名称概念
哈希值通过 hashCode(Object o1…) 来计算,返回一个整数
哈希函数用来计算 哈希地址 的函数,如 哈希值 % 列表长度,要求 简单、尽量使结果分散等
哈希地址类似与列表中的下标,用于访问元素
冲突当它们的哈希地址相同的时候 发生冲突
负载因子元素个数 / 散列表长度 与冲突率相关,一般默认为 0.75

解决冲突

哈希函数都是以 关键字 % 列表长度 为例

1. 线性探测

当该元素对应的哈希地址有元素的时候,就往后找,直到该位置没有元素的时候
以下图为例
在这里插入图片描述

2. 二次探测

当该元素对应的哈希地址有元素的时候,新的地址就按照 (哈希地址 + i ^ 2) % len 的过程排序 。i 从 1 开始
在这里插入图片描述

3. 开散列/哈希桶(重点)

每个哈希地址可以不只存储 1 个元素(以链表或红黑树的方式存储)
当负载因子超出阈值的时候,就扩展并重新排序
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值