• 对于双列集合map的学习


    双列集合

    特点

    1.双列集合一次需要存一对数据,分别是键和值。

    2.键和值一一对应,键不能重复,值能重复。

    3.键+值这个整体我们称之为键值对或者键值对对象,在java中叫做Entry对象。

    Map的常见API

    Map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的

    1. package MyApi.myMap;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. public class a01mymapdemo01 {
    5. public static void main(String[] args) {
    6. //1.创建map集合对象
    7. Map m = new HashMap<>();
    8. //2.添加元素
    9. //put方法细节:
    10. //添加/覆盖
    11. //在添加数据的时候,如果键不存在,那么直接把键值对对象添加到map集合当中,方法返回null
    12. //在添加数据的时候,如果键是存在的,那么会把原有的键值对对象覆盖,会把覆盖的值进行返回
    13. m.put("郭靖", "黄蓉");
    14. m.put("韦小宝", "沐剑屏");
    15. m.put("尹志平", "小龙女");
    16. //3.打印
    17. //System.out.println(m);
    18. //删除
    19. String remove = m.remove("郭靖");
    20. System.out.println(remove);
    21. //清空
    22. m.clear();
    23. //判断是否包含
    24. boolean key = m.containsKey("郭靖");
    25. System.out.println(key);
    26. //值是否包含
    27. boolean containsValue = m.containsValue("小龙女");
    28. System.out.println(containsValue);
    29. //判断集合是否为空
    30. boolean empty = m.isEmpty();
    31. System.out.println(empty);
    32. //集合的长度
    33. int size = m.size();
    34. System.out.println(size);
    35. }
    36. }

    map集合的遍历方式

    1.键找值

    1. package MyApi.myMap;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. import java.util.Set;
    5. public class a02Mapdemo02 {
    6. public static void main(String[] args) {
    7. //1.创建集合对象
    8. Map map=new HashMap<>();
    9. //2.添加元素
    10. map.put("郭靖", "黄蓉");
    11. map.put("韦小宝", "沐剑屏");
    12. map.put("尹志平", "小龙女");
    13. //3.通过键找值
    14. //3.1获取所有的键,把这些键放到一个单列集合当中
    15. Set keys= map.keySet();
    16. //3.2遍历每一个集合,得到每一个键
    17. for (String key : keys) {
    18. System.out.println(key);
    19. //3.3利用map集合中的键获取对应的值
    20. String value = map.get(key);
    21. System.out.println(key+"="+value);
    22. }
    23. }
    24. }

    2.键值对

    1. package MyApi.myMap;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. import java.util.Set;
    5. public class a03Mapdemo03 {
    6. public static void main(String[] args) {
    7. //1.创建集合对象
    8. Map map=new HashMap<>();
    9. //2.添加元素
    10. map.put("郭靖", "黄蓉");
    11. map.put("韦小宝", "沐剑屏");
    12. map.put("尹志平", "小龙女");
    13. //3.通过键值对对象
    14. //3.1获取所有的键值对对象,返回一个set集合
    15. Set> entries = map.entrySet();
    16. //3.2遍历entries这个集合,去得到里面的每一个键值对对象
    17. for (Map.Entry entry : entries) {
    18. //3.3利用entry调用get方法获取键和值
    19. String key = entry.getKey();
    20. String value = entry.getValue();
    21. System.out.println(key+"="+value);
    22. }
    23. }
    24. }

    3.Lamdba表达式

    1. package MyApi.myMap;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. import java.util.function.BiConsumer;
    5. public class a04mymapdemo04 {
    6. public static void main(String[] args) {
    7. //1.创建map集合的对象
    8. Map map=new HashMap<>();
    9. //2.添加元素
    10. map.put("郭靖", "黄蓉");
    11. map.put("韦小宝", "沐剑屏");
    12. map.put("尹志平", "小龙女");
    13. //3.利用lamabda表达式进行遍历
    14. //底层:
    15. //foreach其实就是利用第二种方式进行遍历,依次得到每一个键和值
    16. //在调用accept方法
    17. map.forEach(new BiConsumer() {
    18. @Override
    19. public void accept(String key, String value) {
    20. System.out.println(key+"="+value);
    21. }
    22. });
    23. System.out.println("--------");
    24. map.forEach((String key, String value)-> System.out.println(key+"="+value)
    25. );
    26. }
    27. }

    HashMap

    1.HashMap是map里面的一个实现类

    2.没有额外需要学习的特有方法,直接使用map里面的方法就可以了

    3.特点都是由键决定的:无序、不重复、无索引

    4.HashMap跟HashSet底层原理一模一样,都是哈希表结构

    5.依赖hashCode方法和equals方法保证键的唯一性

    6.如果键存储的是自定义对象,需要重写hashCode和equals方法,如果值存储自定义对象,不需要重写hashCode和equals方法。

    1. package MyApi.myMap;
    2. import java.util.HashMap;
    3. import java.util.Set;
    4. public class a05hashmapdemo05 {
    5. public static void main(String[] args) {
    6. //1.创建hashMap对象
    7. HashMap hm=new HashMap<>();
    8. //2.创建三个学生对象
    9. Student s1=new Student("karry",24);
    10. Student s2=new Student("roy",23);
    11. Student s3=new Student("jackson",23);
    12. //3.添加元素
    13. hm.put(s1,"重庆");
    14. hm.put(s2,"重庆");
    15. hm.put(s3,"湖南");
    16. //4.遍历集合
    17. Set keys= hm.keySet();
    18. for (Student key : keys) {
    19. String value = hm.get(key);
    20. System.out.println(key+"="+value);
    21. }
    22. }
    23. }
    1. package MyApi.myMap;
    2. import java.util.*;
    3. public class a06hashmapdemo06 {
    4. public static void main(String[] args) {
    5. //1.需要先让同学们投票
    6. String[] arr={"a","b","c","d"};
    7. ArrayList list=new ArrayList<>();
    8. Random r=new Random();
    9. for (int i = 0; i < 80; i++) {
    10. int index= r.nextInt(arr.length);
    11. // System.out.println(arr[index]);
    12. list.add(arr[index]);
    13. }
    14. //2.统计
    15. HashMap hm=new HashMap<>();
    16. for (String name : list) {
    17. if(hm.containsKey(name)){
    18. Integer count = hm.get(name);
    19. count++;
    20. hm.put(name,count);
    21. }else{
    22. hm.put(name,1);
    23. }
    24. }
    25. System.out.println(hm);
    26. //3.求最大值
    27. int max=0;
    28. Set> entries = hm.entrySet();
    29. for (Map.Entry entry : entries) {
    30. Integer value = entry.getValue();
    31. if(value>max) {
    32. max=value;
    33. }
    34. }
    35. System.out.println(max);
    36. //4.判断那个景点和最大值一样,如果一样,打印出来
    37. for (Map.Entry entry : entries) {
    38. Integer value = entry.getValue();
    39. if(value==max) {
    40. System.out.println(entry.getKey());
    41. }
    42. }
    43. }
    44. }

    LinkedHashMap

    • 由键决定:有序、不重复、无索引

    • 这里的有序是指保证存储和取出的元素顺序一致

    • 原理:底层数据结构依然是哈希表,只是每个键值对元素又额外多了一个双链表的机制记录存储的数据

    TreeMap

    • treemap和treeset底层原理一样,都是红黑树结构的

    • 由键决定特性:不重复、无索引、可排序

    • 可排序:对键进行排序

    • 注意:默认按照键的大小从小到大进行排序,也可以自己规定键的排序顺序

      代码书写两种排序规则
      • 实现Comparable接口,指定比较规则

      • 创建集合时传递Comparator比较器对象,指定比较规则。

      • 如果写的第一种也写了第二种则以第二种为准

        1. package MyApi.myMap;
        2. import java.util.Comparator;
        3. import java.util.TreeMap;
        4. public class a07Treesetdemo07 {
        5. public static void main(String[] args) {
        6. //1.创建集合对象
        7. TreeMap tm=new TreeMap<>(new Comparator() {
        8. @Override
        9. public int compare(Integer o1, Integer o2) {
        10. //o1表示要添加的元素
        11. //o2表示已经在红黑树中存在的元素
        12. return o2-o1;
        13. }
        14. });
        15. tm.put(1,"奥利奥");
        16. tm.put(2,"康师傅");
        17. tm.put(3,"九个核桃");
        18. tm.put(4,"雷碧");
        19. tm.put(5,"可口可乐");
        20. //3.
        21. System.out.println(tm);
        22. }
        23. }
        1. package MyApi.myMap;
        2. import java.util.Objects;
        3. public class Student implements Comparable{
        4. private String name;
        5. private int age;
        6. public Student() {
        7. }
        8. public Student(String name, int age) {
        9. this.name = name;
        10. this.age = age;
        11. }
        12. public String getName() {
        13. return name;
        14. }
        15. public void setName(String name) {
        16. this.name = name;
        17. }
        18. public int getAge() {
        19. return age;
        20. }
        21. public void setAge(int age) {
        22. this.age = age;
        23. }
        24. @Override
        25. public String toString() {
        26. return "Student{" +
        27. "name='" + name + '\'' +
        28. ", age=" + age +
        29. '}';
        30. }
        31. @Override
        32. public boolean equals(Object o) {
        33. if (this == o) return true;
        34. if (o == null || getClass() != o.getClass()) return false;
        35. Student student = (Student) o;
        36. return age == student.age && Objects.equals(name, student.name);
        37. }
        38. @Override
        39. public int hashCode() {
        40. return Objects.hash(name, age);
        41. }
        42. @Override
        43. public int compareTo(Student o) {
        44. int i = this.getAge() - o.getAge();
        45. i= i==0?this.getName().compareTo(o.getName()):i;
        46. return i;
        47. }
        48. }
        49. package MyApi.myMap;
        50. import java.util.TreeMap;
        51. public class a08treemapdemo08 {
        52. public static void main(String[] args) {
        53. TreeMap tm=new TreeMap<>();
        54. Student s1=new Student("karry",24);
        55. Student s2=new Student("roy",23);
        56. Student s3=new Student("jackson",23);
        57. tm.put(s1,"重庆");
        58. tm.put(s2,"重庆");
        59. tm.put(s3,"湖南");
        60. System.out.println(tm);
        61. }
        62. }
        1. 统计个数
        2. package MyApi.myMap;
        3. import java.util.TreeMap;
        4. import java.util.function.BiConsumer;
        5. public class a09treesedemo09 {
        6. public static void main(String[] args) {
        7. String s="aababcabcbdabcde";
        8. TreeMap tm=new TreeMap<>();
        9. for (int i = 0; i < s.length(); i++) {
        10. char c = s.charAt(i);
        11. if(tm.containsKey(c)){
        12. int count=tm.get(c) ;
        13. count++;
        14. tm.put(c,count);
        15. }else {
        16. tm.put(c,1);
        17. }
        18. }
        19. StringBuilder sb=new StringBuilder();
        20. tm.forEach(new BiConsumer() {
        21. @Override
        22. public void accept(Character key, Integer value) {
        23. sb.append(key).append("(").append(value).append(")");
        24. }
        25. });
        26. System.out.println(sb);
        27. }
        28. }

  • 相关阅读:
    PostgreSQL之SQL高级特性
    Python爬虫脚本的基本组成
    Git详细介绍与SSH链接远程仓库
    vivo 容器集群监控系统架构与实践
    如何在 initial / task 等 begin_end 中等待某一个信号
    c++语言--面试题
    python操作MySQL、SQL注入问题、视图、触发器、事务、存储过程、函数、流程控制、索引(重点)
    Nuxt3区分环境打包报错“flase.appcet is not function“
    信创产业多点开花,AntDB数据库积极参与行业标准研制,协同价值链伙伴共促新发展
    Http CORS 跨域请求
  • 原文地址:https://blog.csdn.net/qq_52326978/article/details/136636240