JAVA 集合框架Map (七)

1、Map 的主要实现

  • Map :双列数据,存储key-value 对的数据

  • ===HashMap:主要实现类,线程不安全;线程不安全,效率高。可存储null的key 和value

  • ======LinkedHashMap:保证遍历map 元素时可以按添加的顺序遍历。原因:底层使用双向链表的数据结构。两个指针可以一个指向前,一个指向后。对于频繁的遍历操作,此类执行效率高于HashMap。

  • ===TreeMap:保证按照添加的key -value 对进行排序,实现排序遍历。此时考虑key的自然排序或者定制排序

  • 底层结构:红黑树

  • ===HashTable:古老实现类,线程安全,效率低。

  • ======Properties :常用来处理配置文件。key 和 value 都是String 类型。
    HashMap 的底层:数组+链表(jdk 7 以前)
    数组+链表+红黑树(jdk8)(为提高效率)

2、Map 结构的理解

  • Map 中的key:无序的,不可重复的,使用set 存储所有的key 要求:key 所在类要重写equals()和hashCode()
  • Map 中的value:无序的,可重复的,使用Collection储存所有的value。 --value 所在类要重写equals() 方法。
  • 一个键值对:key - value 构成了一个Entry 对象。
  • Map 中的entry :无序不可重复。使用set 存储所有的entry

3、HashMap 的底层原理(添加元素过程图

在这里插入图片描述说明:

  • 在不断添加元素的过程中会涉及到扩容:容量变为原来的两倍,并将数据复制过来。
  • hash 计算得到的地址如果有计算,后续数据存储以链表形式。

jdk 7 与 jdk8 版本比较
在这里插入图片描述

4、Map 中的常用方法

在这里插入图片描述

5、代码查验学习

package com.test;

import org.junit.Test;

import java.util.*;

public class TestMap {
    @Test
    public void test(){
       Map hashMap = new HashMap();
       Map hashtable = new Hashtable();


       //可以放空数据
       hashMap.put(null, null);
       hashMap.put(null, 3);

        //报错java.lang.NullPointerException
        // hashtable.put(null,2);
        System.out.println(hashMap);

    }
    /*
    添加、删除、修改:
     */
    @Test
    public void methodTest1(){
        Map hashMap = new HashMap();
        Map hashMap1 = new HashMap();
        hashMap1.put("AA", 12);
        hashMap1.put("BB", 13);

        //1、添加一个
        hashMap.put("key1", 12);
        System.out.println("hashMap 存放的键值对:"+hashMap);

        // 把另一个hashMap1对象的所有键值对存到 hashMap 中
        hashMap.putAll(hashMap1);
        System.out.println("存入后:"+hashMap);

        //2、移除指定key的key-value对
        hashMap.remove("AA");
        System.out.println("移除AA后输出:"+hashMap);

        //修改
        //value 可以相同
        hashMap.put("mou", 45);
        hashMap.put("shou", 45);
        System.out.println("value 可以重复:"+hashMap);

        //3、修改
        //key 相同时替换(即可用作修改值)
        hashMap.put("zhou", 46);
        hashMap.put("zhou", 47);
        System.out.println("修改后的hashMap:"+hashMap);

        //输出其键值对数
        System.out.println("输出hashMap的大小:"+hashMap.size());

        // 判断是否为空
        System.out.println("是否为空:"+hashMap.isEmpty());

        //判断当前map 和参数对象obj 是否相等
        System.out.println("两个对象是否相等:"+hashMap.equals(hashMap1));

        //4、清除所有
        hashMap.clear();
        System.out.println("--------------没有数据了哦-------------");
        System.out.println(hashMap);
        System.out.println("输出hashMap的大小:"+hashMap.size());
    }

    /*
    元视图操作
    Set keySet():返回所有key构成的Set 集合
    Collection values():返回所有value 构成的Set 集合
    Set entrySet():返回所有key - value1对 构成的集合
     */
    @Test
    public void methodTest2(){
        Map hashMap = new HashMap();
        hashMap.put("AA", 12);
        hashMap.put("BB", 13);
        hashMap.put(45, 14);
        hashMap.put("CC", 12);
        // 1、遍历所有key集
        System.out.println("遍历所有key集:");
        Set set = hashMap.keySet();
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

        //2、遍历所有的value 集
        //不考虑去重
        System.out.println("遍历所有value集:");
        Collection values = hashMap.values();
        for (Object obj : values) {
            System.out.println(obj);
        }

        //3、遍历所有的key-value
        System.out.println("遍历所有的key-value");
        Set set1 = hashMap.entrySet();
        Iterator iterator1 = set1.iterator();
        while (iterator1.hasNext()){
            Object obj = iterator1.next();
            //set1 中的元素都是entry
            Map.Entry entry = (Map.Entry) obj;
            System.out.println(entry.getKey()+" 键值对(此处可修改) "+entry.getValue());
        }
        //由 3 可知 输出key 集  value 集 还可以用第三种方法。
    }
    /**
     * 总结:
     * 添加
     * 删除
     * 修改
     * 查询
     * 长度
     * 遍历
     */
}

运行结果:

hashMap 存放的键值对:{key1=12}
存入后:{key1=12, AA=12, BB=13}
移除AA后输出:{key1=12, BB=13}
value 可以重复:{key1=12, BB=13, mou=45, shou=45}
修改后的hashMap:{key1=12, BB=13, mou=45, zhou=47, shou=45}
输出hashMap的大小:5
是否为空:false
两个对象是否相等:false
--------------没有数据了哦-------------
{}
输出hashMap的大小:0
遍历所有key集:
AA
BB
CC
45
遍历所有value集:
12
13
12
14
遍历所有的key-value
AA 键值对(此处可修改) 12
BB 键值对(此处可修改) 13
CC 键值对(此处可修改) 12
45 键值对(此处可修改) 14
{null=3}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值