关于HashSet与HashMap

【关于HashSet与HashMap】首先,区分这两者的区别:
HashSet

  1. HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。
  2. HashSet 允许有 null 值。
  3. HashSet 是无序的,即不会记录插入的顺序。
  4. HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 您必须在多线程访问时显式同步对 HashSet 的并发访问。
  5. HashSet 实现了 Set 接口。
  6. 声明方式为Set hashSet = new HashSet()或HashSet hashSet = new HashSet()
HashMap
  1. HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
  2. HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。
  3. HashMap 是无序的,即不会记录插入的顺序。
  4. HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。
  5. 声明方式为:HashMap hashMap=new HashMap()或Map hashMap=new HashMap()
可以看出,如果需求只是找出给定数据的重复值,那么HashSet是一个比较好用的方法。
比如Leetcode中217题:
给你一个整数数组 `nums` 。如果任一值在数组中出现 **至少两次** ,返回 `true` ;如果数组中每个元素互不相同,返回 `false` 。

本题只需要找数据的重复,题解如下:
class Solution { public boolean containsDuplicate(int[] nums) { boolean flag = false; Set occ = new HashSet(); int n = nums.length; for(int i = 0; i < n; i++) { if(occ.contains(nums[i])) { flag = true; }else { occ.add(nums[i]); } } return flag; } }

将每个元素用HashSet.add参加到哈希集合中,如果HashSet.contains()包含元素,就可以查出重复的元素,通过设置指针等方式可以得到重复元素所在的地址。
HashSet中,基本类型对应的包装类如下:
基本类型包装类
基本类型 引用类型
boolean Boolean
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
string String

HashSet类常用的方法
功能 方法名
添加元素 HashSet.add()
判断是否存在 HashSet.contains()
删除元素 HashSet.remove()
计算大小 HashSet.size()
迭代 for(E element : HashSet)
如果所需目标有一对数据,如坐标、出现次数等映射关系,可以考虑使用HashMap,因为HashMap在储存数据时是以(Key,Value)的形式存储,可以保存成对的映射关系。
如Leetcode中73题:
给定一个 `m x n` 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。

关于HashSet与HashMap
文章图片

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]

该题我的思路是先记录下每个0的坐标,再对行列赋0,代码如下:
class Solution { public void setZeroes(int[][] matrix) { int row=matrix.length; int col=matrix[0].length; int[][] index=new int[row][col]; Map mark=new HashMap(); for(int i=0; i

还有383题:
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。

示例 1:输入:ransomNote = "a", magazine = "b" 输出:false 示例 2:输入:ransomNote = "aa", magazine = "ab" 输出:false 示例 3:输入:ransomNote = "aa", magazine = "aab" 输出:true

该题在使用HashMap时,可以将数据以<字符,次数>的形式存储在HashMap中,先用HashMap得到magezine中每个字符出现次数,再遍历ransomNote,如果HashMap中包含遍历到的字符,就将次数减1,直到遍历结束或者遇到
引用类型与HashSet一致。

HashMap常用方法:
clear() 删除 hashMap 中的所有键/值对
clone() 复制一份 hashMap
isEmpty() 判断 hashMap 是否为空
size() 计算 hashMap 中键/值对的数量
put() 将键/值对添加到 hashMap 中
putAll() 将所有键/值对添加到 hashMap 中
putIfAbsent() 如果 hashMap 中不存在指定的键,则将指定的键/值对插入到 hashMap 中。
remove() 删除 hashMap 中指定键 key 的映射关系
containsKey() 检查 hashMap 中是否存在指定的 key 对应的映射关系。
containsValue() 检查 hashMap 中是否存在指定的 value 对应的映射关系。
replace() 替换 hashMap 中是指定的 key 对应的 value。
replaceAll() 将 hashMap 中的所有映射关系替换成给定的函数所执行的结果。
get() 获取指定 key 对应对 value
getOrDefault() 获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值
forEach() 对 hashMap 中的每个映射执行指定的操作。
entrySet() 返回 hashMap 中所有映射项的集合集合视图。
keySet() 返回 hashMap 中所有 key 组成的集合视图。
values() 返回 hashMap 中存在的所有 value 值。
merge() 添加键值对到 hashMap 中
compute() 对 hashMap 中指定 key 的值进行重新计算
computeIfAbsent() 对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hasMap 中
computeIfPresent() 对 hashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 hashMap 中。
总结
对于只考虑重复数据的情况,HashSet是比较好的选择,而对重复项需要记录一对数据时则选用HashMap。

    推荐阅读