Java集合之Map接口与实现类详解

目录
  • 初识Map
  • Map中常用方法
  • HashMap
  • LinkedHashMap
  • TreeMap
  • HashMap和TreeMap的比较
  • Hashtable
  • 集合中元素的遍历
    • iterator接口中的方法
    • Enumeration接口中的方法

初识Map

Map接口没有从Collection接口继承,Map接口用于维护“键-值”对数据,这个“键-值”对就是Map中的元素,Map提供“键(Key)”到“值(value)”的映射,一个Map中键值必须是唯一的,不能有重复的键,因为Map中的“键-值”对元素是通过键来唯一标识的,Map的键是用Set集合来存储的,所以充当键元素的类必须重写hashCode()和equals()方法,通过键元素来检索对应值元素

Map中常用方法

V put(K key, V value)	//向Map集合中添加键值对 

V get(Object key)			//返回指定键映射到的值,通过key获取value 

void clear()		//从此映射中删除所有映射,清空Map集合

boolean containsKey(Object key)	//判断Map是否包含某个key

boolean containsValue(Object value)	//判断Map是否包含某个value

boolean isEmpty()	//判断Map中元素个数是否为0

Set<K> keySet()	//获取Map集合中所有的key(所有的键都是一个“Set集合”)

V remove(Object key)	//通过key删除键值对,如果存在,则从该映射中移除键的映射(可选操作)

int size()	//获取Map集合中键值对的个数

HashMap

HashMap特点

(1)HashMap实现了Map 接口

(4)HashMap以Hash表为基础构建

(2)HashMap 允许键(Key)为空和值(Value)为空

(3)HashMap不是线程安全的,不能用在多线程环境中

HashMap常用的构造方法如下

(1)HashMap():创建一个空 HashMap 对象,并为其分配默认的初始容量和加载因子

(2)HashMap(int initialCapacity):创建一个空 HashMap 对象,并为其分配指定的初始容量

(3)HashMap(int initialCapacity,float loadFactor);创建一个空 HashMap 对象,并其分配指定的初始容量和加载因子

(4)HashMap(Map m):创建一个与给定Map 对象具有相同键-值对的 HashMap 对象

HashMap方法的简单使用

import java.security.Key;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Warehouse1 {
    public static void main(String[] args){
        HashMap<String,Integer> hashMap=new HashMap<>();
        hashMap.put("年龄",20);
        hashMap.put("身高",180);
        hashMap.put("体重",60);
        System.out.println("键为年龄所对应的值为:"+hashMap.get("年龄"));
        System.out.println("该map是否包含键为“年龄”?"+hashMap.containsKey("年龄"));
        System.out.println("该map是否包含键值为90?"+hashMap.containsValue(90));
        System.out.println("该map是否为空?"+hashMap.isEmpty());
        System.out.println("该map的长度大小为:"+hashMap.size());
        System.out.println("移除键为“体重“的键值对"+hashMap.remove("体重"));
        System.out.println("哈希映射中的内容如下:"+hashMap);
        Set<String> keys=hashMap.keySet();
        Iterator<String> iterator=keys.iterator();
        System.out.println("hashmap中的元素如下:");
        while(iterator.hasNext()){
            String s= iterator.next();
            Integer name= hashMap.get(s);
            System.out.println(s+":"+name);
        }
    }
}

输出:

键为年龄所对应的值为:20
该map是否包含键为“年龄”?true
该map是否包含键值为90?false
该map是否为空?false
该map的长度大小为:3
移除键为“体重“的键值对60
哈希映射中的内容如下:{年龄=20, 身高=180}
hashmap中的元素如下:
年龄:20
身高:180

小tips:在输出map中的元素时,我们不能直接使用iterator[迭代器],对元素进行遍历输出,因为迭代只能用在Set/List这种单列存放数据的集合中,而map是双列的,并且也不能使用foreach语句对map进行输出,因为foreach语句的本质也是迭代,只能用在单列集合中。

LinkedHashMap

LinkedHashMap有如下特点

1:LinkedHashMap实现了Map接口

2:LinkedHashMap继承了HashMap,内部还有一个双向链表维护键-值对的顺序,每个键-值对即位于哈希表中,也位于双向链表中

