美文网首页
Java之Map派系

Java之Map派系

作者: 如果仲有听日 | 来源:发表于2018-08-14 18:14 被阅读0次

    Java有两大类集合,之前已经介绍过了Collection集合,参见:https://www.jianshu.com/p/46980e60de61

    这一篇介绍Map接口的集合特性。

    常见Map集合有HashMap和LinkedHashMap

    1. 概述

    Map集合和Collection集合存储数据的形式不同

    Collection派系中的集合元素是孤立存在,存储元素时是一个个单独存入集合;而Map派系中的集合,元素是成对存在的。每个元素由Key-Value两部分组成,通过Key可以找到Value

    Collection中的集合为单列集合;Map中的集合为双列集合

    Map中的集合不能包含重复的Key,但Value可以重复

    主要关注2个Map接口的实现类:

    HashMap<K, V>:采用哈希表结构,元素的存取顺序不能保证一致。由于要保证Key的唯一性,需要重写hashCode和equals方法。

    LinkedHashMap<K, V>:存储采用哈希表结构和链表。通过链表可以保证存取顺序一致;通过哈希表可以保证key的唯一、不重复,也需要重写hashCode和equals方法。

    2. Map接口中的常用方法

    2.1 V put(K key,V value)方法

    可见存储无序且不重复

    put的返回值V:如果是更新了某个key的值,则返回更新前的值;如果只是添加键值对,则返回null

    2.2 V get(Object key)方法

    如果存在查询的key,则返回对应value

    如果不存在查询的key,则返回null

    2.3 V remove(Object key)

    3. 2种Map接口的遍历的方法

    两种方法都要掌握,但是根据喜好选择一种

    3.1 Set<K> keySet()方法

    将Map集合中的所有key都转存到Set集合,这样遍历Set集合中的key变相去遍历Map集合

    步骤:(本来不想写这种死东西,但若是初学者,还是了解一下比较好)

    1. 调用keySet方法,将Map集合中的key存到Set集合中

    2. 遍历Set集合取出Key值

    3. 调用Map中的get方法,参数是第2步中的key

    程序说明:

        a. 这里用了增强型for循环,也可以用iterator

        b. 另一种写法(使用匿名对象):

            Iterator it = hm.keySet().iterator();

            while(it.hasNext()) {

                System.out.println(hm.get(it.next()));

            }

        c. 程序中定义的set是接口Set的一个实现类,使用getClass可以查看set具体是哪一个实现类。结果是:class java.util.HashMap$KeySet。HashMap的一个内部类,$符号后面是内部类的名字

    3.2 Entry键值对 接口

    Map类设计时,提供了一个嵌套接口:Entry。它将KeyValue对应关系封装成了对象。这样我们就可以不用keySet,而用Entry获取KeyValue对象来遍历Map

    Set<Map.Entry<K,V>> entrySet()

    操作步骤见代码:

    4. HashMap

    前面的方法HashMap都适用,这里主要演示自定义类作为Key或Value的情况,涉及hashCode和equals方法重写

    4.1 自定义类作为value加入到HashMap中并用keySet方法遍历

    因为非自定义的基本类型的hashCode、equals方法被重写过,所以不需要再重写,直接使用即可,比较简单

    4.2 自定义类作为key加入到HashMap中并用Iterator使用Entry对象遍历

    Person类中没有重写hashCode和equals方法

    可见,相同内容的Person类作为key,没有覆盖原来的value

    重写hashCode和equals方法

    5. LinkedHashMap

    LinkedHashMap继承自HashMap

    区别是:保证了迭代顺序

    用法和HashMap一样,就不再重复介绍

    6. HashTable集合类(了解)

    Map接口的实现类:HashTable

    底层数据结构是哈希表,特点和HashMap是一样的

    但HashTable是同步的:线程安全的,速度慢

    HashMap是不同步的:线程不安全,速度快

    HashMap允许存储null Key,null value

    HashTable不允许存储null key,null value

    HashTable和Vector差不多是早期的,从JDK1.2开始被更强大的HashMap取代

    但是HashTable的子类Properties类依然再使用,Properties类可保存在I/O流中或从I/O流中加载

    7. 静态导入

    Java从JDK1.5开始支持导入静态成员,以减少开发的代码量

    在导包的时候import后面加上static,后面跟的必须是静态成员,这样就不需要在代码中加入类名了

    8. 方法的可变参数(type ...a)

    可变参数,本质上就是一个数组

    注意事项:

    一个方法中,只能有一个可变参数

    可变参数必须在方法参数列表的最后

    9. Collections工具类(注意不是Collection)

    Collections工具类主要操作Collection集合,Collections中的方法都是静态方法

    9.1 sort静态方法(只针对List)

    由于Set是无序的,所以只针对List派系

    9.2 binarySearch二分查找

    只针对List派系

    9.3 shuffle方法 随机排序

    只能对List派系进行随机排序

    10. 集合的嵌套存储

    Map中存Map是最复杂的情况,其它就不介绍了

    HashMap为例:

    hashmap在添加的时候是从里到外添加,因此遍历的时候要从外到里去遍历

    相关文章

      网友评论

          本文标题:Java之Map派系

          本文链接:https://www.haomeiwen.com/subject/omfvbftx.html