一、Map接口

1.Map接口概述

将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值。

2.Map接口和Collection接口的不同

①Map是双列的,Collection是单列的。
②Map的键唯一,Collection的子体系Set是唯一的。
③Map集合的数据结构值针对键有效,跟值无关,Collection集合的数据结构是针对元素有效。

3.Map接口成员方法

①添加功能

V put(K key,V value)
添加元素。
如果键是第一次存储,就直接存储元素,返回null。
如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值。

②删除功能

void clear()
移除所有的键值对元素。
V remove(Object key)
根据键删除键值对元素,并把值返回。

③判断功能

boolean containsKey(Object key)
判断集合是否包含指定的键。
boolean containsValue(Object value)
判断集合是否包含指定的值。
boolean isEmpty()
判断集合是否为空。

④获取功能

Set<Map.Entry<K,V>> entrySet()
返回键值对对象的集合。
V get(Object key)
根据键获取值。
Set keySet()
获取集合中所有键的集合。
Collection values()
获取集合中所有值的集合。

⑤长度功能

int size()
返回集合中的键值对的对数。

3.Map集合的遍历:

方式1:根据键找值

①获取所有的键。
②遍历键的集合,获取得到每一个键。
③根据键去找值。

import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MapDemo {public static void main(String[] args) {// 创建集合对象Map<String, String> map = new HashMap<String, String>();// 创建元素并添加到集合map.put("杨过", "小龙女");map.put("郭靖", "黄蓉");map.put("杨康", "穆念慈");map.put("陈玄风", "梅超风");// 遍历// 获取所有的键Set<String> set = map.keySet();// 遍历键的集合,获取得到每一个键for (String key : set) {// 根据键去找值String value = map.get(key);System.out.println(key + "---" + value);}}
}

方式2:根据键值对对象找键和值

①获取所有键值对对象的集合。
②遍历键值对对象的集合,获取到每一个键值对对象。
③根据键值对对象找键和值。

import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MapDemo {public static void main(String[] args) {// 创建集合对象Map<String, String> map = new HashMap<String, String>();// 创建元素并添加到集合map.put("杨过", "小龙女");map.put("郭靖", "黄蓉");map.put("杨康", "穆念慈");map.put("陈玄风", "梅超风");// 获取所有键值对对象的集合Set<Map.Entry<String, String>> set = map.entrySet();// 遍历键值对对象的集合,得到每一个键值对对象for (Map.Entry<String, String> me : set) {// 根据键值对对象获取键和值String key = me.getKey();String value = me.getValue();System.out.println(key + "---" + value);}}
}

Map集合遍历的两种方式比较图解

二、HashMap类

1.HashMap类概述

是基于哈希表的Map接口实现,键是哈希表结构,可以保证键的唯一性。

2.HashMap案例

HashMap<Student,String>

import java.util.HashMap;
import java.util.Set;/** HashMap<Student,String>* 键:Student*       要求:如果两个对象的成员变量值都相同,则为同一个对象。* 值:String*/
public class HashMapDemo {public static void main(String[] args) {// 创建集合对象HashMap<Student, String> hm = new HashMap<Student, String>();// 创建学生对象Student s1 = new Student("貂蝉", 27);Student s2 = new Student("王昭君", 30);Student s3 = new Student("西施", 33);Student s4 = new Student("杨玉环", 35);Student s5 = new Student("貂蝉", 27);//需要重写student类中hashCode和equals方法保证唯一性// 添加元素hm.put(s1, "8888");hm.put(s2, "6666");hm.put(s3, "5555");hm.put(s4, "7777");hm.put(s5, "9999");// 遍历Set<Student> set = hm.keySet();for (Student key : set) {String value = hm.get(key);System.out.println(key.getName() + "---" + key.getAge() + "---"+ value);}}
}

3.LinkedHashMap类概述

Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。

  • 由哈希表保证键的唯一性。
  • 由链表保证键盘的有序(存储和取出的顺序一致而非排序)。

三、TreeMap类

1.TreeMap类概述

TreeMa是基于红黑树的Map接口的实现,键是红黑树结构,可以保证键的排序和唯一性。
键相同,值覆盖。

2.TreeMap案例

TreeMap<Student,String>

import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;/** TreeMap<Student,String>* 键:Student* 值:String*/
public class TreeMapDemo {public static void main(String[] args) {// 创建集合对象TreeMap<Student, String> tm = new TreeMap<Student, String>(new Comparator<Student>() {@Overridepublic int compare(Student s1, Student s2) {// 主要条件int num = s1.getAge() - s2.getAge();// 次要条件int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;return num2;}});// 创建学生对象Student s1 = new Student("潘安", 30);Student s2 = new Student("柳下惠", 35);Student s3 = new Student("唐伯虎", 33);Student s4 = new Student("燕青", 32);Student s5 = new Student("唐伯虎", 33);// 存储元素tm.put(s1, "宋朝");tm.put(s2, "元朝");tm.put(s3, "明朝");tm.put(s4, "清朝");tm.put(s5, "汉朝");// 遍历Set<Student> set = tm.keySet();for (Student key : set) {String value = tm.get(key);System.out.println(key.getName() + "---" + key.getAge() + "---"+ value);}}
}

思考题

思考1:
"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)

答:

import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;/** 需求 :"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)* * 分析:*        A:定义一个字符串(可以改进为键盘录入)*       B:定义一个TreeMap集合*            键:Character*            值:Integer*       C:把字符串转换为字符数组*      D:遍历字符数组,得到每一个字符*        E:拿刚才得到的字符作为键到集合中去找值,看返回值*           是null:说明该键不存在,就把该字符作为键,1作为值存储*            不是null:说明该键存在,就把值加1,然后重写存储该键和值*       F:定义字符串缓冲区变量*       G:遍历集合,得到键和值,进行按照要求拼接*        H:把字符串缓冲区转换为字符串输出* * 录入:linqingxia* 结果:result:a(1)g(1)i(3)l(1)n(2)q(1)x(1)*/
public class TreeMapDemo {public static void main(String[] args) {// 定义一个字符串(可以改进为键盘录入)Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串:");String line = sc.nextLine();// 定义一个TreeMap集合TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();//把字符串转换为字符数组char[] chs = line.toCharArray();//遍历字符数组,得到每一个字符for(char ch : chs){//拿刚才得到的字符作为键到集合中去找值,看返回值Integer i =  tm.get(ch);//是null:说明该键不存在,就把该字符作为键,1作为值存储if(i == null){tm.put(ch, 1);}else {//不是null:说明该键存在,就把值加1,然后重写存储该键和值i++;tm.put(ch,i);}}//定义字符串缓冲区变量StringBuilder sb=  new StringBuilder();//遍历集合,得到键和值,进行按照要求拼接Set<Character> set = tm.keySet();for(Character key : set){Integer value = tm.get(key);sb.append(key).append("(").append(value).append(")");}//把字符串缓冲区转换为字符串输出String result = sb.toString();System.out.println("result:"+result);}
}

思考2:
HashMap和Hashtable的区别?

答:

Hashtable:线程安全,效率低。不允许null键和null值。
HashMap:线程不安全,效率高。允许null键和null值。

思考3:
List,Set,Map等接口是否都继承子Map接口?

答:

List,Set不是继承自Map接口,它们继承自Collection接口。
Map接口本身就是一个顶层接口。

四、Collections类

1.Collections类概述

针对集合操作的工具类。

思考题

思考1:
Collection和Collections的区别?

答:

Collection是单列集合的顶层接口,有子接口List和Set。
Collections是针对集合操作的工具类,有对集合进行排序和二分查找的方法。

2.Collections成员方法

public static void sort(List list)
排序,默认情况下是自认排序。
public static int binarySearch(List<?> list,T key)
二分查找。
public static T max(Collection<?> coll)
最大值。
public static void reverse(List<?> list)
反转。
public static void shuffle(List<?> list)
随机置换。

思考题

思考1
自定义对象如果同时有自然排序和比较器排序,以谁为主?

答:

 // 排序// 自然排序// Collections.sort(list);// 比较器排序// 如果同时有自然排序和比较器排序,以比较器排序为主Collections.sort(list, new Comparator<Student>() {@Overridepublic int compare(Student s1, Student s2) {int num = s2.getAge() - s1.getAge();int num2 = num == 0 ? s1.getName().compareTo(s2.getName()): num;return num2;}});

思考2:模拟斗地主洗牌和发牌

答:
模拟斗地主洗牌和发牌并对牌进行排序的原理图解

/** 思路:*      A:创建一个HashMap集合*        B:创建一个ArrayList集合*      C:创建花色数组和点数数组*      D:从0开始往HashMap里面存储编号,并存储对应的牌*        同时往ArrayList里面存储编号即可。*      E:洗牌(洗的是编号)*      F:发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)*      G:看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)*/import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;public class PokerDemo {public static void main(String[] args) {// 创建一个HashMap集合HashMap<Integer, String> hm = new HashMap<Integer, String>();// 创建一个ArrayList集合ArrayList<Integer> array = new ArrayList<Integer>();// 创建花色数组和点数数组// 定义一个花色数组String[] colors = { "♠", "♥", "♣", "♦" };// 定义一个点数数组String[] numbers = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q","K", "A", "2", };// 从0开始往HashMap里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号即可。int index = 0;for (String number : numbers) {for (String color : colors) {String poker = color.concat(number);hm.put(index, poker);array.add(index);index++;}}hm.put(index, "小王");array.add(index);index++;hm.put(index, "大王");array.add(index);// 洗牌(洗的是编号)Collections.shuffle(array);// 发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)TreeSet<Integer> fengQingYang = new TreeSet<Integer>();TreeSet<Integer> linQingXia = new TreeSet<Integer>();TreeSet<Integer> liuYi = new TreeSet<Integer>();TreeSet<Integer> diPai = new TreeSet<Integer>();for (int x = 0; x < array.size(); x++) {if (x >= array.size() - 3) {diPai.add(array.get(x));} else if (x % 3 == 0) {fengQingYang.add(array.get(x));} else if (x % 3 == 1) {linQingXia.add(array.get(x));} else if (x % 3 == 2) {liuYi.add(array.get(x));}}// 看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)lookPoker("风清扬", fengQingYang, hm);lookPoker("林青霞", linQingXia, hm);lookPoker("刘意", liuYi, hm);lookPoker("底牌", diPai, hm);}// 写看牌的功能public static void lookPoker(String name, TreeSet<Integer> ts,HashMap<Integer, String> hm) {System.out.print(name + "的牌是:");for (Integer key : ts) {String value = hm.get(key);System.out.print(value + " ");}System.out.println();}
}

【Java基础】-【集合:Map接口 】相关推荐

  1. Java基础—集合2Set接口和Map接口

    第一讲 Set 一 概述 Set:1. 元素存储无下标,所以元素是无序(存入和取出的顺序不一定一致) 2. 元素不可以重复 |--HashSet:底层数据结构是哈希表.线程不同步. 保证元素唯一性的原 ...

  2. java基础—集合框架

    java基础-集合框架 JDK1.2开始引入了集合框架的概念,以弥补java中只有数组这种容器的单一问题,这些框架多数由接口构成,另外也包含了一些对于接口实现的类,其中这些接口的最上层接口为java. ...

  3. (7)Java数据结构--集合map,set,list详解

    MAP,SET,LIST,等JAVA中集合解析(了解) - clam_clam的专栏 - CSDN博---有颜色, http://blog.csdn.net/clam_clam/article/det ...

  4. Java集合类之Map接口之学生花名册

    Java集合类之Map接口之学生花名册 任务描述 把给定的学生花名册数据添加到 Map 集合中. 相关知识 在 Java 的集合体系中,主要包含 Collection 接口以及 Map 接口,将介绍 ...

  5. 2021-06-19复习java Collection集合 Iterator接口_迭代器 增强for循环 泛型

    2021-06-19复习java Collection集合 Iterator接口_迭代器 增强for循环 泛型 Collection集合 java.util.coLlection接口 所有单列集合的最 ...

  6. Java基础---集合的概述---list、set、map、泛型、collections

    集合的概述 单列集合的体系: Collection 单列集合的顶层接口 List Collection的子接口,增加了一些特有的方法,有序 可以重复 有索引 ArrayList 底层采用的数组结构实现 ...

  7. Java基础 - 集合框架(5) : Map集合、Collections

    1. Map集合的概述和特点 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 2. Map和Collection的区别 ? A. Map 存储的是键值对形式的元素,键唯一,值 ...

  8. Java集合——Map接口学习总结

    一.HashMap实现类 1.常用方法 增加:put(K key, V value)删除:clear() remove(Object key)修改:查看:entrySet() get(Object k ...

  9. Java从零开始学二十三(集合Map接口)

    一.Map接口 Collection.Set.List接口都属于单值的操作,即:每次只能操作一个对象,而Map与它们不同的是,每次操作的是一对对象,即二元偶对象,Map中的每个元素都使用key à v ...

  10. java基础----集合之Map集合基本方法的使用以及遍历

    package com.henu;import java.util.Collection; import java.util.HashMap; import java.util.Map; import ...

最新文章

  1. POJ1258 Agri-Net【最小生成树】
  2. 数据库综合设计java_JAVA程序综合设计数据库设计_
  3. 前端常见跨域问题解决方案
  4. jvm执行引擎全解,java解释器即时编译器,全都讲明白
  5. 防雷检测仪器设备清单 万佳防雷检测机构 一类建筑物避雷验收
  6. jvm 错误_JVM因“ OutOfMemory”错误而关闭-我该怎么办?
  7. react中绑定点击事件_在React中绑定事件处理程序的最佳方法
  8. android执行main函数,AndroidStudio执行main方法报错
  9. readfile函数使用方法_1分钟学会LOOKUP函数,有网友说使用这个方法,初学者秒变大神...
  10. shell与subshell与执行脚本的几种方式
  11. java年月日时分秒格式_Java 日期时间 LocalDate LocalTime LocalDateTime类
  12. Java基础学习总结(144)——String类为什么要被定义为不可变类
  13. java linux 格式化磁盘,Linux添加新硬盘、分区、格式化、自动挂载
  14. BZOJ 1673 [Usaco2005 Dec]Scales 天平:dfs 启发式搜索 A*搜索
  15. 格式工厂 wav 比特率_IQmango Converter下载-IQmango Converter(音视频格式转换工具)v3.4.6免费版...
  16. 安卓6.0获取相机权限
  17. 图像质量评价方法介绍
  18. 整理了上千个 Python 工具库,涵盖24个大方向
  19. 微软梁念坚:六个新潮流推动IT行业发展
  20. 如何设置Mac电脑的DNS

热门文章

  1. CSW博客《转让的证据》
  2. sql查询字段中是否包含数字
  3. 精细化学品化学参考习题
  4. # python # # 分形 # Sierpinski Carpet 谢尔宾斯基地毯 续
  5. 安装win10专业版
  6. 机器人动力学与控制学习笔记(九)————基于模糊自适应增益调整的机器人滑模控制
  7. 单例模式的原理/懒汉模式/饿汉模式以及不同版本的单例模式程序
  8. 分子生物学词汇(L~O)
  9. Localspace Viewer下载影像并进行地形分析
  10. mysql创建数据库名字中带 - 的方式