Map接口
package cn.tedu.map;
/*本类用于测试Map接口*/
import java.util.*;
/**
* @author z
* @create 2021-10-25-14:08
*/
public class MapDemo {
public static void main(String[] args) {
//1.创建map对象
/*Map中的数据要符合映射规则,需要同时指定K与V的数据类型
* 至于K和V具体指定成什么类型,取决于业务的具体要求*/
Map<Integer,String> map = new HashMap<>();
//2.向map集合存入数据,注意方法是put
map.put(8848,"白骨精");
map.put(8849,"黑熊精");
map.put(8850,"鲤鱼精");
map.put(8851,"黄毛怪");
map.put(8852,"黑熊精");
map.put(8848,"女儿国国王");
System.out.println(map);
/*1.map中存放着的都是无序的数据
* 2.map中的value可以重复--比如我们可以存两个黑熊精
* 3.map中的key不允许重复,如果重复,新value会把旧value覆盖掉
* 比如女儿国国王和白骨精的key都是8848,白骨精被覆盖掉*/
//3.进行方法测试
// map.clear();
// System.out.println(map);
System.out.println(map.equals("黄毛怪"));//
System.out.println(map.isEmpty());
System.out.println(map.size());//5,获取map集合中键值对的个数
//判断map集合是否包含指定的key-键
System.out.println(map.containsKey(8848));
//判断map集合是否包含指定的value-值
System.out.println(map.containsValue("白骨精"));
//将map集合中所有的value值取出,放入Collection集合中
//Collection<Type>中Type的类型,取决于map中value的类型
Collection<String> values = map.values();
System.out.println(values);
//4.map集合的迭代方式一
/*我们想要遍历map中的数据,但是map集合本身没有自己的迭代器
* 所以需要先将map集合转为Set集合后,再使用set的迭代器进行迭代
* 代码:Set<Key> = map.keySet();
* 作用:将map中所有的key值取出,存入set集合中,此处set的泛型是Integer*/
Set<Integer> set = map.keySet();//将map集合转为set集合,set中存的是map的key
Iterator<Integer> it = set.iterator();
while (it.hasNext()){
Integer key = it.next();
String value = map.get(key);
System.out.println("{"+key+"="+value+"}");
}
//5.map的迭代方式二
/*遍历map集合,需要把map集合转换为set集合
* 本方案是把一对键值对看成是一个Entry
* 代码:Map.Entry<Key,Value> = map.entrySet();
* Map.Entry<K,V>,这里是Map.Entry<Integer,String>*/
//将map集合转换成只存entry的set集合
Set<Map.Entry<Integer, String>> set2 = map.entrySet();
//获取set集合的迭代器,泛型就是集合的类型entry
Iterator<Map.Entry<Integer, String>> it2 = set2.iterator();
while (it2.hasNext()){//判断是否有下一个元素可迭代
//System.out.println(it2.next());//方式1:可以直接打印
//方式2:接一下本轮循环获取的entry
Map.Entry<Integer, String> entry = it2.next();
Integer key = entry.getKey();//根据entry获取对应的key
String value = entry.getValue();//根据entry获取对应的value
System.out.println("*"+key+"-"+value+"*");//拼接打印
}
}
}
HashMap
1.HashMap的存储过程:
1.HashMap的结构是数组+链表 或者 数组+红黑树 的形式
2.HashMap底层的Entry[ ]数组,初始容量为16,加载因子是0.75f,扩容按约为2倍扩容
3.当存放数据时,会根据hash(key)%n算法来计算数据的存放位置,n就是数组的长度,其实也就是集合的容量
4.当计算到的位置之前没有存过数据的时候,会直接存放数据
5.当计算的位置,有数据时,会发生hash冲突/hash碰撞
解决的办法就是采用链表的结构,在数组中指定位置处以后元素之后插入新的元素
也就是说数组中的元素都是最早加入的节点
6.如果链表的长度>8时且entry数组长度大于64,,链表会转为红黑树,当链表的长度<6时,会重新恢复成链表