3:LinkedHashMap保存了两种元素顺序,输入顺序和访问顺序,插入顺序是指先添加的元素在前面,后添加的元素在后面,修改对应的元素不会影响元素的顺序,访问顺序指的是get/put操作,对一个键执行put/get操作后,其对应的键-值对会移动到链表末尾,所以最末尾的元素是最近访问的,最开始的是最久没有被访问的

4:LinkedHashMap不是线程安全的,不能用在多线程环境中

LinkedHashMap的构造方法如下

1:LinkedHashMap();构造一个空的LinkedHashMap对象

2:LinkedHashMap(Map m);构造一个具有和给定Map相同键-值对的LinkedHashMap对象

3:LinkedHashMap(int capacity):构造一个给定初始容量capacity的LinkedHashMap对象

4:LinkedHashMap(int capacity,float fillRatio):构造一个给定初始容量capacity和填充比fillRatio的LinkedHashMap对象

5:LinkedHashMap(int capacity,float fillRatio,boolean accessOrder):构造一个给定初始容量capacity,填充比fillRatio以及是否被访问顺序的LinkedHashMap对象,access-sOrder为true表示按访问顺序,否则按插入顺序。

注:前四种构造方法创建的LinkedHashMap对象都是按插入顺序

注:fillRatio是装载因子,范围在0-1.0之间,默认是0.75。当实际元素个数/容量 > fillRatio, HashMap自动进行扩容,以保证检索速度

举例:

分别创建两个LinkedHashMap对象-----linkedHashMap和linkedHashMap1

linkedHashMap是以上述五种方法中的第一种构造的LinkedHashMap对象,而linkedHashMap1是以上述五种方法中的第5种构造的LinkedHashMap对象.

代码如下:

import java.security.Key;
import java.util.*;

public class Warehouse1 {
    public static void main(String[] args){
        LinkedHashMap<String,Integer> linkedHashMap=new LinkedHashMap<>();
        linkedHashMap.put("number1",10);
        linkedHashMap.put("number2",20);
        linkedHashMap.put("number3",30);
        linkedHashMap.put("number4",40);
        linkedHashMap.get("number1");
        linkedHashMap.get("number4");
        Set <Map.Entry<String,Integer>> sets=linkedHashMap.entrySet();//Map.Entry是Map的一个内部类,表达一个 key/value映射关系
        System.out.println("linkedHashMap中的元素为:");
        for(Map.Entry<String,Integer> entry:sets) {
            System.out.println("键为:" + entry.getKey() + ",值为:" + entry.getValue());
        }
           System.out.println("---------------");
           LinkedHashMap<String,Integer> linkedHashMap1=new LinkedHashMap<String,Integer>(3,0.5f,true);
            linkedHashMap1.put("number1",10);
            linkedHashMap1.put("number2",20);
            linkedHashMap1.put("number3",30);
            linkedHashMap1.put("number4",40);
            linkedHashMap1.get("number1");
            linkedHashMap1.get("number4");
            linkedHashMap1.put("number3",1000);
            Set<Map.Entry<String,Integer>> set=linkedHashMap1.entrySet();
            System.out.println("linkedHashMap1中的元素为:");
            for(Map.Entry<String ,Integer> entry1:set) {
                System.out.println("键为:" + entry1.getKey() + "值为:" + entry1.getValue());
            }
    }
}

输出:

linkedHashMap中的元素为:
键为:number1,值为:10
键为:number2,值为:20
键为:number3,值为:30
键为:number4,值为:40
---------------
linkedHashMap1中的元素为:
键为:number2值为:20
键为:number1值为:10
键为:number4值为:40
键为:number3值为:1000

通过输出结果,我们不难发现,linkedHashMap中的元素输出的顺序为我们插入时的顺序,而linkedHashMap1中的元素输出顺序为访问顺序,由于这种构造对象的方法,我们设置了access-sOrder为true,因此输出顺序按访问顺序,linkedHashMap1.get(“number1”),表示访问number1,访问完之后,该键值对就移动到最后,下面两行的操作产生的影响也是这样linkedHashMap1.get(“number4”);linkedHashMap1.put(“number3”,1000)。

当按照访问顺序时,put和get去操作已经存在的Entry时,都会把Entry移动到双向链表的表尾[实际是先删除再插入]

TreeMap

TreeMap有如下特点

1:TreeMap实现了SortedMap接口

2:TreeMap和实现Map的其他对象不同的是,它不具有调优选项

