一、Map接口
Map接口:将键映射到值的对象,一个映射表不能有重复的键,每个键最多映射一个值;
1.键值对存储一组对象;
2.key不能重复,value可重复;
3.具体的实现类有:
1.HashMap;2.TreeMap;3.Hashtable;4.LinkedHashMap;
二、HashMap简介
基于哈希表的Map接口的实现类,允许使用null值和键,不保证顺序恒久不变;
实现原理:
1.基于哈希表,由数组+链表+(jdk1.8之后)二叉树{又叫红黑树,只标记了红red};
2.默认加载因子为0.75(百分之七十五):表示数据存储达到75%后要创建新数组或扩容;默认数组大小是16;
3.把对象存储到哈希表中,如何存储?
答:把key对象通过hash()方法计算哈希值,然后用这个哈希值对数组长度取余数,来决定该key对象存储在数组中的位置,当这个位置有多个对象时,再以链表结构存储,jdk1.8之后,当链表长度大于8时,链表转换为红黑树(二叉树)存储;
这样的目的,是为了取值更快,存储的数据越大,性能消耗越少,表现越明显;
4.扩充原理:当数组容量超过了75%,表示数组需要扩充,如何扩充?
答:扩充的算法是:当前数组容量<<1(相当于乘2),扩大一倍,每次扩充表示哈希表重新散列(重排序,重新计算每个对象的存储位置),扩充次数多了影响性能.
5.线程不安全,适合单线程;
三.代码演示
private static void HashMap(){
Map<Integer,String> map=new HashMap<>();
map.put(1,"贝贝");
map.put(2,"京京");
map.put(3,"欢欢");
map.put(4,"莹莹");
map.put(5,"妮妮");
//获取键的值
System.out.println(map.get(1));
//forEach取值
map.forEach((k,v)->System.out.println(k+"-->"+v));
//使用entryset返回一个set集合,遍历map
Set<Map.Entry<Integer,String>> set=map.entrySet();
for (Map.Entry e:set){
System.out.println(e.getKey()+"-->"+e.getValue());
}
//通过keySet获取键,再使用键获取值
Set<Integer> set2=map.keySet();
for (Integer i:set2){
String v=map.get(i);
System.out.println(i+"--->"+v);
}
//通过values方法获取map的值,返回一个collection对象;
Collection<String> collection=map.values();
for (String s:collection){
System.out.println(s);
}
}
四.小结
本章对Java中的Map接口–HashMap进行了概述及演示,map接口在Java中是比较常用的数据封装的接口,尤其是HashMap,最为常用。
网友评论