【Java】如何理解Java中的双列集合Map?

1 Map<K,V>接口

1.1 特点

  1. 双列集合一个元素包含俩值
  2. Key不可以重复,Value可以重复
  3. Key和Value一一对应
  4. Key和Value可以时任意类型

1.2 常用方法

public V put(K key, V value): 不重复返回null,重复返回value

	public static void main(String[] args) {Map<String, Integer> persons = new HashMap<>();persons.put("张三",19);Integer out1 = persons.put("李四", 20);Integer out2 = persons.put("李四", 30);System.out.println(out1);//不重复返回nullSystem.out.println(out2);//重复返回原来的value=20System.out.println(persons);//{李四=30, 张三=19}}

public V remove(Object Key):指定键,删除键值对,返回删除键对应的值,键不存在则返回null

    public static void main(String[] args) {Map<String, Integer> persons = new HashMap<>();persons.put("张三",19);persons.put("李四", 20);Integer out1 = persons.remove("张三");System.out.println(persons);//{李四=20}System.out.println(out1);//19Integer out2 = persons.remove("王五");System.out.println(out2);//null}

public V get(Object Key):通过键来获取值

    public static void main(String[] args) {Map<String, Integer> persons = new HashMap<>();persons.put("张三",19);System.out.println(persons.get("张三"));//19System.out.println(persons.get("李四"));//null}

public boolean containsKey(Object Key):键是否存在

    public static void main(String[] args) {Map<String, Integer> persons = new HashMap<>();persons.put("张三",19);System.out.println(persons.containsKey("张三"));//trueSystem.out.println(persons.containsKey("李四"));//false}

1.3 遍历Map集合

方法1:遍历键找值法

public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("张三",19);map.put("李四",20);map.put("王五",21);//1. 取出Map的所有key存在Set中Set<String> set = map.keySet();//2.1 while遍历set,获取key,map.get获取valueIterator<String> it = set.iterator();while(it.hasNext()){String key = it.next();Integer value = map.get(key);System.out.println(key + " " + value);}//2.2 foreach法遍历for(String key: set){System.out.println(key + " " + map.get(key));}}

方法2: Entry键值对对象
Map接口中有一个内部接口Entry
作用:Map一创建,就在Map中创建一个Entry对象,用来记录键和值,得到二者的映射关系。(相当于结婚证)

  1. Set<Map.Entry<K, V>> entrySet() 把Map集合的多个Entry对象取出存在Set集合中。
  2. 遍历Set集合,获取每个Entry对象。
  3. getKey()获取Key,getValue()获取Value。
public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("张三",19);map.put("李四",20);map.put("王五",21);//1. 取出Map的所有entry对象存在Set中Set<Map.Entry<String, Integer>>set = map.entrySet();//2.1 while遍历set,获取entry,再分别getKey和ValueIterator<Map.Entry<String, Integer>> it = set.iterator();while(it.hasNext()){Map.Entry<String, Integer> entry = it.next();String key = entry.getKey();Integer value = entry.getValue();System.out.println(key + " " + value);}//2.2 foreach法遍历for(Map.Entry<String, Integer> entry: set){System.out.println(entry.getKey() + " " + entry.getValue());}}

2 Map接口的实现类—— HashMap

2.1 特点

  1. 底层是哈希表(JDK1.8后:数组+链表/红黑树) 查询快
  2. 无序集合,存取无序

2.2 存储自定义类型键值

注意:因为Map集合要保证Key是唯一的,所以作为Key的元素必须重写hashCode方法equals方法,从而保证Key的唯一性。

public static void main(String[] args) {Map<Person, Integer> map1 = new HashMap<Person, Integer>();map1.put(new Person("李四",10),170);map1.put(new Person("李四",10),180);System.out.println(map1);//重写前输出:{Person{name='李四', age=10}=180, Person{name='李四', age=10}=170}//重写后输出:{Person{name='李四', age=10}=180}}

3 HashMap的子类——LinkedHashMap

3.1 特点

  1. 底层是哈希表+链表 保证迭代顺序
  2. 有序集合,存取有序

3.2 使用示例

public static void main(String[] args) {HashMap<String, Integer> map1 = new HashMap<String, Integer>();map1.put("a",1);map1.put("c",3);map1.put("b",2);System.out.println(map1);//存和取顺序不同 {a=1, b=2, c=3}LinkedHashMap<String, Integer> map2 = new LinkedHashMap<>();map2.put("a",1);map2.put("c",3);map2.put("b",2);System.out.println(map2);//存和取顺序相同{a=1, c=3, b=2}}

4 Map接口的实现类——Hashtable

4.1 Hashtable的特点

  1. 键和值都不可以为空。
  2. 最早的双列集合,JDK1.0就有。
  3. 它是单线程的,同步的,线程安全,速度慢。
  4. 底层是一个哈希表。
  5. 和vector(ArrayList)一样再JDK1.2后被HashMap取代了。
  6. Hashtable的子类Properties集合是唯一一个和IO流结合的集合。【仍活跃】

4.2 示例

    public static void main(String[] args) {Hashtable<String,String> ht = new Hashtable<>();HashMap<String, String> hm = new HashMap<>();hm.put(null,null);hm.put("a",null);hm.put(null,"b");System.out.println(hm);//{null=b, a=null}
//      ht.put(null,null);
//      报错:java.lang.NullPointerException}

5 Map集合练习

5.1 统计字符出现次数

遍历字符串:charAt加索引遍历 / toCharArray转为数组
for(int i = 0; i < str.length(); i++) —> str.charAt(i)
for(char c: str.toCharArray()) —> c

public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str = sc.next();Map<Character, Integer> map = new HashMap<>();char[] strArray = str.toCharArray();for (int i = 0; i < strArray.length; i++) {if(!map.containsKey(strArray[i])){map.put(strArray[i],1);}else{int value = map.get(strArray[i]);map.put(strArray[i],++value);}}System.out.println(map);}

5.2 斗地主升级版-玩家牌有序

public static void main(String[] args) {//1. 准备牌面String[] colors = {"♥","♠","♦","♣"};String[] nums = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};HashMap<Integer, String> pocker = new HashMap<>();pocker.put(0,"BK");pocker.put(1,"SK");int count = 2;for(String num: nums){for(String color: colors){pocker.put(count++,color+num);}}System.out.println(pocker);//2. 洗牌:打乱编号Set<Integer> set = pocker.keySet();ArrayList<Integer> list = new ArrayList<>();list.addAll(set);Collections.shuffle(list);ArrayList<Integer> left = new ArrayList<>();ArrayList<Integer> p1 = new ArrayList<>();ArrayList<Integer> p2 = new ArrayList<>();ArrayList<Integer> p3 = new ArrayList<>();for (int i = 0; i < pocker.size(); i++) {Integer p = list.get(i);if(i>=51){left.add(p);}else{if(i%3 == 0){p1.add(p);}else if(i%3 == 1){p2.add(p);}else{p3.add(p);}}}//3. 发牌:对编号排序 取出标号对应的值Collections.sort(p1);Collections.sort(p2);Collections.sort(p3);Collections.sort(left);ArrayList<String> player1 = new ArrayList<String>();ArrayList<String> player2 = new ArrayList<String>();ArrayList<String> player3 = new ArrayList<String>();ArrayList<String> dipai = new ArrayList<String>();for(Integer i : p1){player1.add(pocker.get(i));}for(Integer i : p2){player2.add(pocker.get(i));}for(Integer i : p3){player3.add(pocker.get(i));}for(Integer i : left){dipai.add(pocker.get(i));}//4. 看牌System.out.println(player1);System.out.println(player2);System.out.println(player3);System.out.println(dipai);}

6 JDK9对集合添加的优化

Java9中添加了几种集合工厂方法,更方便创建少量元素的集合、map实例。新的ListSetMap的静态工厂方法可以更方便地创建集合的不可变实例。
使用前提:集合中存储的元素个数已经确定,不再改变时使用
注意

  1. 只适用于ListSetMap三个接口
  2. 它是不能改变的集合,不可再用add和put
  3. 不可以在调用时含有相同元素

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/481010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术动态 | 清华大学开源OpenKE:知识表示学习平台

本文转载自公众号机器之心&#xff0c;选自 THUNLP。 清华大学自然语言处理实验室近日发布了 OpenKE 平台&#xff0c;整合了 TransE、TransH、TransR、TransD、RESCAL、DistMult、HolE、ComplEx 等算法的统一接口高效实…

多任务学习时转角遇到Bandit老虎机

注&#xff1a;本文的正文干货转载并少量修改自大佬覃含章&#xff08;知乎id同名&#xff0c;知乎必关的数值优化大佬啊啊&#xff09;的一篇知乎回答&#xff0c;链接https://www.zhihu.com/question/53381093/answer/562235053一个转角事情是这样的&#xff0c;最近小夕在做…

NLP13-LDA引发的一系活动

摘要&#xff1a; 目标是想了解也学习LDA&#xff0c;寻找学习LDA相关资料&#xff0c;学习LDA相关的概率基础&#xff0c;对于LSI&#xff0c;pLsa,LDA作为主题模型的对比&#xff1b;然后到LDA本身&#xff0c;对LDA相关的概率基础进行学习。把相关资料疏理与集合起来。

王昊奋 | 从聊天机器人到虚拟生命:AI技术的新机遇

本文转载自公众号中国人工智能学会。 10月12-13日&#xff0c;第七届中国智能产业高峰论坛在佛山开幕&#xff0c;在NLP与服务机器人专题论坛上&#xff0c;深圳狗尾草CTO王昊奋发表了主题为《从聊天机器人到虚拟生命&#xff1a;AI技术的新机遇》的精彩演讲。 以下是王昊奋老师…

【Java】如何理解Java中的异常机制?

1 异常的概念 程序在执行过程中出现非正常线性&#xff0c;导致JVM非正常停止异常不是语法错误 2 异常的分类 Throwable是所有错误或异常的超类Exception是编译期间异常&#xff08;写代码时IDE会报错&#xff09;RuntimeException时运行期异常&#xff0c;程序运行时出现的…

文本匹配相关方向总结(数据,场景,论文,开源工具)

Motivation 前不久小夕在知乎上写了一个回答《NLP有哪些独立研究方向》&#xff0c;于是有不少小伙伴来问分类和匹配的参考资料了&#xff0c;鉴于文本分类的资料已经超级多了&#xff0c;就不写啦&#xff08;不过分类相关的tricks可以看之前写的这篇文章《文本分类重要tricks…

机器学习】LDA线性判别分析

【机器学习】LDA线性判别分析1. LDA的基本思想2. LDA求解方法3. 将LDA推广到多分类4. LDA算法流程5. LDA和PCA对比【附录1】瑞利商与广义瑞利商线性判别分析 (Linear Discriminant Analysis&#xff0c;LDA)是一种经典的线性学习方法&#xff0c;在二分类问题上因为最早由[Fish…

科普 | 动态本体简介

本文转载自知乎专栏知识图谱和智能问答。 1 近年来&#xff0c;随着语义Web的兴起&#xff0c;本体技术受到了广泛关注。很多大型跨国公司都开始研究本体技术。谷歌于2012年提出了知识图谱的项目&#xff0c;旨在利用本体技术来提高搜索的精度和更智能化的知识浏览。国内的互联…

【LeetCode】4月3日打卡-Day19-字符串转整数

描述 请你来实现一个 atoi 函数&#xff0c;使其能将字符串转换成整数。 首先&#xff0c;该函数会根据需要丢弃无用的开头空格字符&#xff0c;直到寻找到第一个非空格的字符为止。接下来的转化规则如下&#xff1a; 如果第一个非空字符为正或者负号时&#xff0c;则将该符号与…

文本匹配相关方向打卡点总结

Motivation前不久小夕在知乎上写了一个回答《NLP有哪些独立研究方向》[1]&#xff0c;于是有不少小伙伴来问分类和匹配的参考资料了&#xff0c;鉴于文本分类的资料已经超级多了&#xff0c;就不写啦&#xff08;不过分类相关的tricks可以看之前写的这篇文章《文本分类重要tric…

深入理解K-Means聚类算法

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/taoyanqi8932/article/details/53727841 </div><link rel"stylesheet" href"https://csdnimg.cn/release/phoenix/template/css/ck_htmledit…

刘挺 | 从知识图谱到事理图谱

本文转载自 AI科技评论。 在“知识图谱预见社交媒体”的技术分论坛上&#xff0c;哈尔滨工业大学刘挺教授做了题为“从知识图谱到事理图谱”的精彩报告。会后AI科技评论征得刘挺教授的同意&#xff0c;回顾和整理了本次报告的精彩内容。 刘挺教授 刘挺教授的报告内容分为四部分…

我对JVM的理解

一、JVM简介 JVM总体上是由类装载子系统&#xff08;ClassLoader&#xff09;、运行时数据区、执行引擎、内存回收这四个部分组成。 其中我们最为关注的运行时数据区&#xff0c;也就是JVM的内存部分则是由方法区&#xff08;Method Area&#xff09;、JAVA堆&#xff0…

【LeetCode】4月4日打卡-Day20-接雨水

描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图&#xff0c;在这种情况下&#xff0c;可以接 6 个单位的雨水&#xff08;蓝色部分表示雨水&a…

算法与数据结构--空间复杂度O(1)遍历树

大家好~我叫「小鹿鹿鹿」&#xff0c;是本卖萌小屋的第二位签约作&#xff08;萌&#xff09;者&#xff08;货&#xff09;。和小夕一样现在在从事NLP相关工作&#xff0c;希望和大家分享NLP相关的、不限于NLP的各种小想法&#xff0c;新技术。这是我的第一篇试水文章&#xf…

PCA主成分分析学习总结

大概主成分分析&#xff08;Principal components analysis&#xff0c;以下简称PCA&#xff09;是最重要的降维方法之一。在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用。一般我们提到降维最容易想到的算法就是PCA&#xff0c;下面我们就对PCA的原理做一个总结。首先…

技术动态 | 大规模中文概念图谱CN-Probase正式发布

本文转载自公众号知识工场。 历时多年的研发&#xff0c;复旦大学知识工场实验室正式推出大规模中文概念图谱——CN-Probase&#xff0c;用于帮助机器更好的理解人类语言。概念图谱中包含实体&#xff08;比如“刘德华”&#xff09;、概念&#xff08;比如“演员”&#xff09…

生产Docker应用重启排查经历

一、现象描述 近期&#xff0c;生产云平台监控发生Docker应用重启次数过多事故报警&#xff0c;经观察发现某些Docker应用不定期地出现重启现象&#xff0c;已严重影响服务正常提供 生产应用重启的判断条件&#xff1a;健康检查连续3次检查不通过 生产健康检查间隔时间设置为…

【Java】深入理解Java线程

1 相关概念 并发&#xff1a;两个或多个事件在同一时间段内发生【多个任务交替执行】 并行&#xff1a;两个或多个事件在同一时刻发生【多个任务同时执行】 进程&#xff1a;进入内存的程序 内存&#xff1a;所有应用程序都要进入到内存中执行 临时存储RAM 线程&#xff1a;进…

2019 年,智能问答(Question Answering)的主要研究方向有哪些?

前言自从小夕前不久推送了这篇《文本匹配打卡点总结》&#xff0c;收到了不少小伙伴对于问答方向的问题&#xff0c;其中问的最多的就是&#xff0c;求&#xff01;更&#xff01;多&#xff01;论&#xff01;文&#xff01;好了&#xff0c;于是小夕就在万能的知乎上找到了这…