双列集合 HashMap以及TreeMap底层原理

双列集合

  特点:

        双列集合一次需要存一对数据,分别为键和值

        键不能重复,值可以重复

        键和值是一一对应的,每个键只能找到自己对应的值

        键和值这个整体在Java中叫做“Entry对象”

Map的常见API

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

        

        图来自黑马程序员网课 

Map的遍历方式

键找值:

        Set<String> keys = map2.keySet();for (String key : keys) {System.out.println(key + " : " + map2.get(key));}

键值对: 

        Set<Map.Entry<String,String>> entries = map2.entrySet();for (Map.Entry<String,String> entry : entries) {System.out.println(entry.getKey() + " : " + entry.getValue());}

Lambda表达式: 

 map2.forEach( (s, s2)-> System.out.println(s2 + " : " + s));

HashMap 

特点:

HashMap是Map里的一个实现类;没有额外需要学习的特有方法;

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

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

底层原理:

 

 

 

 

               以上图来自黑马程序员网课

        其原理和HashSet一样,依赖hashCode方法和equals方法保证键的唯一,

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

        若值存储的是自定义对象,不需要重写hashCode和equals方法

        

package com.lazyGirl.mapdemo;import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class Demo2 {public static void main(String[] args) {Map<Student,String> map = new HashMap<Student,String>();Student s1 = new Student("John", 23);Student s2 = new Student("Jane", 26);Student s3 = new Student("Jack", 27);Student s4 = new Student("Jack", 27);map.put(s1,"nx");map.put(s2,"sd");map.put(s3,"js");map.put(s4,"js");Set<Student> set1 = map.keySet();for (Student student : set1) {System.out.println(student+" "+map.get(student));}System.out.println();Set<Map.Entry<Student, String>> entries = map.entrySet();for (Map.Entry<Student, String> entry : entries) {System.out.println(entry.getKey()+" "+entry.getValue());}System.out.println();map.forEach((key,value) -> System.out.println(key+" "+value));}
}

输出:

练习2:

        

package com.lazyGirl.mapdemo;import java.util.*;public class Demo3 {public static void main(String[] args) {String[] arr = {"A","B","C","D","E","F"};ArrayList<String> list = new ArrayList<>();Random rand = new Random();for (int i = 0; i < 80; i++) {int num = rand.nextInt(arr.length);list.add(arr[num]);}Map<String,Integer> map = new HashMap<>();for (String s : list) {if (map.containsKey(s)) {map.put(s, map.get(s) + 1);}else {map.put(s, 1);}}System.out.println(map);int max = 0;String jd = "";Set<String> set = map.keySet();for (String s : set) {if (map.get(s) > max) {max = map.get(s);jd = s;}}System.out.println(jd + " " + max);}
}

        输出: 

        

LinkedHashMap 

 特点:

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

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

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

package com.lazyGirl.mapdemo;import java.util.LinkedHashMap;
import java.util.LinkedHashSet;public class LinkedDemo {public static void main(String[] args) {LinkedHashMap<String, Integer> map = new LinkedHashMap<>();map.put("A", 1);map.put("B", 2);map.put("C", 3);map.put("D", 4);System.out.println(map);}
}

输出:

TreeMap 

   特点:

        TreeMap跟TreeSet底层原理一样,都是红黑树结构

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

        可排序:对键进行排序

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

  代码书写两种排序规则:

     实现Comparable接口,指定比较规则

      

package com.lazyGirl.mapdemo;import java.util.Objects;public class Student implements Comparable<Student> {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic int compareTo(Student o) {int i = this.getAge() - o.getAge();i =  i != 0 ? i : this.getName().compareTo(o.getName());return i;}
}

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

 

public class TreeMapDemo {public static void main(String[] args) {TreeMap<Integer,String> treeMap = new TreeMap<>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});treeMap.put(1, "A");treeMap.put(3, "C");treeMap.put(2, "B");treeMap.put(4, "D");System.out.println(treeMap);}
}

底层源码:

 

 

        以上三个图来自黑马程序员网课 

练习:

