目录

【1】Map使用场景

【2】概念

【3】Map 的常用方法

【4】关于Map.Entry的说明

1、Map.Entry的作用

2、Map.Entry中的常用方法

3、使用Map.Entry遍历Map集合

【5】简单介绍 TreeMap和HashMap

1、TreeMap

2、HashMap

3、TreeMap和HashMap的区别


【1】Map使用场景

Map是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。对于静态类型的查找来说,一般直接遍历或者用二分查找【不会对区间进行插入和删除操作】

而在现实生活中的查找比如:

  1. 根据姓名查询考试成绩
  2. 通讯录,即根据姓名查询联系方式
  3. 不重复集合,即需要先搜索关键字是否已经在集合中

以上等可能在查找时进行一些插入和删除的操作,即动态查找,就需要用Map进行一系列操作。

注:Map最重要的特性就是去重!

当我们平常在做题时,遇到删除重复数据,或者找每个数据重复的此时等..都可以用Map来解决

【2】概念

Map是一个接口类,该类没有继承自Collection,该类中存储的是<K,V>结构的键值对,并且K一定是唯一的,不能重复。

<K,V>使用的是 key-value模型:

key-value 模型中 key 和 value 是一个整体,就类似于 我们一提起齐天大圣,就想起孙悟空。key-value模型就是类似于这样的一组组合。【key 和 value 互相修饰】

Map使用时一些注意点:
  1. Map是一个接口,不能直接实例化对象,如果要实例化只能实例化其实现类TreeMap或者HashMap。
  2. Map中存放键值对的Key是唯一的,value是可以重复的
  3. Map中的Key可以全部分离出来,存储到Set来进行访问(因为Key不能重复)。
  4. Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(value可能有重复)。
  5. Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行重新插入。

【3】Map 的常用方法

方法 解释
V get(Object key) 返回 key 对应的 value
V getOrDefault(Object key, V defaultValue) 返回 key 对应的 value,key 不存在,返回默认值
V put(K key, V value) 设置 key 对应的 value
V remove(Object key) 删除 key 对应的映射关系
Set<K> keySet() 返回所有 key 的不重复集合
Collection<V> values() 返回所有 value 的可重复集合
Set<Map.Entry<K, V>> entrySet() 返回所有的 key-value 映射关系
boolean containsKey(Object key) 判断是否包含 key
boolean containsValue(Object value) 判断是否包含 value

Map是接口类,不能实例化对象,所以只能实例化其实现类TreeMap或者HashMap

以下以TreeMap为例

