美文网首页
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派系

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

  • ArrayList总结

    首先,我们要知道Java 集合主要分为两个派系,一个是 Collection 系列,一个是 Map 系列。 我们今...

  • Java集合之Map

    Java集合之Map Map关系图如下 虚线为接口 实线为类 Map特点 键值对格式 key唯一 Map实现类之H...

  • Java之Collection:List派系和Set派系

    学习这一节,请先学习:https://www.jianshu.com/p/1dbf1be8006b 将List理解...

  • Java 数据结构之 Map 学习总结

    Java 数据结构之 Map 学习总结 今天总结学习一下键值映射关系Map。 先了解下Map Map 是一种把键对...

  • java之Map

    前言 本文主要内容: 1、HashMap简介 2、ConcurrentHashMap简介 3、tree...

  • java day 14

    Map java Map及Map.Entry详解Map是java中的接口,Map.Entry是Map的一个内部接口...

  • Java中如何遍历Map对象的4种方法

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍...

  • Java中如何遍历Map对象的4种方法

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍...

  • Java基础之Map集合

    ## Java基础之Map集合 Map集合是一种双列集合,存储形式为键值对的形式(Map集合中的键是唯一性的) 如...

网友评论

      本文标题:Java之Map派系

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