• JAVA集合04_Map接口概述、常用方法、排序、Hashtable面试题


    文章目录 

    ①. Map接口的概述

    • ①. Map是双列集合与Collection的单列集合并列存在

    • ②. Map  这里的K 、V 都应该是引用数据类型

    • ③. HashSet底层依赖HashMap,单列底层依赖双列集合

    • ④. Map中的key可以为null,value也可以为null,注意key只能有一个null,value可以有多个null

    ②. Map常用方法

    • ①. 添加功能:如果键是第一次储存,就直接储存元素,返回null;如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值

      V put(K key ,V value):添加元素,返回的是以前的值

    1. "color:#444444">"background-color:#f6f6f6">Map "color:#333333">map="color:#397300">new HashMap<>();
    2. Integer i1="color:#333333">map.put("color:#880000">"张三","color:#880000">23);
    3. Integer i2="color:#333333">map.put("color:#880000">"李四","color:#880000">23);
    4. Integer i3="color:#333333">map.put("color:#880000">"王五","color:#880000">24);
    5. Integer i4="color:#333333">map.put("color:#880000">"赵六","color:#880000">25);
    6. Integer i5="color:#333333">map.put("color:#880000">"张三","color:#880000">26);"color:#888888">//相同的键不储存,把原来的值覆盖 把被覆盖的值返回
    7. System.out."color:#397300">println("color:#333333">map);"color:#888888">//{李四=23, 张三=26, 王五=24, 赵六=25}
    8. "color:#888888">//这里的i1--i4 都是null是因为开始的时候[张三,23][李四,23]....
    9. "color:#888888">// 在集合中没有,这样把原来的值覆盖了,返回的是原来的值
    10. System.out."color:#397300">println(i1);"color:#888888">//null
    11. System.out."color:#397300">println(i2);"color:#888888">//null
    12. System.out."color:#397300">println(i3);"color:#888888">//null
    13. System.out."color:#397300">println(i4);"color:#888888">//null
    14. System.out."color:#397300">println(i5);"color:#888888">//23
    • ②. 删除功能
    1. void clear():移除所有的键值对元素
    2. V remove(Object key):根据键删除键值对元素,并把值返回
    1. "color:#444444">"background-color:#f6f6f6">Map "color:#333333">map="color:#397300">new HashMap<>();
    2. "color:#333333">map.put("color:#880000">"张三","color:#880000">23);
    3. "color:#333333">map.put("color:#880000">"李四","color:#880000">23);
    4. "color:#333333">map.put("color:#880000">"王五","color:#880000">24);
    5. "color:#333333">map.put("color:#880000">"赵六","color:#880000">25);
    6. "color:#888888">//根据键删除元素,返回键对应的值
    7. Integer value="color:#333333">map.remove("color:#880000">"张三");
    8. System.out."color:#397300">println(value);"color:#888888">//23
    • ③. 判断功能
    1. boolean containsKey(Objecct key):判断是否包含指定的键
    2. boolean containsValue(Objecct value):判断是否包含指定的值
    1. "color:#444444">"background-color:#f6f6f6">"color:#888888">//判断是否包含传入的键
    2. System.out."color:#397300">println("color:#333333">map.containsKey("color:#880000">"张三"));"color:#888888">//true
    3. "color:#888888">//判断是否包含传入的值
    4. System.out."color:#397300">println("color:#333333">map.containsValue("color:#880000">23));"color:#888888">//true
    • ④. 长度功能

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

    1. "color:#444444">"background-color:#f6f6f6">Map "color:#333333">map="color:#397300">new HashMap<>();
    2. "color:#333333">map.put("color:#880000">"张三","color:#880000">26);
    3. "color:#333333">map.put("color:#880000">"李四","color:#880000">23);
    4. "color:#333333">map.put("color:#880000">"王五","color:#880000">24);
    5. "color:#333333">map.put("color:#880000">"赵六","color:#880000">25);
    6. Collectioncoll="color:#333333">map.values();
    7. System.out."color:#397300">println(coll);"color:#888888">//[23, 23, 24, 25]
    8. System.out."color:#397300">println("color:#333333">map.size());"color:#888888">//4
    • ⑤. 获取功能
    1. V get(Object key):根据键获取值
    2. Set  keySet():获取集合中所有的键集合
    3. Collection  values:获取集合中所有值集合
    4. Set> entrySet():拿到所有的键值对对象

      K getKey():得到entrySet中的键

      V getValue():得到entrySet中的值

    1. "color:#444444">"background-color:#f6f6f6">Map "color:#333333">map = "color:#397300">new HashMap<>();
    2. "color:#333333">map.put("color:#880000">"张三", "color:#880000">23);
    3. "color:#333333">map.put("color:#880000">"李四", "color:#880000">24);
    4. "color:#333333">map.put("color:#880000">"王五", "color:#880000">25);
    5. "color:#333333">map.put("color:#880000">"赵六", "color:#880000">23);
    1. //V get(Object key):根据键获取值
    2. Integer i = map.get("张三");//26
    3. Integer i2=map.get("小智");//没有的话返回null
    4. //1.获取所有的键
    5. Set<String> keySet = map.keySet();
    6. //iterator遍历
    7. Iterator<String> iterator = keySet.iterator();
    8. while (iterator.hasNext()) {
    9. String key = iterator.next();//获取每一个键
    10. Integer value = map.get(key); //根据键获取值
    11. System.out.println(key + "=" + value);
    12. }
    13. System.out.println("--------------");
    14. //使用增强for循环
    15. for (String key : map.keySet()) {
    16. Intger value=map.get(key);
    17. System.out.println(key + "=" +value );
    18. }

    1. interface Inter{
    2. interface Inter2{
    3. public void show();
    4. }
    5. }
    6. //这里的Inter.Inter2 和Map.Entry一样的
    7. class Demo implements Inter.Inter2{
    8. @Override
    9. public void show() {
    10. }
    11. }
    1. "color:#444444">"background-color:#f6f6f6">"color:#888888">//2.根据键值对对象,获取键和值
    2. "color:#888888">//Map.Entry说明Entry是Map的内部接口,将键和值封装成了Entry对象,并储存在Set集合中
    3. "color:#397300">Set<"color:#397300">Map.Entry<"color:#397300">String,Integer>>entrySet=map.entrySet();
    4. "color:#888888">//获取每一个对象
    5. "color:#397300">Iterator<"color:#397300">Map.Entry<"color:#397300">String,Integer>>it=entrySet.iterator();
    6. "color:#333333">while(it.hasNext()){
    7. "color:#888888">//获取每一个Entry对象
    8. "color:#888888">//static class Entry implements Map.Entry{}
    9. "color:#397300">Map.Entry<"color:#397300">String,Integer>en=it.next();"color:#888888">//父类引用指向子类对象
    10. "color:#888888">//Entryen=it.next(); 子类对象
    11. "color:#888888">//根据键值对对象获取键
    12. "color:#397300">String key=en.getKey();
    13. "color:#888888">//根据键值对对象获取值
    14. Integer value=en.getValue();
    15. System.out.println(key+"color:#880000">"="+value);
    16. }
    17. "color:#888888">//增强for循环
    18. "color:#333333">for("color:#397300">Map.Entry<"color:#397300">String,Integer> en:map.entrySet()){
    19. System.out.println(en.getKey()+"color:#880000">"="+en.getValue());
    20. }
    21. "color:#333333">for(Entry<"color:#397300">String,Integer> en:map.entrySet()){
    22. System.out.println(en.getKey()+"color:#880000">"="+en.getValue());
    23. }

    ③. HashMap概述

    • ①. Map中的key用Set来存放,不允许重复,即同一个Map对象所对应的类,须重写hashCode( )和equals( )方法

    • ②. HashMap判断两个key相等的标准是:两个key通过equals()方法返回 true,hashCode值也相等

    • ③. HashMap判断两个value相等的标准是:两个value通过 equals() 方法返回true

    • ④. 注意:两个HashMap的hashcode相同,则他们的equal()方法不一定相同,若两个HashMap的equal()相同,则他们的hashcode一定相同

    • ⑤. 允许使用null键和null值,与HashSet一样,不保证映射的顺序

    • ⑥. HashMap集合键是Student值是String的案例
    1. // HashMap集合键是Student值是String的案例
    2. public class Student {
    3. private String name;
    4. private int age;
    5. public Student() {
    6. }
    7. public Student(String name, int age) {
    8. this.name = name;
    9. this.age = age;
    10. }
    11. public String getName() {
    12. return name;
    13. }
    14. public void setName(String name) {
    15. this.name = name;
    16. }
    17. public int getAge() {
    18. return age;
    19. }
    20. public void setAge(int age) {
    21. this.age = age;
    22. }
    23. @Override
    24. public boolean equals(Object o) {
    25. if (this == o) return true;
    26. if (o == null || getClass() != o.getClass()) return false;
    27. Student student = (Student) o;
    28. return age == student.age &&
    29. Objects.equals(name, student.name);
    30. }
    31. @Override
    32. public int hashCode() {
    33. return Objects.hash(name, age);
    34. }
    35. @Override
    36. public String toString() {
    37. return "Student{" +
    38. "name='" + name + '\'' +
    39. ", age=" + age +
    40. '}';
    41. }
    42. }
    1. "color:#444444">"background-color:#f6f6f6">HashMaphm="color:#397300">new HashMap<>();
    2. hm.put("color:#397300">new Student("color:#880000">"张三","color:#880000">23),"color:#880000">"北京");
    3. String i=hm.put("color:#397300">new Student("color:#880000">"张三","color:#880000">23),"color:#880000">"上海");
    4. hm.put("color:#397300">new Student("color:#880000">"李四","color:#880000">24),"color:#880000">"广州");
    5. hm.put("color:#397300">new Student("color:#880000">"王五","color:#880000">25),"color:#880000">"深圳");
    6. System.out."color:#397300">println(i);
    7. "color:#888888">//没有重写equals方法之前,调用的是Object类的,会比较地址值
    8. "color:#888888">//没有重写equals方法和 hashCode方法的时候map中的元素有4个,重写后只有3个
    9. "color:#888888">//注意这里的张三对应的值是上海,因为把北京覆盖了
    10. System.out."color:#397300">println(hm);"color:#888888">//北京
    11. "color:#888888">//{Student{name='张三', age=23}=上海, Student{name='李四', age=24}=广州, Student{name='王五',

    ④. LinkedHashMap

    • LinkedHashMap:使用链表维护添加进Map中的顺序, 故遍历Map时,是按添加的顺序遍历的
    1. "color:#444444">"background-color:#f6f6f6">LinkedHashMaplhm="color:#397300">new LinkedHashMap<>();
    2. lhm.put("color:#880000">"张三","color:#880000">23);
    3. lhm.put("color:#880000">"李四","color:#880000">24);
    4. lhm.put("color:#880000">"王五","color:#880000">25);
    5. lhm.put("color:#880000">"赵六","color:#880000">26);
    6. System.out."color:#397300">println(lhm);"color:#888888">//{张三=23, 李四=24, 王五=25, 赵六=26}

    ⑤. TreeMap排序

    • ①. TreeMap和TreeSet一样

    • ②. 自然排序:TreeMap 的所有的Key必须实现Comparable 接口,调用对象的comparaTo()方法和集合中的对象进行比较,根据CompableTo()方法返回的结果进行储存(所有的 Key 应该是同一个类的对象,否则将会抛出 ClasssCastException)

    • ③. 选择器排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的所有 key进行排序。此时不需要Map的Key实现Comparable接口

    • ④. TreeMap集合键是Student值是String的案例

    1. //自然排序
    2. public class Student implements Comparable<Student> {
    3. private String name;
    4. private int age;
    5. public Student() {
    6. }
    7. public Student(String name, int age) {
    8. this.name = name;
    9. this.age = age;
    10. }
    11. public String getName() {
    12. return name;
    13. }
    14. public void setName(String name) {
    15. this.name = name;
    16. }
    17. public int getAge() {
    18. return age;
    19. }
    20. public void setAge(int age) {
    21. this.age = age;
    22. }
    23. @Override
    24. public String toString() {
    25. return "Student{" +
    26. "name='" + name + '\'' +
    27. ", age=" + age +
    28. '}';
    29. }
    30. @Override
    31. public int compareTo(Student s) {
    32. //以年龄为主要条件,姓名为次要条件
    33. int num=this.age-s.age;
    34. return num==0?this.name.compareTo(s.name):num;
    35. }
    36. }
    1. TreeMap tm=new TreeMap<>();
    2. tm.put(new Student("张三",23),"北京");
    3. tm.put(new Student("李四",13),"上海");
    4. tm.put(new Student("王五",33),"广州");
    5. tm.put(new Student("赵六",43),"北京");
    6. System.out.println(tm);
    7. //{Student{name='李四', age=13}=上海, Student{name='张三', age=23}=北京,
    8. // Student{name='王五', age=33}=广州, Student{name='赵六', age=43}=北京}
    1. "color:#444444">"background-color:#f6f6f6">"color:#888888">//选择器排序
    2. TreeMap"color:#397300">String> tm="color:#333333">new TreeMap<>("color:#333333">new Comparator() {
    3. "color:#1f7199">@Override
    4. public "color:#397300">int compare(Student s1, Student s2) {
    5. "color:#888888">//按照姓名比较
    6. "color:#397300">int "color:#397300">num=s1.getName().compareTo(s2.getName());
    7. "color:#333333">return "color:#397300">num=="color:#880000">0?s1.getAge()-s2.getAge():"color:#397300">num;
    8. }
    9. });
    10. tm.put("color:#333333">new Student("color:#880000">"张三","color:#880000">23),"color:#880000">"北京");
    11. tm.put("color:#333333">new Student("color:#880000">"李四","color:#880000">13),"color:#880000">"上海");
    12. tm.put("color:#333333">new Student("color:#880000">"王五","color:#880000">33),"color:#880000">"广州");
    13. tm.put("color:#333333">new Student("color:#880000">"赵六","color:#880000">43),"color:#880000">"北京");
    14. System.out.println(tm);
    15. "color:#888888">//{Student{name='张三', age=23}=北京, Student{name='李四', age=13}=上海,
    16. "color:#888888">//Student{name='王五', age=33}=广州, Student{name='赵六', age=43}=北京}

    ⑥. Hashtable面试题

    1. HashMap和Hashtable的区别
    2. 共同点:
    3. 底层都是哈希算法,都是双列集合
    4. 区别
    5. 1.HashMap是线程不安全的,效率高,jdk1.2版本
    6. Hashtable是现场安全的,效率低,jdk1.0版本
    7. 2.HashMap可以存储null键和null
    8. Hashtable不可以存储null键和null
  • 相关阅读:
    CORS 跨域访问, 实现跨域的原理, CORS漏洞利用
    Altium Designer
    【CUDA编程概念】一、什么是bank conflict?
    PlotNeuralNet绘制卷积神经网络结构图
    浅谈基于LoRa技术下智能建筑能耗管理系统的分析与设计
    Springboot+mysql+大学生就业管理系统 毕业设计 -附源码290915
    Spring源码:ApplicationContextAware和BeanFactoryAware理解BeanFactory和Aware
    我使用延迟队列实现商品的竞拍成交功能
    vue项目切换页面白屏的解决方案
    风格迁移常用代码
  • 原文地址:https://blog.csdn.net/ch98000/article/details/126764780