package com.lazyGirl.mapdemo;import java.util.StringJoiner;
import java.util.TreeMap;public class TreeMapDemo2 {public static void main(String[] args) {String target = "aaaajkdjks skasmka";TreeMap<Character, Integer> map = new TreeMap<Character, Integer>();for (int i = 0; i < target.length(); i++) {if (map.containsKey(target.charAt(i))) {map.put(target.charAt(i), map.get(target.charAt(i)) + 1);}else {map.put(target.charAt(i), 1);}}System.out.println(map);StringBuilder sb = new StringBuilder();map.forEach((k, v) -> sb.append(k).append("(").append(v).append(")"));System.out.println(sb);StringJoiner sj = new StringJoiner(" ","","");map.forEach((k, v) -> sj.add(k+ "(").add(v + "").add(")"));System.out.println(sj);}
}

输出:

TreeMap添加元素的时候,键是否需要重写hashCode和equals方法?不需要

HashMap是哈希表结构,由数组,链表,红黑树组成,既然由有红黑树,是否需要理由Comparable指定排序规则?不需要(因为在HashMap底层,默认理由哈希值大小来创建红黑树的)

TreeMap和HashMap谁的效率更高? HashMap

三种双列集合,如何选择?

默认:HashMap(效率最高) 若保证存取有序:LinkedHashMap 如要进行排序:TreeMap

        

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

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

相关文章

基于SpringBoot二手图书管理系统

摘 要 本毕业论文设计并实现了一款基于 Spring Boot 的二手图书管理系统。该系统旨在解决传统图书管理系统存在的一系列问题&#xff0c;如用户体验不佳、功能单一等。首先&#xff0c;论文详细分析了当前二手图书市场的需求和存在的问题&#xff0c;明确了设计该系统的必要性…

你还不知道无线PLC?

随着技术的不断发展&#xff0c;工业控制系统也在经历着革新。无线PLC&#xff08;Programmable Logic Controller&#xff0c;可编程逻辑控制器&#xff09;是一种结合了无线通讯技术和传统PLC系统的创新型技术。它为工业自动化提供了一种更灵活、更便捷的解决方案&#xff0c…

简单聊聊大数据解决方案

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

IO流(转换流)

InputStreamReader&#xff08;字符输入转换流 &#xff09; 解决不同编码时&#xff0c;字符流读取文本内容乱码的问题 public static void main(String[] args) {try (//1.得到文件的原始字节流(GBK的字节流形式)FileInputStream is new FileInputStream("src/666.tx…

C语言 | Leetcode C语言题解之第135题分发糖果

题目&#xff1a; 题解&#xff1a; int candy(int* ratings, int ratingsSize) {int ret 1;int inc 1, dec 0, pre 1;for (int i 1; i < ratingsSize; i) {if (ratings[i] > ratings[i - 1]) {dec 0;pre ratings[i] ratings[i - 1] ? 1 : pre 1;ret pre;inc…

2024PTA算法竞赛考试编程题代码

目录 前言 题目和代码 L1-006 连续因子 L1-009 N个数求和 L2-004 这是二叉搜索树吗&#xff1f; L2-006 树的遍历 L2-007 家庭房产 L4-118 均是素数 L4-203 三足鼎立 L2-002 链表去重 L2-003 月饼 L2-026 小字辈 L4-201 出栈序列的合法性 L4-205 浪漫侧影 前言 所…

理解 Java 中的 `final` 关键字

理解 Java 中的 final 关键字 final 关键字是 Java 编程语言中一个重要的修饰符&#xff0c;它可以应用于类、方法和变量。理解 final 的用法和作用对于编写稳健和高效的 Java 代码至关重要。在本文中&#xff0c;我们将深入探讨 final 关键字的各种用法及其意义。 一、final…

python数据分析-Matplotlib绘图实例以及金融数据分析应用

通过学习扩展库matplotlib及背后的理论知识进行数据分析和可视化&#xff0c;重点以案例分析为主&#xff0c;通过实际案例演示相关理论和Python语言的应用。 读取文件countries-aggregated.csv数据&#xff0c;其中Date&#xff1a;日期, Country&#xff1a;国家, Confirmed…

‘AndroidStudio工具平台’尝试运行‘Android原生项目’

AndroidStudio工具平台 (内嵌Intelli IDEA集成环境) /Users/haijunyan/Library/Android/sdk 配置环境变量: #adb命令,安装APK查看连接设备 platform-tools #emulator命令,通过命令创建模拟器 tools #用NDK框架搭建的项目,用到下面的命令编译 ndk-bundle 等等 //查看当前设备…

Linux iptables详解

