package 集合map;
import java.util.*;
import java.util.Map.Entry;;
/*
- map接口是除了collection的另一个接口
- 主要区别是 map是双列存储 是一个对键值对 key与 value
- List、Set、Map都可以通过迭代器来遍历
- 先看 hashmap
-
1.无序
-
//没有索引 所以后期遍历的时候我们只能通过迭代器遍历
-
//两种一种是 keyset 一种是 entryset
-
2.不可重复---因为key序列是set序列而set
-
3.可以为null 只有一个空
-
4.理解hashmap的存取过程 理解为什么要优化 hashcode和重写equals
-
5.扩容问题
public class MapDemo01 {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("a", "李四");
map.put("b", "张三");
// 1.无序 没有索引值
Set<String> set1 = map.keySet();
System.out.println("MapDemo01.main()");
System.out.println(set1);
// 2.迭代器遍历
// 2.1entryset遍历 此时迭代器返回的是一个entry
Set<Map.Entry<String, String>> entries = map.entrySet();
Iterator<Entry<String, String>> iterator = entries.iterator();
while (iterator.hasNext()) {
Entry<String, String> entry = iterator.next();
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
// 2.2keyset遍历 此时迭代器返回的是key值
Set<String> set = map.keySet();
Iterator<String> iterator2 = set.iterator();
while (iterator2.hasNext()) {
String string = (String) iterator2.next();
System.out.println("key " + string);
System.out.println("value " + map.get(string));
}
## **3.可以为null**
map.put(null, null);
System.out.println(map);
//
4.理解hashmap的存取过程
理解为什么要优化 hashcode和重写equals
/*
* 0x00 map的结构 数组加链表 (加红黑二叉树) (数组索引是靠hashcode值转换而来,数组长度默认为16.
* 数组每一位的节点上面加上链表。如果数组那一位有内容了(数组那位就是链表的头结点也是有数据的链表),我们再放在链表里。
* 我们希望尽量让数据散列开来(优化hashcode),因为在链表里面查数据。。每次还要调用equals---慢!
* JDK1.8以后当后面链表长度长度大于8以后链表变为红黑树,这样提高了查找效率。) 0x01 存储过程
* 简单说就是通过key值算出一个hashcode,将这个值转换为map数组的下标,我们去看下那位置上有没有内容,如果没有直接放上。
* 如果有,那么比较equals(开始慢了),重写后的equals会进行内容比较,如果内容不同,那么往后面的链表上存。 0x02 取数据过程
* 先获取key对应的数组下标,然后如果幸运的话它就在数组上(链表头结点上),如果不幸的话,您就调用equals慢慢比较去吧
* 当然jdk1.8以后升级了一下,把这个链表大于8的时候改为了红黑二叉树,这样降低了层数,提高了查找效率。 0x03 为什么要优化
* 理解了上面的过程我们就清楚了 我们尽量让内容不同的对象,hashcode不同 1.这样在存储的时候我们就不用麻烦equals了
* 2.我们取的时候也不用调用equals了
*/
5.扩容问题
/*
* 如果达到了数组长度的0.75 那么第一次就是12,
* 如果达到12了,那么自动扩容为2倍,也就是32
*/