首页 > 其他分享 >8-Map接口和常用方法

8-Map接口和常用方法

时间:2024-07-12 23:09:59浏览次数:7  
标签:Map 常用 HashMap entrySet 接口 key public hashMap

8-Map接口和常用方法

  1. Map 与 Collection 并列存在。用于保存具有映射关系的数据:Key-Value
  2. Map 中的 key 和 value 可以是任何引用数据类型,会封装到 HashMap$Node 对象中
  3. Map 中的 key 不允许重复
  4. Map 中的 value 可以重复
  5. Map 的 key 可以为 null ,value 也可以为 null ,注意 key 为 null,只能有一个,value 为 null ,可以多个。
  6. 常用 String 类作为 Map 的 key
  7. key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到对应的 value
  8. 遍历存储的 Key-Value 数据结点,是通过视图(EntrySet、Values、KeySet)间接获取的,请看如下示意图

注意:遍历存储的数据,本质上通过调用 HashIterator 迭代器进行的,并且 KeySet、Values、EntrySet 对象中并不存放存储的数据。还有就是 HashMap$Node 继承 Map.Entry<K,V> ,这一点要注意。还有就是一定要注意 EntrySet 集合,是通过 entrySet 方法初始化的。还有 HashMap 中的 toString (继承父类)会调用 entrySet . iterator 方法进行获取存储的数据,这也是为啥在 IDEA 中 Debug 中,发现并未调用 entrySet 方法就会发现 EntrySet 集合会被初始化了,并且初始化了其中还包括数据,这是因为 IDEA 中 Debug 过程会调用 HashMap 中的 toString 方法,进行获取其中内容,所以 EntrySet 集合会被初始化及赋值

  1. 查看 EntrySet 集合初始化及获取数据过程测试
package map;

import java.lang.reflect.Field;
import java.util.HashMap;

public class MapEntrySet {