前言&#xff1a;事情是这样的。最近部门在进行故障演练&#xff0c;攻方同学利用iptables制造了一个故障。演练最终肯定是取得了理想的效果&#xff0c;即业务同学在规定时间内定位了问题并恢复了业务(ps&#xff1a;你懂得)。 对我个人来讲一直知道iptables的存储&#xff0…

pyqt opengl 小黑块

目录 OpenGLWidget_g初始化函数&#xff1a; 解决方法&#xff1a;把初始化函数的parent去掉 pyqt opengl 小黑块 原因&#xff1a; 创建OpenGLWidget_g的时候把main_window作为父类&#xff08;self&#xff09;传进去了&#xff0c; self.opengl_widget OpenGLWidget_g(…

Java面向对象-方法的重写、super

Java面向对象-方法的重写、super 一、方法的重写二、super关键字1、super可以省略2、super不可以省略3、super修饰构造器4、继承条件下构造方法的执行过程 一、方法的重写 1、发生在子类和父类中&#xff0c;当子类对父类提供的方法不满意的时候&#xff0c;要对父类的方法进行…

已解决Error || KeyError: ‘The truth value of a Series is ambiguous‘

已解决Error || KeyError: ‘The truth value of a Series is ambiguous’ &#x1f680; 原创作者&#xff1a; 猫头虎 作者微信号&#xff1a; Libin9iOak 作者公众号&#xff1a; 猫头虎技术团队 更新日期&#xff1a; 2024年6月6日 博主猫头虎的技术世界 &#x1f3…

设计模式 —— 观察者模式

设计模式 —— 观察者模式 什么是观察者模式观察者模式定义观察者模式的角色观察者模式的使用场景观察者模式的实现 被观察者&#xff08;Subject&#xff09;观察者&#xff08;Observer&#xff09;通知&#xff08;notify&#xff09;更新显示&#xff08;update&#xff09…

C++ BFS相关题目

目录 图像渲染 岛屿数量 图像渲染 733. 图像渲染 vis就是标记1有没有被用过 符合条件的都放到队列里&#xff0c;每次出队列一个&#xff0c;判四个&#xff0c; 如果要改的值与当前的值相同直接返回 注意&#xff1a;image[x][y] prev要放在坐标判断的后面&#xff…

我的mybatis学习笔记之二

第一版学习笔记 1,接口是编程: 原生: Dao > DaoImpl mybatis: Mappper > XXXMapper.xml 2,SqlSession代表和数据库的一次会话:用完必须关闭 3,SqlSession和connection一样是非线程安全的.每次使用都必须去获取新的对象 4,mapper接口没有是一类,但是mybtis会为这个接口生…

Linux启动KKfileview文件在线浏览时报错:启动office组件失败,请检查office组件是否可用

目录 1、导论 2、报错信息 3、问题分析 4、解决方法 4.1、下载 4.2、安装步骤 1、导论 今天进行项目部署时&#xff0c;遇到了一个问题。在启动kkfileview时&#xff0c;出现了报错异常&#xff1a; 2024-06-09 06:36:44.765 ERROR 1 --- [ main] cn.keking.service.Of…

运维小妙招:如何让系统信息随登录自动展现?

在日常运维工作中&#xff0c;及时获取系统的基本信息对于维护系统的稳定性和安全性至关重要。通过一个简单的登录脚本&#xff0c;我们可以在用户每次登录时自动显示系统的关键信息&#xff0c;这不仅提高了工作效率&#xff0c;还能快速定位问题。本文将介绍如何编写这样一个…

写给大数据开发的,要给领导汇报什么?

上篇&#xff1a;写给大数据开发&#xff0c;如何去掌握数据分析 就像说经济学家不炒股一样&#xff0c;有些数据开发不喜欢讲数据&#x1f4ca;&#xff0c;就很离谱…自己不讲数据&#xff0c;不相信数据&#xff0c;别人也不敢用了&#xff5e; 所以找上级汇报&#xff0…

KUKA机器人KRC5控制柜面板LED显示

对于KUKA机器人新系列控制柜KRC5控制柜来说&#xff0c;其控制柜面板LED布局如下图&#xff1a; 其中①②③④分别为&#xff1a; 1、机器人控制柜处于不同状态时&#xff0c;LED显示如下&#xff1a; 2、机器人控制柜正在运行时&#xff1a; 3、机器人控制柜运行时出现的故障…