当前位置: 首页 > 后端技术 > Java

关于HashSet和HashMap

时间:2023-04-02 02:05:01 Java

首先区分一下两者的区别:HashSetHashSet是基于HashMap实现的,HashMap是一个不允许元素重复的集合。HashSet允许空值。HashSet是无序的,即不记录插入顺序。HashSet不是线程安全的,如果多个线程同时尝试修改HashSet,最终结果是不确定的。当多个线程访问时,您必须显式同步对HashSet的并发访问。HashSet实现了Set接口。声明方式为SethashSet=newHashSet()或HashSethashSet=newHashSet()HashMapHashMap是一个哈希表,存储键值对(key-value)映射。HashMap实现Map接口,根据key的HashCode值存储数据,访问速度快,最多允许一条记录key为null,不支持线程同步。HashMap是无序的,即不记录插入顺序。HashMap继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。声明方式为:HashMaphashMap=newHashMap()orMaphashMap=newHashMap()可以看出,如果需求只是查找给定的重复值数据,那么HashSet是一个比较有用的方法。比如Leetcode第217题:给你一个整数数组`nums`。如果任何值在数组中出现**至少两次**,则返回“true”;如果数组中的每个元素都不同,则返回“false”。本题只需要找到数据重复,解决方法如下:classSolution{publicbooleancontainsDuplicate(int[]nums){booleanflag=false;Setocc=newHashSet();intn=nums.length;for(inti=0;iHashSet类常用方法函数方法名addelementHashSet.add()判断是否存在HashSet.contains()删除元素HashSet.remove()计算大小HashSet.size()Iteratefor(Eelement:HashSet)如果需要的target有一对数据,比如坐标、出现次数等映射关系,可以考虑使用HashMap,因为HashMap以(Key,Value)的形式存储数据,可以保存成对的映射关系。比如Leetcode第73题:给定一个mxn矩阵,如果一个元素为0,则将其行和列中的所有元素都设置为0。请使用原地算法。输入:矩阵=[[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]这道题我的思路是先记录每个0的坐标,然后把0赋给行和列。代码如下:classSolution{publicvoidsetZeroes(int[][]matrix){introw=matrix.长度;intcol=矩阵[0].length;int[][]index=newint[row][col];Mapmark=newHashMap();for(inti=0;i的形式存储在HashMap中,首先使用HashMap获取杂志中每个字符出现的次数,然后遍历ransom注意,如果HashMap中包含对于遍历的字符,则次数减1,直到遍历结束或者的引用类型与HashSet一致。常用的HashMap方法:clear()删除hashMap中的所有key/value对clone()复制一份hashMapisEmpty()判断hashMap是否为空size()计算hashMap中的key/值对的数量put()将键/值对添加到hashMap中putAll()将所有键/值对添加到hashMap中putIfAbsent()如果指定不存在于hashMap键,将指定的键/值对插入到hashMap中。remove()删除hashMap中指定key的映射关系containsKey()检查hashMap中是否存在指定key对应的映射关系。containsValue()检查hashMap中是否存在指定值对应的映射关系。replace()替换hashMap中指定键对应的值。replaceAll()用给定函数的结果替换hashMap中的所有映射。get()获取指定key对应的值getOrDefault()获取指定key对应的值,如果找不到key,则返回设置的默认值forEach()对hashMap中的每个map执行指定的操作。entrySet()返回hashMap中所有映射条目的集合视图。keySet()返回hashMap中所有键的集合视图。values()返回hashMap中存在的所有value值。merge()向hashMap中添加键值对compute()重新计算hashMap中指定key的值computeIfAbsent()重新计算hashMap中指定key的值,如果key不存在则添加到hasMap中computeIfPresent()重新计算hashMap中指定键的值,前提是该键存在于hashMap中。小结对于只考虑重复数据的情况,HashSet是一个更好的选择,当重复项需要记录一对数据时使用HashMap。