Java 映射(Map)和集合

Java 映射(Map)和集合,第1张

1、定义层面

Map 接口定义映射,存储一组键值对的映射关系。

Set 接口定义集合,存储一组互不相同的元素,该接口继承了 Collection 接口。

2、Map 接口的概念和常用方法
      Map 接口存储一组键值对的映射关系,映射中的每个键对应一个值。映射中不能有重复的键,否则会出现一个键对应多个值的情况,这违背了映射的定义。

(1)放置键值对
      放置键值对的方法有 put 和 putAll,其中 put 一次放置一个键值对,putAll 一次将另一个映射中的键值对全部添加道当前映射中。在映射中放置键值对时,如果映射中没有对应的键,则在映射中新建一个键值对,否则用新的键值对覆盖原来的相同键的键值对。

(2)删除键值对
      删除键值对的方法有 remove 和 clear,其中 remove 删除指定键的键值对,clear 删除当前映射中的全部键值对。

(3)判断包含键或值
      判断包含键或值的方法有 containsKey 和 containsValue,其中 containsKey 判断映射中是否包含指定的键,containsValue判断映射中是否包含指定的值。

(4)根据键获得值
      根据键获得值得方法有 get,该方法返回映射中指定键的值。

(5)获得键或键值对的集合
      获得键或键值对的集合的方法有 entrySet 和 keySet,其中 entrySet 返回映射的所有键值对的集合,keySet 返回映射的所有键的集合。

(6)获得值的容器
获得值的容器的方法有 values,该方法返回映射的所有值的容器。

(7)其他方法
方法 isEmpty 判断当前映射是否为空(即不包含键值对),方法 size 返回映射中的键值对数目。

(8)Map 接口的实现类 HashMap、Hashtable 和 TreeMap

  • HashMap 和 Hashtable

        HashMap 类是散列映射,通过散列函数计算键对应的存储位置,因此可以快速地完成放置键值对、删除键值对、根据键获得值的 *** 作。

//初始化方法
Mapchange=new HashMap()
    {
        {
            put('I',1);
            put('V',5);
            put('X',10);
            put('L',50);
            put('C',100);
            put('D',500);
            put('M',1000);
        }
    };

      JDK 1.8 之前的 HashMap 的底层通过数组和链表实现,如果出现冲突则通过拉链法解决冲突。JDK 1.8 在解决冲突时的实现有较大变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树,以减少搜索时间。

       Hashtable 类是散列表,其功能和 HashMap 相似。以下是 HashMap 和 Hashtable 的部分区别。

       HashMap 不是线程安全的,Hashtable 的大多数方法用关键字 synchronized 修饰,因此 Hashtable 是线程安全的。在不需要保证线程安全的情况下,HashMap 的效率高于 Hashtable。

       HashMap 允许键或值为 null,只能有一个键为 null,可以有一个或多个键对应的值为 null,Hashtable 不允许键或值为 null。

        从 JDK 1.8 开始,HashMap 在链表长度大于阈值(默认为 8)时,将链表转化为红黑树以减少搜索时间,Hashtable 没有这样的机制。

  • TreeMap

       TreeMap 是有序映射,键可以使用 Comparable 接口或 Comparator 接口排序。

       TreeMap 的底层实现是红黑树,通过红黑树维护映射的有序性。由于要维护映射的有序性,因此 TreeMap 的各项 *** 作的平均效率低于 HashMap,但是 TreeMap 可以按照顺序获得键值对。

3、Set 接口的定义和常用方法
       Set 接口存储一组互不相同的元素,一个集合中不存在两个相等的元素。

       Set 接口继承了 Collection 接口,没有引入新的方法或常量,只是规定其实例不能包含相等的元素。

(1)Set 接口的实现类 HashSet 和 TreeSet

  • HashSet

       HashSet 类是散列集合,其底层实现基于 HashMap。当对象加入散列集合时,需要判断元素是否重复,首先通过方法 hashCode 计算对象的散列码检查是否有对象具有相同的散列码,如果没有相同的散列码则没有重复元素,否则再通过方法 equals 检查是否有相等的对象。

       根据散列约定,如果两个对象相同,它们的散列码一定相同,因此如果在子类中重写了 equals 方法,必须在该子类中重写 hashCode 方法,以保证两个相等的对象对应的散列码是相同的。

  • TreeSet

TreeSet 类是有序集合,其底层实现基于 TreeMap。和 TreeMap 相似,TreeSet 可以使用 Comparable 接口或 Comparator 接口对元素排序。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/794024.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存