Map相关(HashMap)

发布于:2023-01-18 ⋅ 阅读:(481) ⋅ 点赞:(0)

一、Map

存储的key/value 键值对, key: 任意数据类型, (实际开发中,key 一般String), value 任意数据类型,

key: 要求唯一的, value可以重复

实现类: HashMap(线程不安全), HashTable(老版本,面试问)(线程安全),TreeMap, Properties(配置文件,key/value 都是String)

如果往Map添加数据, key在Map已存在, 把新添加的数据的value 覆盖Map的对应key的value

Map里面的key可以为null,但是只能有一个,多个的时候,后面的会覆盖前面的

二、HashMap

数据结构: 哈希表(数组/链表(|红黑树))

JDK1.7(包含1.7)之前: 数组+链表

JDK1.8 (包含1.8)之后, 引入红黑树(提高查询效率): 数组+链表/红黑树

1.四个构造方法

HashMap() 
构造一个空的 HashMap ,默认初始容量(16)和默认负载系数(0.75)。  
HashMap(int initialCapacity) 
构造一个空的 HashMap具有指定的初始容量和默认负载因子(0.75)。  
HashMap(int initialCapacity, float loadFactor) 
构造一个空的 HashMap具有指定的初始容量和负载因子。  
HashMap(Map<? extends K,? extends V> m) 
构造一个新的 HashMap与指定的相同的映射 Map 。  
​

(1)注意容量只能是2的幂次方

 //创建一个HashMap  初始容量: 16 加载因子:0.75
        HashMap map = new HashMap();
​
        //创建一个HashMap指定容量: 2的幂次方, 加载因子不去设置,
        HashMap map2 = new HashMap(25);
        System.out.println(tableSizeFor(25));
        
        static  int tableSizeFor(int cap) {
        int n = cap - 1;
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1 : n + 1;
    }

2.关于方法

//添加
        map.put("k1","v1");
        map.put("k2","v2");
        map.put("k1","v11"); //key存在, 覆盖value
        System.out.println(map);
​
        //删除
        map.remove("k1");
        System.out.println(map);
        //获取, 根据key获取value  get
        System.out.println(map.get("k2"));
        System.out.println(map.get("k3")); //key不存在,返回null
​
        //清空 clear
        //map.clear();
        //判断map是否空(map是否有元素) true: 没有元素, false: 有
       // System.out.println(map.isEmpty());
​
        //判断key是否存在
        System.out.println(map.containsKey("k2"));
        System.out.println(map.containsKey("k1"));
        //获取map的元素个数 size()
        System.out.println(map.size());

3.遍历方式

HashMap map = new HashMap();
        map.put("k1","v1");
        map.put("k2","v2");
        map.put("k3","v3");
​
        //第一种遍历方式
       /* Set keys = map.keySet();
        //使用迭代器
        //简写forEach循环
        for(Object key:keys){
            //根据key获取value
            Object value = map.get(key);
            System.out.println("key:"+key+"-value:"+value);
        }*/
​
        //第二种: 遍历value
       /* Collection values = map.values();
        //使用迭代器
        //简写forEach循环
        for(Object value:values){
            //获取value
            System.out.println("-value:"+value);
        }*/
​
​
​
最常用:
​
      
  //第三种方式
        //Entry: key/value对
        Set entrys = map.entrySet();
        //使用迭代器
        //简写forEach循环
        for(Object entryObj : entrys){
            Map.Entry entry = (Map.Entry)entryObj;
            //获取key, value
            Object key = entry.getKey();
            Object value = entry.getValue();
            System.out.println("key:"+key+"-value:"+value);
        }

4.原理

数组+链表/红黑树

hashMap扩容: 达到扩容阈值: = 容量 * 加载因子