今天对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了,