HashMap常用方法:

哈希表的最主要优点是能够在O(1)的时间内查找到某一元素,是效率最高的查找方式,但其缺点是需要额外的空间来实现哈希表

1.添加键值对:map.put()

        HashMap map=new HashMap();
        map.put("zhangsan",1);
        map.put("lisi",2);
        map.put("wangwu",3);

2.通过key得到对应的value值,map.get()

        HashMap map=new HashMap();
        map.put("zhangsan",1);
        map.put("lisi",2);
        map.put("wangwu",3);
        map.get("zhangsan")
        //输出得到数字1

map.get()方法有一个升级版的map.getOrDefault()

如果hashmap里面含有这个key,就正常返回对应的value,此时map.getOrDefault()其实就等价于map.get()

如果hashmap里面没有这个key,就返回map.getOrDefault(key,default)这个default值,但是注意:此时hashmap里面并没有添加进这个键值对,也就是说你下次如果map.get(key),得到的是null

        HashMap map=new HashMap();
        map.put("zhangsan",1);
        map.put("lisi",2);
        map.put("wangwu",3);
        System.out.println(map.getOrDefault("hanmeimei",4));
        //返回4

        System.out.println(map.containsKey("hanmeimei"));
        //返回false,说明"hanmeimei:4"这个键值对确实没有被添加进hashmap里面

        System.out.println(map.get("hanmeimei"));
        //返回null

        System.out.println(map);
        //返回{lisi=2, zhangsan=1, wangwu=3}

注意:map.get()只需传入一个参数:key

而map.getOrDefault()传入两个参数, key和如果不存在这个key返回的数

在leetcode刷题过程中我们经常使用map.put()方法里面嵌套map.getOrDefault()方法来统计数组里面每个数字出现的个数

//nums是一个数组
for(int num:nums)
{
   map.put(num,map.getOrDefault(num,0)+1);
}

这句话的核心就是添加键值对“num:?",也就是map.put(num,?),那么num这个key对应的value到底是多少呢?

?=map.getOrDefault(num,0)+1

也就是说如果num这个数已经是map里面的key了,?=map.get(num)+1

如果num这个数不是map里面的key,这说明是第一次统计num这个数的次数,那么?=0+1=1

不管map.getOrDefault(num,0)返回的是什么数(到底是0还是非0),都要加1

总结:map.put(num,?)

?=map.get(num,0)+1

不管map.getOrDefault(num,0)返回的是什么数(到底是0还是非0),都要加1

3.返回hashmap里面所有key组成的set集合,map.keySet()

        HashMap map=new HashMap();
        map.put("zhangsan",1);
        map.put("lisi",2);
        map.put("wangwu",3);

        System.out.println(map);
        //{lisi=2, zhangsan=1, wangwu=3}
        
        System.out.println(map.keySet());
        //得到一个key组成的set:[lisi, zhangsan, wangwu]

4.判断HashMap中是否含有某个key,返回值是true或者false:map.containsKey()

        HashMap map=new HashMap();
        map.put("zhangsan",1);
        map.put("lisi",2);
        map.put("wangwu",3);

        System.out.println(map.containsKey("zhangsan"));
        //返回true

        System.out.println(map.containsKey("hanmeimei"));
        //返回false

例题1:力扣 169 多数元素

class Solution 
{
    public int majorityElement(int[] nums) 
    {
      HashMap<Integer,Integer>  map=new HashMap();
      //利用hashmap统计出数组中每个元素出现的次数
      for(int a:nums)
      {
          map.put(a,map.getOrDefault(a,0)+1);
      }
      //遍历每一个key,如果出现value大于一半,返回这个key 
      for(int b:map.keySet())
      {
          if(map.get(b)>(nums.length/2))
          {
              return b;
          }
      }
      return 0;
    }
}

例题2 力扣 剑指offer53  在排序数组中查找数字

class Solution 
{
    public int search(int[] nums, int target) 
    {
       HashMap<Integer,Integer>  map=new HashMap();
      //利用hashmap统计出数组中每个元素出现的次数
       for(int a:nums)
       {
          map.put(a,map.getOrDefault(a,0)+1);
       }
       //遍历每一个key
        for(int b:map.keySet())
        {
          if(target==b)
          {
              return map.get(b);
          }
       }
       return 0;
     }
}

例题3 力扣34 在排序数组中查找元素的第一个和最后一个位置

class Solution 
{
    public int[] searchRange(int[] nums, int target) 
    {
       int[] result=new int[2];
       HashMap<Integer,Integer>  map=new HashMap();
      //利用hashmap统计出数组中每个元素出现的次数
       for(int a:nums)
       {
          map.put(a,map.getOrDefault(a,0)+1);
       }
       
       for(int i=0;i<nums.length;i++)
       {
           //如果存在这个target值
           if(nums[i]==target)
           {
               result[0]=i;
               result[1]=i+map.get(target)-1;
               return result;
           }
       }
       result[0]=-1;
       result[1]=-1;
       return result;
     }
}