3:TreeMap中所有元素必须是可比较的

4:TreeMap不是线程安全的

TreeMap的构造方法如下

1:TreeMap():构造一个空的TreeMap对象

2:TreeMap(Map m):构造一个具有和给定Map相同键-值对的TreeMap对象

3:TreeMap(Comparator c):构造一个空的TreeMap对象,并且规定特定的排列方式

4:TreeMap(SortedMap a):构造一个与给定的SortedMap具有相同键-值对,相同排列规则的TreeMap对象

TreeMap方法的简单使用

import java.util.*;
public class Warehouse1 {
    public static void main(String[] args) {
        TreeMap<String,String> treeMap=new TreeMap<>();
        treeMap.put("水果","苹果");
        treeMap.put("汽车","奔驰");
        treeMap.put("城市","西安");
        System.out.println("映射中的元素是:"+treeMap);
        Set<String> keySet=treeMap.keySet();
        Iterator<String> iterator=keySet.iterator();
        System.out.println("TreeMap类实现的Map映射,按键值升序排列元素如下:");
        while(iterator.hasNext()){
            String it=iterator.next();
            String name=treeMap.get(it);
            System.out.println(it+":"+name);
        }
    }
}

输出:

映射中的元素是:{城市=西安, 水果=苹果, 汽车=奔驰}
TreeMap类实现的Map映射,按键值升序排列元素如下:
城市:西安
水果:苹果
汽车:奔驰

注:TreeMap默认排序规则:按照key的字典顺序来排序[升序],当然也可以通过Comparator接口,去自定义排序规则。

HashMap和TreeMap的比较

HashMap和TreeMap在实际应用中要使用哪一个,还是需要根据实际情况进行分析,在Map中插入,删除和定位元素,HashMap是最好的选择,但是如果要按顺序遍历键,那么TreeMap会更好,根据集合大小,先把元素添加到HashMap,再把这种映射转换成一个用于有序键遍历的TreeMap会更快,使用HashMap要求添加的键类明确定义了hashcode()实现,有了TreeMap实现,添加到映射的元素一定是可排序的。

Hashtable

Hashtable有如下特点

1:Hashtable实现了map接口

2:Hashtable以Hash表基础构建

3:Hashtable和HashMap在执行过程中具有一定的相似性

4:Hashtable中不允许空元素,即键和值都不允许为空

5:Hashtable是线程安全的,可以在多线程环境中使用

Hashtable的四个构造方法如下

Hashtable();创建一个空Hashtable对象,并为其分配默认的初始容量和加载因子

Hashtable(int initialcapacity);创建一个空Hashtable对象,并为其分配指定的初始容量

Hashtable(int  initialcapacity,float loadFactor):创建一个空Hashtable对象,并指定其初始容量和加载因子

Hashtable(Map m);创建一个与给定Map对象具有相同键-值对的Hashtable对象

Hashtable新增的常用方法

举例:

import java.util.*;
public class Warehouse1 {
    public static void main(String[] args) {
    Hashtable<String,Double> hashtable=new Hashtable<>();
    hashtable.put("王俊凯",new Double(350.55));
        hashtable.put("王源",new Double(3250.55));
        hashtable.put("易烊千玺",new Double(1350.55));
        Enumeration<String> names=hashtable.keys();
        while(names.hasMoreElements()){
            String name=names.nextElement();
            System.out.println(name+":"+hashtable.get(name));
        }
        double new_double=hashtable.get("易烊千玺").doubleValue();
        hashtable.put("易烊千玺",new Double(new_double+2000));
        System.out.println("易烊千玺的新余额为:"+hashtable.get("易烊千玺"));
    }
}

输出:

易烊千玺:1350.55
王源:3250.55
王俊凯:350.55
易烊千玺的新余额为:3350.55

集合中元素的遍历

Collection接口的iterator()方法返回一个iterator对象,iterator接口能以迭代方式逐个访问集合中各个元素,并安全地从Collection中除去适当的元素,iterator接口中定义的方法如下所示:

iterator接口中的方法

  • boolean hasNext();判断游标右边是否还有元素
  • Object next();返回游标右边的元素并将游标移动到该元素后
  • void remove();删除游标左边的元素,通常在next()方法之后执行,只执行一次