    @SuppressWarnings({"all"})
    public static void main(String[] args) {

        HashMap hashMap = new HashMap();

        Field entrySetField = null ;

        try {
            // 通过反射机制获取 HashMap 中的 entry 属性成员(Set<Map.Entry<K,V>> 类型)
            entrySetField = HashMap.class.getDeclaredField("entrySet");

            // 开启 entry 属性成员的访问权限
            entrySetField.setAccessible(true);

            // 从 HashMap 对象中获取 entry 属性成员
            Object entrySet = entrySetField.get(hashMap);

            // 打印该属性成员,查看属性成员是否为空
            System.out.println("entrySet=" + entrySet);

            // 模拟 IDEA 的 Debug 过程中调用 toString 方法获取数据(检验 entrySet 属性是否被初始化)
            System.out.println("hashMap.toString" + hashMap.toString());

            // 从 HashMap 对象中获取 entry 属性成员
            entrySet = entrySetField.get(hashMap);

            // 打印该属性成员,查看属性成员是否为空
            System.out.println("entrySet=" + entrySet);


        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
}

  1. 遍历 HashMap 中的数据
package map;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class HashMapExercise {

    @SuppressWarnings({"all"})
    public static void main(String[] args) {

        HashMap hashMap = new HashMap();

        hashMap.put(1,new Employee02("吴彦祖",20000,1)) ;
        hashMap.put(2,new Employee02("彭于晏",15000,2)) ;
        hashMap.put(3,new Employee02("杨洋",28000,3)) ;

        // Set<Map.Entry<K,V>> 遍历
        Set entrySet = hashMap.entrySet();

        Iterator iterator = entrySet.iterator();

        while (iterator.hasNext()) {
            Map.Entry entry =  (Map.Entry) iterator.next();
            Employee02 entryValue = (Employee02) entry.getValue();
            if (entryValue.getSalary() > 18000) {

                System.out.println("====工资大于 18000 的员工信息为" + entryValue);
            }
        }

        // keySet 遍历
        Set keySet = hashMap.keySet();

        for (Object object : keySet) {
            Employee02 employee02 = (Employee02) hashMap.get(object);

            if (employee02.getSalary() >18000) {
                System.out.println("====工资大于 18000 的员工信息为" + employee02);
            }
        }


    }
}

@SuppressWarnings({"all"})
class Employee02 {

    private String name ;

    private double salary ;

    private int id ;

    @Override
    public String toString() {
        return "Employee02{" +
                "name='" + name + '\'' +
                ", salary=" + salary +
                ", id=" + id +
                '}';
    }

    public Employee02(String name, double salary, int id) {
        this.name = name;
        this.salary = salary;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

  1. 总结
    1. Map 接口的常用实现类:HashMap、Hashtable 和 Properties。
    2. HashMap 是 Map 接口使用频率最高的实现类。
    3. HashMap 中存储数据是以 key 的 hash 值来获取表中存储的索引位置,进行存储。
    4. 若添加相同的 key,则会覆盖原来的 key-value 数据节点中的 value 值。(在 putval 方法中的一个参数 onlyIfAbsent 控制当相同的 key 时,是否要覆盖)
    5. 与 HashSet 一样,HashMap 的映射顺序也是无序的。
    6. HashMap 没有实现线程同步,若使用须考虑多线程场景。

标签:Map,常用,HashMap,entrySet,接口,key,public,hashMap
From: https://www.cnblogs.com/Yao-happy/p/18299444

相关文章

  • GMOJ 6975. 遗失的河图(map)
    原题每次处理全局最小值的行和列,然后把这些行和列删掉,分别相乘。那么,相当于处理一个L型,每行每列都要取到上界的方案数。令\(c\)和\(d\)分别为全局最小值的行数和列数,以及全局最小值为\(q\)。枚举至多有\(x\)行,至多有\(y\)列能取到最大值,即有\(c-x\)行和\(d-y\)......
  • ExtJs常用布局--layout详解(含实例)
    序言:笔者用的ExtJs版本:ext-3.2.0ExtJs常见的布局方式有:border、form、absolute、column、accordion、table、fit、card、anchor另外,不常见的布局有:tab、vbox、hbox本文所有实例代码已提供下载,下载链接:ExtJs常用布局--layout详解实例代码 简介:最常用的边框布局——BorderLa......
  • MyBatis的ResultMap使用方法,对象关联写法
     MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。在MyBatis进行查询映射的时候,其实查询出来的每一个属性都是放在一个对应的Map里......
  • 自定义ResultMap中的id 和result的区别
    <resultMapid="CashInvoiceMap"type="com.dfire.soa.invoice.bo.Invoice">  <idcolumn="id"property="id"/>  <resultcolumn="order_id"property="orderId"/>  <resultco......
  • resultMap之collection聚集
     聚集元素用来处理“一对多”的关系。需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList);列表中对象的类型ofType(Java实体类);对应的数据库表的列名称;不同情况需要告诉MyBatis如何加载一个聚集。MyBatis可以用两种方式加载:1.select:执行一个其它映射的SQL语句返回......
  • MyBatis用嵌套ResultMap实现一对多映射
    背景我们知道,MyBatis可以很方便地把SQLselect出来的数据直接映射为对象的属性,把对象取出来。但是,有些对象的属性是集合类型,集合里保存的是数个其他类型的对象。如何用MyBatis把它取出来呢?例子以以下这个应用场景为例:一个教师对应多个课程。数据结构如下:publicclassCour......
  • Mybatis模糊查询MySQL中记录的的常用三种方法
    mybatis的模糊查询功能使用的很广泛,以MySQL数据库为例(不同的数据库,有些可能不支持) 常用的模糊查询有三种方法:直接使用%拼接字符串,如 '%'#{name}'%' 或 "%"#{name}"%",单引号或双引号都可以。(或者  '%${vendorId}%' )<iftest="vendorId!=nullandvendorId!=......
  • Avalon MM 接口的PIO的bidir和inout的区别
     当我们设置PIO这个IP的方向的时候,可以看到: Input和Output一个是输入,一个是输出,那么Bidir和InOut有什么区别呢? bidir,指n位宽的信号中的每1bit,可以单独分别设置为读还是写。inout,指将n位宽的信号,全设置为读或写。只有设置为bir模式的时候,才存在direction寄存器,用于控制......
  • WSDL接口调用
    1.使用ApacheCXF工具调用1.1.MAVEN引用<!--cxf--><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>3.1.10</version></dependency><depen......
  • 推荐几个免费的http mock接口
    在前后端分离开发架构下,经常遇到调用后端数据API接口进行测试、集成、联调等需求,比如:(1)前端开发人员很快开发完成了UI界面,但后端开发人员的API接口还没有完成,不能进行前后端数据接口对接和联调,很容易影响开发进度。前端开发人员用的比较多的开源组件有mock.js,但该组件缺乏界面管理......