力扣137 只出现一次的数字||

class Solution 
{
    public int singleNumber(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int x : nums) 
        {
            map.put(x, map.getOrDefault(x, 0) + 1);
        }
        for (int x : map.keySet()) 
        {
            if (map.get(x) == 1) return x;
        }
        return -1;
    }
}

另外TreeMap,内部会对key进行排序:(对key而不是value进行排序)

public class Main 
{
    public static void main(String[] args) 
    {
        Map<String, Integer> map = new TreeMap<>();
        
        map.put("orange", 1);
        map.put("apple", 2);
        map.put("pear", 3);
        
        for (String key : map.keySet()) 
        {
            System.out.println(key);
        }

        // apple, orange, pear
    }
}

力扣1189  气球的最大数量

用hashmap记录字符串中每个字母出现的次数

class Solution 
{
    public int maxNumberOfBalloons(String text) 
    {
        if(text.contains("b")==false||text.contains("a")==false||text.contains("l")==false||text.contains("o")==false||text.contains("n")==false)   return 0;
        
        HashMap<Character,Integer> map=new HashMap();
        for(int i=0;i<text.length();i++)
        {
            char temp=text.charAt(i);
            map.put(temp,map.getOrDefault(temp,0)+1);
        }
        int m=map.get('b');
        int n=map.get('a');
        int x=map.get('l')/2;
        int y=map.get('o')/2;
        int z=map.get('n');


        int result=Integer.MAX_VALUE;
        if(result>m)  result=m;
        if(result>n)  result=n;
        if(result>x)  result=x;
        if(result>y)  result=y;
        if(result>z)  result=z;
        
        return  result;
    }
}

这里要注意如果没有某个字母,那么map.get("b")就等于null,而不是0

力扣49  字母异位词分组

 

class Solution 
{
    public List<List<String>> groupAnagrams(String[] strs)
    {
        //分组,属于同一个字母异位词的字符串放到一组

        //解法:字符串转字符数组,然后再进行排序

        Map<String,List<String>>  map=new HashMap();

        for(String str:strs)
        {
            //将字符串转为字符数组
            char[]  array=str.toCharArray();

            Arrays.sort(array);//比如ate,eat排完就都是aet

            String  key=new  String(array);//又把字符数组转回字符串,此时"aet”就是hashmap里面的key

            if(map.get(key)==null)
            {
                map.put(key,new ArrayList<String>());//这个map非常有意思,key是字符串(比如"aet"),value是一个ArrayList,里面存["ate",”eat“,"tea"]

            }
            map.get(key).add(str);
        }

        //最后返回hashmap的value部分就行
        return   new  ArrayList(map.values());
    }
}

### Java HashMap 常用方法及用法示例 #### 创建HashMap对象 为了使用`HashMap`,首先需要导入`java.util.HashMap`包。接着可以实例化一个`HashMap`对象来存储键值对,其中键和值都可以指定为任何数据类型,在此例子中均为字符串类型。 ```java import java.util.HashMap; public class Main { public static void main(String[] args) { // 创建HashMap对象 HashMap<String, String> hashMap = new HashMap<>(); } } ``` #### 添加元素到HashMap 通过调用`put()`方法向`HashMap`中添加新的键值对。如果给定的键已经存在于映射中,则旧值会被新值替换。 ```java // 向HashMap中添加键值对 hashMap.put("key1", "value1"); hashMap.put("key2", "value2"); ``` #### 获取HashMap中的值 利用`get(Object key)`函数可以根据指定的关键字检索对应的值;若找不到匹配项则返回`null`[^3]。 ```java // 根据键获取对应值 String valueForKey1 = hashMap.get("key1"); // 返回"value1" System.out.println(valueForKey1); ``` #### 删除HashMap条目 要移除某个特定键所关联的映射关系可采用`remove(Object key)`方式实现。 ```java // 移除键为"key2"的记录 hashMap.remove("key2"); ``` #### 判断是否存在某键/值 可以通过`containsKey(Object key)`判断哈希表里是否有指定关键字;而`containsValue(Object value)`则是用来验证是否存在某一具体数值。 ```java boolean hasKey1 = hashMap.containsKey("key1"); // true boolean hasValue1 = hashMap.containsValue("value1"); // true 或 false 取决于当前状态 ``` #### 遍历HashMap 遍历整个集合有多种途径,这里展示一种基于增强型for循环的方式: ```java for (String key : hashMap.keySet()) { System.out.println(key + ": " + hashMap.get(key)); } ``` 或者更简洁地使用entrySet迭代器访问每一对键值组合: ```java for (var entry : hashMap.entrySet()) { System.out.println(entry.getKey() + "->" + entry.getValue()); } ``` #### 清空HashMap 最后,如果有需求清空所有的键值对,只需简单地执行一次`clear()`操作即可。 ```java hashMap.clear(); ``` 以上就是有关Java `HashMap`的一些基本概念及其常见API的应用场景介绍[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值