Enumeration接口的功能与iterator接口类似,也能够对集合中的元素进行遍历,但是Enumeration接口只对Vector,Hashtable类提供遍历方法,并且不支持移除操作,实现Enumeration接口的对象,它生成一系列元素,一次生成一个,连续调用,nextElement方法将返回一系列的连续元素

Enumeration接口中的方法

boolean hasMoreELements();    如果存在访问的更多元素,则返回true

Object nextEment();        返回下一个元素的引用

到此这篇关于Java集合之Map接口与实现类详解的文章就介绍到这了,更多相关Java Map接口内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java中的List接口实现类解析

    目录 Java的List接口实现类 实现类ArrayList 实现类LinkedList 实现类Vector List三个实现类 Java的List接口实现类 实现类ArrayList ArrayList类相当于一个容量可变的动态数组,当超过了他的大小时,类集自动增加,当对象被删除后,数组就可以缩小. import java.util.*; public class ListDemo { public static void main(String args[]){ Collection c1

  • java集合collection接口与子接口及实现类

    目录 概要 1 Collection接口的实现子类特性 2 通过实现子类ArrayList体现Collection接口方法 2.1 代码演示示例 3 集合的遍历:①使用Iterator(迭代器)②增强for循环遍历 3.1 代码示例 4 List相关解读 5 Set接口分析 Map接口及实现子类 结语 概要 集合概念:像数组一样是java的一个容器:和数组不同的是数组只能存同类型的数据,且长度定义之后就不可变,集合不仅,可以存多种类型的数据,而且还提供了增.删.改.查的方法: 集合分类:可以分为

  • Java Set接口及常用实现类总结

    目录 前言 概述 Set 无序性与不可重复性的理解 无序性 不可重复性 Set 接口常用实现类 HashSet LinkedHashSet TreeSet 前言 Collection的另一个子接口就是Set,他并没有我们List常用,并且自身也没有一些额外的方法,全是继承自Collection中的,因此我们还是简单总结一下,包括他的常用实现类HashSet.LinkedHashSet.TreeSet的总结! 概述 Set 接口是 Collection 的子接口, set 接口没有提供额外的方法.

  • Java如何获取接口所有的实现类

    目录 Java获取接口所有的实现类 反射获取接口的所有实现类 总结 Java获取接口所有的实现类 最近因业务需求,要实现NodeRed服务后端化,为使各个节点的解析进行插件化(NodeRed各个节点也是插件化,安装插件即可使用) ,后端不得不动态加载解析NodeRed节点json,用一个接口来统一管理. import cn.hutool.core.util.ClassUtil; import java.util.*; /** * 此类用来解析NodeRed服务器的json串 */ public

  • Java SpringBoot 获取接口实现类汇总

    目录 前言 一.获取接口的所有实现类 1.枚举 2.业务接口 2.1 实现类 3.ApplicationContextAware接口实现类 4.获取到所有实现类使用 前言 有时候,根据业务逻辑的需求,需要获取到某个接口的所有实现类,然后根据业务类型来执行不同的实现类方法.有点类似策略模式. 如果没有用到 Spring的话,可以使用 ServiceLoaderl类JDK自带的一个类加载器(其他框架的SPI机制也是可以实现). ServiceLoader<MyInterface> loader =

  • java中List接口与实现类介绍

    目录 List接口介绍-ArrayList ArrayList源码结论 ArrayList源码分析 总结 List接口介绍-ArrayList 有序.可重复 线程不安全,因为没有synchronized修饰 ArrayList源码结论 ArrayList中维护了一个Object类型的数组elementData. transient Object[] elementData; // transient 表示该属性不会被序列化 当创建ArrayList对象时,如果使用的是无参构造器,则初始eleme

  • Java集合之Map接口与实现类详解

    目录 初识Map Map中常用方法 HashMap LinkedHashMap TreeMap HashMap和TreeMap的比较 Hashtable 集合中元素的遍历 iterator接口中的方法 Enumeration接口中的方法 初识Map Map接口没有从Collection接口继承,Map接口用于维护“键-值”对数据,这个“键-值”对就是Map中的元素,Map提供“键(Key)”到“值(value)”的映射,一个Map中键值必须是唯一的,不能有重复的键,因为Map中的“键-值”对元素

  • Java集合之Map接口的实现类精解

    目录 HashMap类 1.HashMap类概述 2.HashMap的存储结构(底层实现原理) 3.HashMap源码中的重要常量 LinkedHashMap类 TreeMap类 1.TreeMap类概述 2.自然排序 3.定制排序 Hashtable类 Properties类 HashMap类 1.HashMap类概述 HashMap是 Map 接口使用频率最高的实现类,允许使用null键和null值,与HashSet一样,不保证映射的顺序. 所有的key构成的集合是Set:无序的.不可重复的

  • Java集合之Set接口及其实现类精解

    目录 Set接口概述 HashSet实现类 1.HashSet 具有以下特点: 2.HashSet 集合判断两个元素相等的标准 3.向HashSet中添加元素的过程 LinkedHashSet实现类 TreeSet实现类 Set接口概述 1.Set接口是Collection的子接口,set接口没有定义额外的方法,使用的都是Collection接口中的方法. 2.Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set 集合中,则添加操作失败. 3.Set:存储无序的.不可重复的数

  • 深入浅出讲解Java集合之Map接口

    目录 一.Map接口继承树 二.Map接口中的常用方法 三.源码分析 1. HashMap的底层实现原理? 2.LinkedHashMap的底层实现原理(了解) 四.Collections工具类 一.Map接口继承树 Map:双列数据,存储key-value对的数据 ---类似于高中的函数:y = f(x) A.HashMap:作为Map的主要实现类:线程不安全的,效率高:存储null的key和value a.LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序实现遍历. 原因

  • Java Map接口概述和常用方法详解

    目录 概述 Map常用子类 Map接口中的常用方法 Map集合遍历键找值方式 Entry键值对对象 Map集合遍历键值对方式 概述 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系的对象,即java.util.Map接口. 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图. Collection中的

  • Java集合框架之List ArrayList LinkedList使用详解刨析

    目录 1. List 1.1 List 的常见方法 1.2 代码示例 2. ArrayList 2.1 介绍 2.2 ArrayList 的构造方法 2.3 ArrayList 底层数组的大小 3. LinkedList 3.1 介绍 3.2 LinkedList 的构造方法 4. 练习题 5. 扑克牌小游戏 1. List 1.1 List 的常见方法 方法 描述 boolean add(E e) 尾插 e void add(int index, E element) 将 e 插入到 inde

  • Java集合框架之Stack Queue Deque使用详解刨析

    目录 1. Stack 1.1 介绍 1.2 常见方法 2. Queue 2.1 介绍 2.2 常见方法 3. Deque 3.1 介绍 3.2 常见方法 1. Stack 1.1 介绍 Stack 栈是 Vector 的一个子类,它实现了一个标准的后进先出的栈.它的底层是一个数组. 堆栈只定义了默认构造函数,用来创建一个空栈.堆栈除了包括由 Vector 定义的所有方法,也定义了自己的一些方法. 1.2 常见方法 方法 描述 E push(E item) 压栈 E pop() 出栈 E pee

  • Java集合框架源码分析之LinkedHashMap详解

    LinkedHashMap简介 LinkedHashMap是HashMap的子类,与HashMap有着同样的存储结构,但它加入了一个双向链表的头结点,将所有put到LinkedHashmap的节点一一串成了一个双向循环链表,因此它保留了节点插入的顺序,可以使节点的输出顺序与输入顺序相同. LinkedHashMap可以用来实现LRU算法(这会在下面的源码中进行分析). LinkedHashMap同样是非线程安全的,只在单线程环境下使用. LinkedHashMap源码剖析 LinkedHashM

  • Java下Struts框架中的ActionForm类详解

    ActionForm的应用 (1) .创建一个form类必须继承四个父类中的一个.比如继承ActionForm. (2) .一个form类中的每一个属性都将和页面中form 表单中的每一个元素一一对应 例如. 一个表单为: <form> <input type="text" name="username"></input> <input type="password" name="passwor

  • Java Big Number操作BigInteger及BigDecimal类详解

    目录 BigInteger类 构造函数 类方法 BigDecimal类 BigInteger类 java.math.BigInteger 类的使用场景是大整数操作.它提供类似所有Java的基本整数运算符和java.lang.Math中的所有相关的方法的操作,如+.-.*./.%.&.|.mod.>>.<<,以及min().max()等等. 只不过它操作的整数都是极其大的,为科学计算提供了很大的便利.比如下面的代码就是计算20000000000000000000 * 3000

随机推荐