Map集合体系(HashMap,LinkedHashMap,TreeMap)

news/2024/4/17 16:51:03

目录

1.Map集合

2.hashMap集合

3.LinkedHashMap集合

4. TreeMap集合

1.Map集合

        Map集合是键值对集合

        格式:{key1=value1, key2=value2, key3=value3, ...}

        Map系列集合的特点都是由键决定的,值只是一个附属品,值不做要求

2.实现类有哪些?,各自有什么特点?

        HashMap:无序、不重复、无索引; (用的最多)

        LinkedHashMap:有序、不重复、无索引

        TreeMap:按照大小默认升序排序、不重复、无索引

3.Map的常用方法

        Map是双列集合的祖宗,它的功能是全部双列集合都可以继承过来使用的。

                        

代码展示:

package com.itheima.day08.teacher.map01;import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MapDemo01 {/*Map集合是什么?有什么特点?Map是双列集合,也叫键值对儿集合。里面的元素是一对儿一对儿的。这一对儿元素称为键值对对象,Entry对象。当存储多个 一一对应数据的时候,使用Map。特点:键唯一,值可以重复,每个键都只能找到自己对应的值。Map集合实现类有哪些?HashMap  键 唯一 无序  无索引 值无所谓LinkedHashMap 键 唯一 有序  无索引 值无所谓TreeMap键 唯一 可排序  无索引 值无所谓Map集合常用方法:集合对象的创建一般采用空参构造Map<K,V>  泛型K表示键的类型 泛型V表示值的类型Map<键的类型,值的类型> map =  new 子类对象<>();增  删  改  查V put(K key,V value) 存放一对元素put有俩层 意思如果 键没有在集合中出现,此时put是添加。 V返回是null.键在集合中出现了,此时put是修改。 V 返回的是被替换的值。HashMap中是可以存储 null值 null键boolean isEmpty() 集合是否为空 为空trueint size() 查看键值对个数clear() 清空 集合中所有键值对全删了查  map特点 以键为准的V get(K key)根据键找值删V remove(K key)根据键删除当前的键值对关系包含boolean containsKey(K k)是否包含指定的键boolean containsValue(V v)是否包含指定值获取 键集  值集Set<K> keySet() 获取键集Collection<V> values() 获取值集集合的遍历*/public static void main(String[] args) {//1:创建集合对象Map<String,Integer> map = new HashMap<>();//多态形势下研究 通用方法//2:集合里面当前没有内容System.out.println("当前集合是不是空的呢?"+map.isEmpty());//3:添加键值对元素到 集合中map.put("随便",3);map.put("记忆枕",30);map.put("大鹅",10000);map.put("叮当猫",0);map.put("随便",4);//修改//4:查看集合中元素个(对)数System.out.println("当前集合有:"+map.size()+"对元素");System.out.println(map);//5:清空集合--
//        map.clear();
//        System.out.println(map);//6:根据键找值 如果找不到 返回null 找到返回对应的值。System.out.println("大鹅的价格:"+map.get("大鹅"));System.out.println("大鸦的价格:"+map.get("大鸦"));//7:删除System.out.println("删除叮当猫:"+map.remove("叮当猫"));System.out.println("删除之后的集合:"+map);//8:包含 不包含false 包含是trueSystem.out.println("是否包含叮当猫的键:"+map.containsKey("叮当猫"));System.out.println("是否包含大鹅的键:"+map.containsKey("大鹅"));System.out.println("是否包含价格为30的商品:"+map.containsValue(30));//9:获取键集和值集Set<String> keys = map.keySet();System.out.println(keys);Collection<Integer> values = map.values();System.out.println(values);//10:从上面方法中选择一下  能不能完成 键值对儿数据的遍历...}
}

4.Map的遍历方式(三种)

        1.键找值:keySet()获取所有的键集合,在用get(),通过键获取值遍历
        2.键值对:用entrySet() ,把键值合成一个整体在set集合里,遍历用getKey()和getValue()
        3.Lambda:用forEarch,里面new BIconsumer

代码展示:

package com.itheima.day08.teacher.map01;import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MapDemo02 {/*Map集合遍历方式一:键找值步骤:先根据keySet()方法获取键集遍历键集得到每个键根据键找值 get(K k)*/public static void main(String[] args) {// 准备一个Map集合。Map<String, Double> map = new HashMap<>();map.put("蜘蛛精", 162.5);map.put("蜘蛛精", 169.8);map.put("紫霞", 165.8);map.put("至尊宝", 169.5);map.put("牛魔王", 183.6);System.out.println(map);//查看内容不是遍历//遍历指的是 一个个取出来。//1:获取map集合的键集Set<String> keys = map.keySet();//2:遍历 增强for 得到每个键for (String key : keys) {//3:根据键 获取对应的值Double value = map.get(key);System.out.println(key+" : "+value);}}
}-----------------
package com.itheima.day08.teacher.map01;import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MapDemo03 {/*Map集合遍历方式二:(面向对象思想方式)键值对儿 方式......键值对儿对象 叫 Entry类型每一个 entry对象表示 一个键值对儿Set<Entry对象> entrySet()  获取 "键值对儿"(整体) 集合Entry理解为 封装了 键和值的一个特殊对象getKey() 获取该对象的键getValue()获取该对象的值Entry<K,V> K键的类型 V 值的类型Set<Map.Entry<K,V>> entrySet()步骤:1:map集合调用 entrySet()方法 得到 一个 存放 entry对象的 set集合2:遍历 存放entry对象的set集合 得到每一个 entry对象3:调用entry对象的 获取键的方法 获取值的方法 取出对应键值*/public static void main(String[] args) {// 准备一个Map集合。Map<String, Double> map = new HashMap<>();map.put("蜘蛛精", 162.5);map.put("蜘蛛精", 169.8);map.put("紫霞", 165.8);map.put("至尊宝", 169.5);map.put("牛魔王", 183.6);System.out.println(map);// 1:map集合调用 entrySet()方法 得到 一个 存放 entry对象的 set集合Set<Map.Entry<String, Double>> entries = map.entrySet();//2:遍历 存放entry对象的set集合 得到每一个 entry对象for (Map.Entry<String, Double> entry : entries) {//entry就是存放 没对 键值的 对象// 3:调用entry对象的 获取键的方法 获取值的方法 取出对应键值String key = entry.getKey();Double value = entry.getValue();System.out.println(key+" : "+value);}}
}------------------
package com.itheima.day08.teacher.map01;import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;public class MapDemo04 {/*Map集合遍历方式三:JDK8之后 Lambda方式map集合在JDK8之后提供类一个forEach(处理键和值的接口)方法*/public static void main(String[] args) {// 准备一个Map集合。Map<String, Double> map = new HashMap<>();map.put("蜘蛛精", 162.5);map.put("蜘蛛精", 169.8);map.put("紫霞", 165.8);map.put("至尊宝", 169.5);map.put("牛魔王", 183.6);System.out.println(map);map.forEach(new BiConsumer<String, Double>() {@Overridepublic void accept(String k, Double v) {//底层用一个方法去接收了 每次遍历出来的键和值System.out.println(k+" : "+v);}});System.out.println("================");map.forEach((k,v)-> System.out.println(k+" : "+v));}
}

2.hashMap集合

        HashMap集合的底层原理

        1.HashMap跟HashSet的底层原理是一模一样的,都是基于哈希表实现的。

                JDK8之前,哈希表 = 数组+链表

                JDK8开始,哈希表 = 数组+链表+红黑树

                哈希表是一种增删改查数据性能都较好的数据结构。

        2.实际上:原来学的Set系列集合的底层就是基于Map实现的,只是Set集合中的元素只要键数据,不要值数据而已。

        3.HashMap如何实现键的唯一性的

                依赖hashCode方法和equals方法保证键的唯一。

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

代码演示:

        

package com.itheima.day08.teacher.map02;import java.util.Objects;
/**学生类
*/
public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}-------------
package com.itheima.day08.teacher.map02;import java.util.HashMap;/*** HashMap测试类*/
public class HashMapDemo {public static void main(String[] args) {//创建一个 存储 学生对象--籍贯对应 关系的 集合HashMap<Student,String> map = new HashMap<>();//每次存一个学生对象--籍贯Student stu1 = new Student("小学", 15);Student stu2 = new Student("中学", 19);Student stu3 = new Student("高中", 22);Student stu4 = new Student("小学", 15);//stu1 来自 吉林  stu2 黑龙江  stu3 辽宁map.put(stu1,"吉林");map.put(stu2,"黑龙江");map.put(stu3,"辽宁");map.put(stu4,"热河");//  map集合特点  键唯一// 没有重写 hashcode equals时候  两次new 就是两个不同的对象。// 我们会认为 stu1 stu4 的 内容一样就是相同的对象---需要我们去重写键的hashCode equals方法map.forEach((k,v)->{System.out.println(k+"="+v);});}
}

3.LinkedHashMap集合

        LinkedHashMap集合的底层原理

        1.底层数据结构依然是基于哈希表实现的,只是每个键值对元素又额外的多了一个双链表的机制记录元素顺序(保证有序)。

        2.实际上:原来学习的LinkedHashSet集合的底层原理就是LinkedHashMap。

package com.itheima.day08.teacher.map02;import java.util.Objects;/*** 学生类*/
public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}---------------
package com.itheima.day08.teacher.map02;import java.util.HashMap;
import java.util.LinkedHashMap;/*** LinkedHashMap测试类*/
public class LinkedHashMapDemo {public static void main(String[] args) {//创建一个 存储 学生对象--籍贯对应 关系的 集合LinkedHashMap<Student,String> map = new LinkedHashMap<>();//每次存一个学生对象--籍贯Student stu1 = new Student("小学", 15);Student stu2 = new Student("中学", 19);Student stu3 = new Student("高中", 22);Student stu4 = new Student("小学", 15);//stu1 来自 吉林  stu2 黑龙江  stu3 辽宁map.put(stu1,"吉林");map.put(stu2,"黑龙江");map.put(stu3,"辽宁");map.put(stu4,"热河");//  map集合特点  键唯一// 没有重写 hashcode equals时候  两次new 就是两个不同的对象。// 我们会认为 stu1 stu4 的 内容一样就是相同的对象---需要我们去重写键的hashCode equals方法map.forEach((k,v)->{System.out.println(k+"="+v);});}
}

4. TreeMap集合

        TreeMap集合的底层原理

        1.TreeMap跟TreeSet集合的底层原理是一样的,都是基于红黑树实现的排序。

        2.TreeMap集合同样也支持两种方式来指定排序规则

                让类实现Comparable接口,重写比较规则。

                TreeMap集合有一个有参数构造器,支持创建Comparator比较器对象,以便用来指定比较规则。     

package com.itheima.day08.teacher.map02;import java.util.Objects;/*** 学生类*/
public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}------------------
package com.itheima.day08.teacher.map02;import java.util.Comparator;
import java.util.HashMap;
import java.util.TreeMap;/*** TreeMap测试类*/
public class TreeMapDemo {public static void main(String[] args) {//创建一个 存储 学生对象--籍贯对应 关系的 集合TreeMap<Student,String> map = new TreeMap<>(new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o2.getAge()-o1.getAge();}});//每次存一个学生对象--籍贯Student stu1 = new Student("小学", 15);Student stu2 = new Student("中学", 19);Student stu3 = new Student("高中", 22);Student stu4 = new Student("小学", 15);//stu1 来自 吉林  stu2 黑龙江  stu3 辽宁map.put(stu1,"吉林");map.put(stu2,"黑龙江");map.put(stu3,"辽宁");map.put(stu4,"热河");map.forEach((k,v)->{System.out.println(k+"="+v);});}
}

集合的嵌套:  指的是集合中的元素又是一个集合


https://www.xjx100.cn/news/3280877.html

相关文章

如何系统地自学Python?

如何系统地自学Python&#xff1f; 如何系统地自学Python&#xff1f;1.了解编程基础2.学习Python基础语法3.学习Python库和框架4.练习编写代码5.参与开源项目6.加入Python社区7.利用资源学习8.制定学习计划9.持之以恒总结 如何系统地自学Python&#xff1f; 作为一个Python语…

探索 LRU 算法的缺陷与解决方案

LRU算法 Linux 的 Page Cache 和 MySQL 的 Buffer Pool 的大小是有限的&#xff0c;并不能无限的缓存数据&#xff0c;对于一些频繁访问的数据我们希望可以一直留在内存中&#xff0c;而一些很少访问的数据希望可以在某些时机可以淘汰掉&#xff0c;从而保证内存不会因为满了而…

14. rk3588自带的RKNNLite检测yolo模型(python)

首先将文件夹~/rknpu2/runtime/RK3588/Linux/librknn_api/aarch64/下的文件librknnrt.so复制到文件夹/usr/lib/下&#xff08;该文件夹下原有的文件librknnrt.so是用来测试resnet50模型的&#xff0c;所以要替换成yolo模型的librknnrt.so&#xff09;&#xff0c;如下图所示&am…

Qt C++春晚刘谦魔术约瑟夫环问题的模拟程序

什么是约瑟夫环问题&#xff1f; 约瑟夫问题是个有名的问题&#xff1a;N个人围成一圈&#xff0c;从第一个开始报数&#xff0c;第M个将被杀掉&#xff0c;最后剩下一个&#xff0c;其余人都将被杀掉。例如N6&#xff0c;M5&#xff0c;被杀掉的顺序是&#xff1a;5&#xff…

Linux编辑器——Vim详解

目录 ⭐前言 ⭐vim的基本概念 ⭐vim的基本操作 ⭐vim命令模式命令集 ⭐vim末行模式命令集 ⭐简单vim配置 ⭐配置文件的位置 ⭐常用配置选项 ⭐前言 vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容…

Java后端底座从无到有的搭建(随笔)

文章目录 开发模式的演变草创时期1.0时期&#xff08;基座时期&#xff09;1.1时期&#xff08;低代码时期&#xff09;2.0时期&#xff08;无代码时期&#xff09; 前言&#xff1a;本文是笔者在初创公司&#xff0c;一年多来Java后端服务底座搭建过程的总结&#xff0c;如有不…

Git 客户端可视化工具tortoisegit

Git 使用教程 git一点通 (kdocs.cn) 二、Git 客户端可视化工具-推荐 1.常用工具 tortoisegit 官网 https://tortoisegit.org/ 推荐 sourcetree 官网 https://www.sourcetreeapp.com/ 2.tortoisegit安装 2.1 下载安装包 2.2 下载语言包 2.3 安装 2.4 安装语言包 5.使用 5.1 新建…

布客深度学习译文集 2024.2 更新

Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版Sklearn 与 TensorFlow 机器学习实用指南第二版PyTorch 自然语言处理Transformer 和扩散模型的生成式 AI 实用指南&#xff08;预览版&#xff09;Transformer 自然语言处理面向程序员的 FastAI 和 PyTorch 深度学习Tensor…