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了,

原文地址:https://www.cnblogs.com/orange0/p/15322320.html