1、put方法 设置 key 对应的 value【放置元素】

    public static void main(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("abc",10);map.put("hello",20);map.put("hhf",23);System.out.println(map);//Map类重写了toString方法map.put("abc",20);//修改"abc"对应的value值System.out.println(map);}

2、get方法 返回 key 对应的值,key不存在则返回null 

    public static void main(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("abc",10);System.out.println(map.get("abc"));//10System.out.println(map.get("key"));//null}

3、getOrDefault 方法 返回 key 对应的 value,key 不存在,返回默认值

    public static void main(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("abc",10);System.out.println(map.getOrDefault("abc", 19));//找到key值,则返回对应的value,输出10System.out.println(map.getOrDefault("hello",20));//未找到key值,则返回默认值,输出20}

4、remove 删除 key 对应的映射关系

    public static void main(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("abc",10);map.put("hello",20);map.put("hhf",23);System.out.println(map);map.remove("abc");System.out.println(map);}

5、Set<K> keySet()  返回所有 key 的不重复集合,不包含value

    public static void main(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("abc",10);map.put("hello",20);map.put("hhf",23);map.put("world",20);Set<String> set = map.keySet();System.out.println(set);}

'<V>'中V为 key的包装类型

set 中使用的模型是 key模型。

 6、Collection<V> values() 返回所有 value 的可重复集合

    public static void main(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("abc",10);map.put("hello",20);map.put("hhf",23);map.put("world",20);Collection<Integer> list = map.values();System.out.println(list);}

'<V>'中V为 value 的包装类型

7、Set<Map.Entry<K, V>> entrySet() 返回所有的 key-value 映射关系【重要】

entrySet方法能把TreeMap中的键值对打包,放入Set集合中。

    public static void main(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("abc",10);map.put("hello",20);map.put("hhf",23);Set<Map.Entry<String,Integer>> entrySet = map.entrySet();}

上述代码中,map调用entrySet方法,把其内部的值全部打包为  Map.Entry<String,Integer> 类型,然后存储在 entrySet 变量中。

8、boolean containsKey(Object key) 判断是否包含 key

    public static void main(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("abc",10);map.put("hello",20);map.put("hhf",23);System.out.println(map.containsKey("hello"));// trueSystem.out.println(map.containsKey("world"));// fasle}

9、boolean containsValue(Object value) 判断是否包含 value

    public static void main(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("abc",10);map.put("hello",20);map.put("hhf",23);System.out.println(map.containsValue(20));// trueSystem.out.println(map.containsValue(50));// false}

【4】关于Map.Entry<K, V>的说明

Map.Entry<K, V> 是Map内部实现的用来存放<key, value>键值对映射关系的内部类

Entry是Map接口里面的接口

所以 TreeMap类实现Map接口时,也会具体实现Entry接口,HashMap内部也是如此

1、Map.Entry的作用

Map.Entry是为了更方便的输出Map键值对。一般情况下,要输出Map中的key 和 value  是先得到key的集合keySet(),然后再迭代(循环)由每个key得到每个value。values()方法是获取集合中的所有值,不包含键,没有对应关系。而Entry可以一次性获得这两个值。

2、Map.Entry中的常用方法

方法 解释
K getKey() 返回 entry 中的 key
V getValue() 返回 entry 中的 value
V setValue(V value) 将键值对中的value替换为指定value/2、

这些方法都会结合着for循环进行操作,具体使用往下看

3、使用Map.Entry遍历Map集合

    public static void main(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("abc",10);map.put("hello",20);map.put("hhf",23);Set<Map.Entry<String,Integer>> entrySet = map.entrySet();for(Map.Entry<String,Integer> entry : entrySet){System.out.println("key: "+entry.getKey()+" value: "+entry.getValue());}}

【5】简单介绍 TreeMap和HashMap

1、TreeMap

TreeMap底层是一颗搜索树。而搜索树的插入是需要比较大小的,而TreeMap通过key来比较大小!所以key一定是编译器可以自动比较大小的。

    public static void main(String[] args) {Map<Integer,Integer> map1 = new TreeMap<>();Map<String,Integer> map2 = new TreeMap<>();map1.put(2,5);map1.put(1,9);map1.put(10,4);map2.put("hello",2);map2.put("world",20);map2.put("weiwei",35);System.out.println(map1);System.out.println(map2);}

当我们实现TreeMap类后,往里面传入自定义类就会报错!

所以,要想放入自定义类型,就要满足一下两个条件之一

1.自定义类型要实现Comparable ,重写compareTo

class People implements Comparable{public int age;public int money;@Overridepublic int compareTo(Object o) {return 0;}
}public class Test3 {public static void main(String[] args) {Map<People,Integer> map = new TreeMap<>();map.put(new People(),10);System.out.println(map);}
}

2.实例化对象时传入一个比较器

class People implements{public int age;public int money;}public class Test3 {public static void main(String[] args) {Map<People,Integer> map = new TreeMap<>(new Comparator<People>() {@Overridepublic int compare(People o1, People o2) {return 0;}});map.put(new People(),10);System.out.println(map);}
}

以上两种方法,其实都是在告诉集合,自定义类型如何比较大小

同时不能放null,否则就会报错

如果两次put的key值一样,那么val值就会被替换掉

2、HashMap

HashMap底层是一颗红黑树,存储的无序的,所以自定义类型和null都能直接存储,不会报错。

3、TreeMap和HashMap的区别

TreeMap 和 HashMap 底层实现逻辑不同,所以插入时间、删除时间、插入方法等都不相同

具体如下:

Map底层结构 TreeMap HashMap
底层结构 红黑树 哈希桶
插入/删除/查找时间
复杂度
O(1)
是否有序 关于Key有序 无序
线程安全 不安全 不安全
插入/删除/查找区别 需要进行元素比较 通过哈希函数计算哈希地址
比较与覆写 key必须能够比较,否则会抛出
ClassCastException异常
自定义类型需要覆写equals和
hashCode方法
应用场景 需要Key有序场景下 Key是否有序不关心,需要更高的
时间性能

【Java】Map介绍和使用相关推荐

  1. java coin介绍_代码示例中的Java 7:Project Coin

    java coin介绍 该博客通过代码示例介绍了一些新的Java 7功能,这些项目在Project Coin一词下进行了概述. Project Coin的目标是向JDK 7添加一组小的语言更改.这些更 ...

  2. js 中转换成list集合_程序员:java集合介绍-List,具说很详细,你不来看看?

    Java集合介绍 作为一个程序猿,Java集合类可以说是我们在工作中运用最多.最频繁的类.相比于数组(Array)来说,集合类的长度可变,更加方便开发. Java集合就像一个容器,可以存储任何类型的数 ...

  3. Java Map中那些巧妙的设计

    简介: 他山之石可以攻玉,这些巧妙的设计思想非常有借鉴价值,可谓是最佳实践.然而,大多数有关Java Map原理的科普类文章都是专注于"点",并没有连成"线", ...

  4. ​Java Map中那些巧妙的设计

    最近拜读了一些Java Map的相关源码,不得不惊叹于JDK开发者们的鬼斧神工.他山之石可以攻玉,这些巧妙的设计思想非常有借鉴价值,可谓是最佳实践.然而,大多数有关Java Map原理的科普类文章都是 ...

  5. Java编程语言-介绍

    Java编程语言-介绍 Java是一种编程语言,被特意设计用于互联网的分布式环境.Java具有类似于C++语言的"形式和感觉",但它要比C++语言更易于使用,而且在编程时彻底采用了 ...

  6. Java~Map集合详解

    文章目录 Map介绍 核心Map 内部哈希:哈希映射技术 常用方法 遍历Map Map介绍 java.util中的集合类包含Java中某些最常用的类,其中最常用的集合类就是List和Map. 并且在集 ...

  7. Java map 知识

    Java map: Map 接口中键和值一一映射. 可以通过键来获取值 map 的方法如下: 序号 方法描述 1 void clear( )  从此映射中移除所有映射关系(可选操作). 2 boole ...

  8. java map 教程_Java Map接口

    Java Map接口 在本教程中,我们将学习Java Map接口及其方法. Java collections框架的Map接口提供了Map数据结构的功能. 它实现了Collection接口. map的工 ...

  9. 流行的9个Java框架介绍: 优点、缺点等等

    流行的9个Java框架介绍: 优点.缺点等等 在 2018年,Java仍然是世界上最流行的编程语言.它拥有一个巨大的生态系统,在全世界有超过900万Java开发人员.虽然Java不是最直接的语言,但是 ...

  10. Android下HelloWorld项目的R.java文件介绍

    R.java文件介绍 HelloWorld工程中的R.java文件 package com.android.hellworld; public final class R {     public s ...

最新文章

  1. 【持续更新】C++中string类使用总结
  2. virtualbox下给centos7固定ip
  3. python学习-知识点回顾(Python3的安装,编译器、一些关键知识点、数据类型、数据类型转换、运算符优先级)
  4. 按小时分组mysql 补齐_分组记录按小时或按天白天和mysql的
  5. 复试导师问题——前沿科技
  6. AKKA:大数据下的并发编程模型
  7. 【省选模拟】20/04/18
  8. 安装win7时,出现“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”的处理方式
  9. Task.Result卡死问题
  10. 蒟蒻的网络流24题解题记
  11. ASP.NET Core MVC 之局部视图(Partial Views)
  12. lab 颜色模式的生理原因 黄色, 洋红色 刺眼。 绿色,蓝色,不刺眼。
  13. 织梦CMS建站系统被曝漏洞 几十万网站沦为木马网站
  14. 一文搞懂“如何通过群晖+DNSPod DDNS搭建私有云服务?”
  15. [java] 汇率换算器实现-插曲1-正则表达式(1)
  16. 【Unity】窗口失去焦点后继续游戏处理
  17. python自动化之word操作用python做邀请函
  18. 静态页面如何引入head.html和foot.html
  19. 维克森林大学计算机科学专业好不好,备受推崇的维克森林大学到底是什么样的?...
  20. 【Android Gradle 插件】AaptOptions 配置 ⑥ ( Overlay 重叠包机制 | AaptOptions#additionalParameters 附加参数配置 )

热门文章

  1. 超级台阶 动态规划+斐波那契数列+打表(水题)
  2. P4:编程网络的转发平面
  3. 修复损坏的SQLite数据库文件(database disk image is malformed)
  4. 数据治理项目经验分享
  5. 老毛桃winpe优盘启动系统个性修改全攻略
  6. python安装time模块失败_python2.7因ImportError失败:cygwin下没有名为time的模块
  7. chatgpt 正向案例 - 书单 表达情感,描写
  8. 织梦自定义php文件,织梦创建独立PHP文件调用解析dede标签
  9. Idea 启动play
  10. MySQL远程访问配置