Edgar--java学习--小说hashmap

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
	 */	 

你可能感兴趣的:(Java基础)