zoukankan      html  css  js  c++  java
  • HashMap用法总结

    今天对HashMap进行一个系统总结;

    起因是在leetcode上做两数组之和想起解决思路,用hash去写,发现自己对hash不是很熟悉运用,于是恶补了下

    首先,对hash创建

    HashMap<Integer, String> Sites = new HashMap<Integer, String>();

    其中key-value前面的泛型必须要加上的,后面的泛型是可去可不去,jdk1.8以后官方是推荐去调,不要写滴~

    方法:

          hash.put(key,value)

          hash.size();---------会去掉重复的那个值

          hash.containsKey(key)-------会返回一个布尔型的值判断存不存在

    底层原理:主要是数组加链表,链表链接的是Entry实体,实体中有(key,value,hsahcode,next)next指针是防止有hash冲突可以挂在一起,为防止挂太多采取了一系列措施:比如

    1,约束因子控制在0.75,太大空间利用率太多,冲突就会多,太少就空间十分浪费

    2,利用红黑树,当node节点超过8个·的时候,会构建红黑树(红黑树这个坑过两天来填)

    3,系统自带的扩容机制,其一定是2的倍数,因为是用位移来形成的,扩容的最大是为2^30,默认位置是16

     

    面试考点,为什么底层求hashcode是用位运算而不是咱们讲的逻辑中的h%(length)操作,实际上h&(length-1)是一样的效果但是位运算效率更高;

    5,也正因为底层用的是与运算,hash得是2的倍数(目的:可以有效的减少一定的hash冲突)

    public static void main(String[] args){
      Map map = new HashMap();  //定义Map对象
      map.put("apple","新鲜的苹果");  //向集合中添加对象
      map.put("computer","配置优良的计算机");
      map.put("book","堆积成山的图书");
      map.put("time",new Date());
      String key = "book";
      boolean contains=map.containsKey(key);  //判断是否包含指定的键值
      if(contains){  //如果条件为真
        System.out.println("在Map集合中包含键名"+key);  //输出信息
      }else{
        System.out.println("在Map集合中不包含键名"+key);
      }
    }

     最后,回到正题:

    题目:

    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

    你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

    你可以按任意顺序返回答案

    输入:nums = [2,7,11,15], target = 9
    输出:[0,1]
    解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

    ac了,

  • 相关阅读:
    0909《操作系统教程》理解和认识
    1230《操作系统教程》实验四 主存空间的分配和回收模拟
    1203《操作系统教程》实验三 进程调度模拟程序 ——实验点评
    1203《操作系统教程》实验三 进程调度模拟程序
    1111《操作系统教程》实验二 作业调度模拟程序
    实验四 主存空间的分配和回收模拟
    实验三同学互评
    实验三 进程调度模拟程序
    实验二、作业调度模拟实验
    实验一报告
  • 原文地址:https://www.cnblogs.com/orange0/p/15322320.html
Copyright © 2011-2022 走看看