Map

Map在Java中是一个接口,常见的实现类有:   
HashMap,LinkedHashMap,TreeMap和ConcurrentHashMap
*每个类对应的结构*

1、HashMap
new一个HashMap时会发生什么?

HashMap有几个构造方法但最主要的就是指定初始值以及负载因子的大小,如果我们不指定,默认HashMap的大小为16,负载因子的大小为0.75.
HashMap的大小只能是2次幂
假设传一个10进去,实际上最终HashMap的大小是16,传一个7进去。。。。。是8。

我们把元素放进HashMap的时候,需要算出这个元素所在的位置,在HashMap里用的是位运算来代替取模,能够更加高效的算出该元素所在的位置------>为什么大小只能是2次幂?因为只有大小为2次幂的时候才能合理用位运算替代取模。

负载因子的大小的大小决定着哈希表的扩容和哈希冲突:
比如现在默认的HashMap大小为16,负载因子为0.75,这意味着数组最多只能放12个元素,一旦超过12个元素则哈希表需要扩容。
计算方法

16*0.75.每次put元素进去的时候都会检查HashMap的大小有没有超过这个值,有则扩容。

2、在put元素的时候传递的key是怎么算哈希值的?

实现就在hash方法上,可以发现的是它是先算出正常的哈希值,然后与高16位做异或运算,产生最终的哈希值。这样做的好处可以增加随机性,减少了碰撞冲突的可能性。

3、怎么判断一个元素是否相同?

首先比较hash值,随后会用==运算符和equlals()来判断该元素是否相同
如果只有hash值相同,那说明该元素哈希冲突了,如果hash值和equals()||==都相同,那说明该元素是同一个

4、Map基本操作

//Map 初始化
Map<String,String> map = new HashMap<String,String>();
//插入元素
map.put("key1","value1");
//获取元素
map.get("key1")
//移除元素
map.remove("key1");
//清空map
map.clear()

5、
通过Map.entrySet遍历key和value

entrySet()方法用于获取存放Map.Entry<KEY,VALUE>对象的Set集合,面向对象的思想将map集合中的键和值映射关系打包为一个对象,就是Map.Entry,将该对象存入Set集合,Map.Entry是一个对象,那么该对象具备的getKey,getValue获得键和值。

for(Map.Entry<String,String> entry : map.entrySet())
//Map.value遍历value,但不能遍历key
for(String v : map.values())

6、Map一些常见的使用场景:

①Map集合中的元素都是由两部分组成,元素键不能相同,可以通过键得到值,每个键对应唯一的值,相对应的也可以通过值去找到键,但是因为每一个值可能会有多个键,所以这样会相对繁琐。

②常用方法:

//把指定的键与指定的值添加到Map集合中
public K put(k key,v value)
//把指定的键所对应的键值对元素在Map集合中删除,返回被删除元素的值
public K remove(Object key)
//根据指定的键,在Map集合中获取对应的值
public K get(Object key) 
或
map.get(key)
//获取Map集合中所有的键,存储到Set集合中
public Set<B> keySet();
//获取到Map集合中所有的键值对对象的集合set集合
public Set<Map.Entry<K,V>> entrySet()

③List<Map<String,String>>

一般用for先让List遍历其中的Map,再用第二个for遍历map中的字段

7、Map<String,object>的用法:

Map:map可以理解为映射,在定义数组是其实就是定义了一个从int型到int型的映射

例:x(0)=1---->将0映射到1

传统的映射是将int类型映射到任何类型,但是这样就会有一个弊端,当在使用某个关键字的时候很不方便,这时候就可以使用map来解决,map可以将任何类型映射为任何类型(但是需要确定映射前和映射后的类型用<键类型,值类型>括起来)***如果是字符串到整型的映射,必须是String不能是char数组
回到上面的Map<String,object>---->将键值String类型转换成Object