java基础 之 集合与栈的使用(三)
文章目录
- Map接口
- (一)实现类:HashMap
- 特点
- HashMap集合的一些方法
- (二)实现类: TreeMap
- 特点
- 【自然排序】代码
- 【定制排序】代码
- TreeMap集合的一些方法
- HashMap 和 TreeMap的区别
前文回顾:
戳这里 → java基础 之 集合与栈的使用(一)
戳这里 → java基础 之 集合与栈的使用(二)
阅读指南:第一遍可以先忽略代码~
代码可以直接复制粘贴~
Map接口
(一)实现类:HashMap
特点
- HashMap底层是链表+数组,jdk8以加入了红黑树
- HashMap存储是key-valuel类型的数据
- key不允许重复(重复时会被覆盖),value值允许重复
- 数据存储无序
- key和value都允许为空,但是只能有一个空的key
- 线程不安全
HashMap集合的一些方法
import java.util.HashMap;public class TestHashMap {public static void main(String[] args) {HashMap hashMap = new HashMap<>();HashMap newHashMap = new HashMap<>();// .put(K V value) 将键(key)/值(value)映射存放到Map集合中,无返回值hashMap.put("hello",123);hashMap.put("world",234);hashMap.put("Hello",123);hashMap.put("hello",123);newHashMap.put("aaa","111111");newHashMap.put("bbb","222222");newHashMap.put("ccc","3333333");// .get(Object key) 返回指定键所映射的值,没有该key对应的值则返回null,即获取key对应的value。System.out.println(hashMap.get("hello")); // 输出:123System.out.println(hashMap.get("hello1")); // 输出:null// . size() 返回Map集合中数据数量,准确说是返回key-value的组数。System.out.println(hashMap.size()); // 输出:3// isEmpty () 判断Map集合中是否有数据,如果没有则返回true,否则返回falseSystem.out.println(hashMap.isEmpty()); // 输出:false// remove(Object key) 删除Map集合中键为key的数据并返回其所对应value值。hashMap.remove("hello"); // 无返回值System.out.println("------");// containsKey(Object key) Hashmap判断是否含有keySystem.out.println(hashMap.containsKey("hello")); // 输出:false// containsValue(Object value) Hashmap判断是否含有value:System.out.println(hashMap.containsValue(123)); // 输出:true// Hashmap添加另一个同一类型的map下的所有数据hashMap.putAll(newHashMap); // 无返回数System.out.println(hashMap);// Hashmap替换这个key的valueSystem.out.println(hashMap.put("aaa","aaa0000")); // 替换后返回被替换的值System.out.println(hashMap);// clear() 清空Map集合'hashMap.clear(); // 无返回值}
}
多说几句:
1、key只能使用基本数据类型(int,char…)的封装类(Integer,String…)
2、jdk1.8 之前 HashMap 由 数组 + 链表 组成,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突。
3、jdk1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(一般为 8 )并且当前数组的长度大于 64 时,此时此索引位置上的所有数据改为使用红黑树存储。
4、插入、查找和删除操作的平均时间复杂度是O(1),但在最坏情况下可能会达到O(n)。
(二)实现类: TreeMap
特点
-
TreeMap是有序的key-value集合,是通过红黑树来实现的
-
无序(元素顺序与添加顺序不一致),且不允许重复
-
TreeMap的key是有序的
-
默认会对键进行排序,所以必须实现自然排序和定制排序中的一种
自然排序:TreeMap的所有key必须实现Comparable接口,且所有的key应该是同一类的对象,否则会抛出ClassCastException(类转换异常)
定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序。此时不需要key实现Comparable接口
-
若使用自定义类作为key,所属的类需重写equals()和hashCode(),当equals()的返回为true时,compareTo()返回应为0
-
同一个TreeMap对象中添加的key必须是相同的类型(因为要求key是具有可比性的对象)
【自然排序】代码
// 创建一个Student类,包含name(姓名)、age(年龄)和sno(学号)三个属性
public class Student implements Comparable{String name; // 姓名Integer age; // 年龄String sno; // 学号// 构造函数public Student(String name, Integer age, String sno) {this.name = name;this.age = age;this.sno = sno;}// 重写compareto方法。@Overridepublic int compareTo(Object o) {if(o instanceof Student){Student s = (Student) o;int c_name= this.name.compareTo(s.name);int c_sno = this.sno.compareTo(s.sno);if(c_name!=0){ // 先按照名称排序return this.sno.compareTo(s.name);}else if(c_sno!=0){ // 名称相同按照学号排序return this.sno.compareTo(s.sno);}else { // 名称、学号相同,按照年龄排序return this.age.compareTo(s.age);}}return 0;}// 方便打印显示@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", sno='" + sno + '\'' +'}';}
}
import java.util.TreeMap;
public class TestHashMap {public static void main(String[] args) {TreeMap treeMap = new TreeMap();treeMap.put(new Student("xiaoming",23,"1233456"),1234);treeMap.put(new Student("xiaoming",23,"1233451"),1234);treeMap.put(new Student("xiaoa",12,"1233451"),1234);System.out.println(treeMap);}
}
-------------打印结果----------------
{Student{name='xiaoa', age=12, sno='1233451'}=1234, Student{name='xiaoming', age=23, sno='1233451'}=1234, Student{name='xiaoming', age=23, sno='1233456'}=1234}
【定制排序】代码
// 创建一个Person类,注意该类不需要实现Comperator接口
import java.util.Comparator;public class Person{String name; // 姓名Integer age; // 年龄String phone; // 性别public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getPhone() {return phone;}public void setPhone(String sex) {this.phone = phone;}public static final Comparator<Person> COMPARATOR = new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {int p_name= o1.getName().compareTo(o2.getName()); // 按姓名比较int p_age = o1.getAge().compareTo(o2.getAge()); // 按年龄int p_phone = o1.getPhone().compareTo(o2.getPhone()); // 按手机号比较if(p_name!=0){ // 先按照名称排序return p_name;}else if(p_age!=0){ // 名称相同按照年龄return p_age;}else { // 名称、年龄相同,按照手机号码排序return p_phone;}}};public Person(String name, Integer age, String phone) {this.name = name;this.age = age;this.phone = phone;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", phone='" + phone + '\'' +'}';}
}
import java.util.TreeMap;public class TestHashMap {public static void main(String[] args) {TreeMap treeMap = new TreeMap(Person.COMPARATOR);treeMap.put(new Person("xiaoming",23,"1233456"),1234);treeMap.put(new Person("xiaoming",23,"1233451"),1234);treeMap.put(new Person("xiaoa",12,"1233451"),1234);System.out.println(treeMap);}
}
-------打印结果?自己敲或者复制代码自己运行吧,在此偷个懒了.....
1、自然排序需要实现Comparable接口并重写compareTo方法,不需要写get()和set()方法
2、定制排序不需要实现Comparable接口,需要通过匿名内部类生成一个静态常量COMPARATOR、getter()、setter()方法。同时在生成TreeMap对象时,需要使用创建的
COMPARATOR。
TreeMap集合的一些方法
public class TestHashMap {public static void main(String[] args) {TreeMap treeMap = new TreeMap(Person.COMPARATOR);Person p1 = new Person("xiaoming",23,"1233455");Person p2 = new Person("xiaoming",23,"1233451");treeMap.put(p1,1234);treeMap.put(p2,1234);treeMap.put(new Person("xiaoa",12,"1233454"),1234);Person p4 = new Person("xiaoz",12,"1233452");treeMap.put(p4,1234);treeMap.put(new Person("xiaoy",22,"1233453"),1234);Person example = new Person("xiaon",23,"1233456");// 返回指定的Key大于或等于的最小值的元素,如果没有,则返回nullEntry K = treeMap.ceilingEntry(example);// 返回小于等于key的最大Key的元素Entry big = treeMap.floorEntry(example);// 返回指定的Key大于或等于的最小值的Key,如果没有,则返回nullObject obj = treeMap.ceilingKey(example);// 返回小于等于key的最大Key的keyPerson bkey = (Person) treeMap.floorKey(example);// 返回集合的副本TreeMap cloneMap = (TreeMap) treeMap.clone();cloneMap.put(p1,"p1-6666");// 返回集合的全部Key,并且是逆序的NavigableSet navigableSet = treeMap.navigableKeySet();// 把集合逆序返回NavigableMap maps = treeMap.descendingMap();// 返回集合中最小的值、最大的值Entry thLittle = treeMap.firstEntry();Entry thBig = treeMap.lastEntry();// 返回集合中最小的key、最大的keyPerson littleKey = (Person) treeMap.firstKey();Person bigKey = (Person) treeMap.lastKey();// 返回Key小于参数的所有元素SortedMap map = treeMap.headMap(example);// 当inclusive为true时,就是返回Key小于等于toKey的所有元素NavigableMap mapTrue = treeMap.headMap(example,true);//返回Key大于key的所有元素、keyEntry entry = treeMap.higherEntry(example);Person person = (Person) treeMap.higherKey(example);// 截取集合中Key从fromKey到toKey的元素,否是截取他们本身,取决于true或者falseNavigableMap subs = treeMap.subMap(example,false,p4,false);// 截取集合中Key从fromKey到toKey的元素,包括fromKey,不包括toKeySortedMap sortedMap = treeMap.subMap(p1,p4);// 截取Key大于等于fromKey的所有元素SortedMap mp = treeMap.tailMap(p1);// 当inclusive为true时,截取Key大于等于fromKey的所有元素,否则截取Key大于fromKey的所有元素SortedMap s1 = treeMap.tailMap(p1,false);// 删除key最小的元素、最大元素Entry delLest = treeMap.pollFirstEntry();Entry delLast = treeMap.pollLastEntry();}
}
key因为是自定义变量的,所以上边用example或者p1,p2等来代替了
结果就自己打印出来看看吧
HashMap 和 TreeMap的区别
-
排序
- HashMap不保证元素的顺序,迭代顺序也是不确定的
- TreeMap 基于红黑树的实现,会根据键的自然排序或自定义的比较器对键进行排序。TreeMap保证了元素的顺序,可以按照键的升序进行遍历。
-
时间复杂度:
- HashMap的查找、插入和删除操作的平均时间复杂度为O(1)
- TreeMap的查找、插入和删除操作的时间复杂度为O(log n),其中n为元素的数量
-
性能
- HashMap提供了常数时间的性能(基于哈希表)
- TreeMap提供了对数时间的性能(基于红黑树)
相关文章:
java基础 之 集合与栈的使用(三)
文章目录 Map接口(一)实现类:HashMap特点HashMap集合的一些方法 (二)实现类: TreeMap特点【自然排序】代码【定制排序】代码TreeMap集合的一些方法 HashMap 和 TreeMap的区别 前文回顾: 戳这里 …...
JDK-java.nio包详解
JDK-java.nio包详解 概述 一直以来Java三件套(集合、io、多线程)都是最热门的Java基础技术点,我们要深入掌握好这三件套才能在日常开发中得心应手,之前有编写集合相关的文章,这里出一篇文章来梳理一下io相关的知识点。…...
虚拟机与服务器的区别是什么?虚拟机与服务器的区别和联系
服务器和虚拟机是两个不同的概念,它们在计算机领域有着不同的含义和作用。今天飞飞就和你分享虚拟机和服务器的区别和联系,希望可以帮助到你~ 1、物理形态 a)服务器是实实在在的物理设备,拥有独立的硬件架构。如CPU、硬盘、内存等 b)虚拟机…...
Linux CentOS stream9 命令
初学linux,对字符界面的命令并不陌生。问到什么是linux命令直接答cd、pwd、ls是linux命令。对于命令的定义并熟悉,也不太关心命令的底层执行逻辑,更关心录入命令,马上获取需要的结果。 本文就命令的定义、分类或执行优先级作一简单介绍。 一、定义 搜索网上对linux命令的…...
JavaScript基础——JavaScript变量声明
变量是存储数据的容器,可以变的量,值可以改变,在JavaScript中,变量声明的关键字有var、let,其中,var是ES5的语法,let是ES6的语法,变量需要先声明,在使用。 声明一个age变…...
ModuleNotFoundError: No Module Named openai
题意:Python 无法在环境中找到名为 openai 的模块 问题背景: import requests from bs4 import BeautifulSoup import openai #write each line of nuclear.txt to a list with open(nuclear.txt, r) as f:lines f.readlines()#remove the newline cha…...
基于SpringBoot+Vue的校园便利平台(带1w+文档)
基于SpringBootVue的校园便利平台(带1w文档) 基于SpringBootVue的校园便利平台(带1w文档) 本平台采用B/S架构、采用的数据库是MySQL,使用JAVA技术开发。该平台的开发方式无论在国内还是国外都比较常见,而且开发完成后使用普遍,可以给平台用户…...
串口应用编程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
串口应用编程 串口应用编程介绍 介绍 串口定义:串行接口,数据按顺序传输 串口特点:通信线路简单,距离远,速度较低 应用领域:常用工业接口 Linux系统中的作用 作为标准输入输出设备 系统打印信息输出 用户与系统交互 串口与终端:在Linux系统中,串口被视为一种终端&#…...
Canvas实现截图
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>canvas实现截图功能</title><style>.ca…...
Python高性能计算:进程、线程、协程、并发、并行、同步、异步
这里写目录标题 进程、线程、协程并发、并行同步、异步I/O密集型任务、CPU密集型任务 进程、线程、协程 进程、线程和协程是计算机程序执行的三种不同方式,它们在资源管理、执行模型和调度机制上有显著的区别。以下是对它们的详细解释和比较: 进程&…...
kafka基本操作
Kafka详解 一、Kafka概述 Kafka是一个开源的分布式事件流平台,它主要用于高性能数据管道、流分析、数据集成和关键任务应用。Kafka最初被设计为一个分布式的基于发布/订阅模式的消息队列,但随着时间的推移,它已发展成为一个功能强大的流处理…...
JavaFX布局-Accordion
JavaFX布局-Accordion 一个可扩展的面板,包括标题、内容与TitledPane配合一起使用 public static Accordion demo1() {// 创建AccordionAccordion accordion new Accordion();// 内边距accordion.setPadding(new Insets(10, 10, 10, 10));for (int i 1; i < 1…...
【轨物方案】评估光伏组件发电性能一致性方案
光伏电站建设后运行周期长达二十多年,对于电站运营者来说,基础设施的稳定、安全、高效的运行是至关重要的。然而从近些年光伏的发展过程中看到,在电站规划到后期运维整个过程中可能存在着诸多问题,如设备选型不当、施工建设质量差…...
安全基础学习-keil调试汇编代码
初始目的是为了通过汇编编写CRC功能。 但是基础为0,所以目前从搭建工程开始记录。 大佬绕路。 (一)创建项目 1. 新建项目 打开 Keil uVision。选择 Project -> New uVision Project 创建一个新项目。选择你的目标设备(如 ARM Cortex-M 系列处理器),我这里一开始选择…...
Unity复制对象时让私有变量也被复制的简单方法
Unity复制对象时,如果一个变量为公共变量(public),那么这个变量的值会被复制到新的对象中去,但是如果一个变量是私有变量(private),默认是不会被复制的,如果希望被复制&a…...
Flink 实时数仓(二)【DIM 层搭建】
1、DIM 层搭建 1.1、设计要点 DIM层设计要点: DIM层存的是维度表(环境信息,比如人、场、货等)DIM层的数据存储在 HBase 表中DIM层表名的命名规范为dim_表名 DIM 层表是用于维度关联的,要通过主键(维度外…...
知识图谱开启了一个可以理解的人工智能未来
概述 本文是对利用知识图谱(KG)的综合人工智能(CAI)的全面调查研究,其中 CAI 被定义为可解释人工智能(XAI)和可解释机器学习(IML)的超集。 首先,本文澄清了…...
借助Aspose.html控件, 将SVG 转PNG 的 C# 图像处理库
Aspose.HTML for .NET 不仅提供超文本标记语言 ( HTML ) 文件处理,还提供流行图像文件格式之间的转换。您可以利用丰富的渲染和转换功能将SVG文件渲染为PNG、JPG或其他广泛使用的文件格式。但是,我们将使用此C# 图像处理库以编程方式在 C# 中将 SVG 转换…...
vs-2015安装教程
双击安装包 2-如图先选自定义,然后选安装路径(英文路径) 3-安装选项一个就够了,如图 4-点击下一步,之后如下图 5-点击安装 启动,如图则恭喜你成功安装...
Stable Diffusion绘画 | 文生图设置详解—随机种子数(Seed)
随机种子数(Seed) Midjourney 也有同样的概念,通过 --seed 种子数值 来使用。 每次操作「生成」所得到的图片,都会随机分配一个 seed值,数值不同,生成的画面就会不同。 默认值为 -1:每次随机分…...
56、php实现N的阶乘末尾有多个0
题目: php实现N的阶乘末尾有多个0 描述: 阶乘 N! 123*…N; 比如 5! 12345 120 末端有1个0 解题思路: N! K*(10^M) N的阶乘为K和10的M次方的乘积,那么N!末尾就有M个0。如果将N的阶乘分解后,那么N的阶乘可以分解为&…...
混合域注意力机制(空间+通道)
在计算机视觉任务中,空间域注意力通常关注图像中不同位置的重要性,例如突出图像中的关键对象或区域。而通道域注意力则侧重于不同通道(特征图)的重要性,决定哪些特征对于任务更具判别力。混合域注意力机制结合了空间域…...
springboot长春旅游安全地图平台-计算机毕业设计源码90075
摘 要 本文详细阐述了基于微信小程序前端和Spring Boot后端框架的长春旅游安全地图平台的设计思路与实现过程。该平台旨在为长春游客提供安全、便捷的旅游服务,同时为旅游管理部门提供高效的信息管理和应急响应机制。 在平台设计上,我们充分考虑了用户体…...
apex正则表达式匹配富文本字段内容,如何只匹配文本而忽略富文本符号
在Apex中处理富文本字段时,如果你只想匹配其中的纯文本而忽略富文本符号,可以使用正则表达式来去除HTML标签,然后再进行文本匹配。以下是一个示例代码,展示了如何实现这一点: public class RichTextHandler {// Funct…...
空气净化器对去除宠物毛有效吗?小型猫毛空气净化器使用感受
作为一个养猫多年的猫奴,家里有两只可爱的小猫咪:小白和小花。虽然相处起来很开心,但也给生活带来了一些小麻烦。谁懂啊,我真的受够了,每天都在粘毛。猫窝的猫毛一周不清理就要堆成山,空气中也全是浮毛&…...
vue的nextTick是下一次事件循环吗
如题,nextTick的回调是在下一次事件循环被执行的吗? 是不是下一次事件循环取决于nextTick的实现,如果是用的微任务,那么就是本次事件循环;否则如果用的是宏任务,那么就是下一次事件循环。 我们看下Vue3中…...
5.4.软件工程-系统设计
考试占比不高 概述 系统设计的主要目的就是为系统制定蓝图,在各种技术和实施方法中权衡利弊,精心设计,合理地使用各种资源,最终勾画出新系统的详细设计方案。系统设计的主要内容包括新系统总体结构设计、代码设计、输出设计、输…...
Apache Kylin与BI工具集成:数据可视化实战
Apache Kylin与BI工具集成:数据可视化实战 1. 引言 Apache Kylin是一个开源的分布式分析引擎,专注于大数据的OLAP(在线分析处理)。它可以快速地对大量数据进行多维分析,并支持与多种BI(商业智能ÿ…...
通过idea图形化界面就能push到github流程
建好自己要提交的项目 建好github想提交的地址 git initgit remote add origin https://github.com/usernamezhaozhao/github2test/tree/maingit branch maingit checkout main创建一个文件,我起了一个a.txt git pull origin main 好了,可以idea打开了 …...
C语言初阶(10)
1.野指针 野指针就是指向未知空间的指针,有以下几种情况 (1)指针未初始化 int main() {int a0;int*b;return 0; } 上面指针就是没有初始化,形成一种指向一个随机空间的地址的指针,我们可以修改成 int main() {int a0;int*bNU…...
免费wap自助建站系统/百度推广平台首页
刚看到是3xian大牛的题就让我菊花一紧,觉着这题肯定各种高端大气上档次,结果果然没让我失望。 刚开始我以为是一个普通的线段树区间求和,然后啪啪啪代码敲完测试没通过,才注意到这个求和是要去掉相同的值的。 前两天我在做一道题的…...
网站关键词优化方式/购物网站如何推广
我们前一篇文章介绍了本地使用APS.NET开发的WEB服务如何使用AZURE AD(AAD)验证登录,今天我们主要介绍本地使用JAVA开发的WEB服务如何使用AAD验证登录。其实方法跟ASP.NET是一样的,需要在AZURE中注册服务才可以,然后得到…...
做网站javaee/搜索引擎关键词快速优化
创建db2 实例和创建库的方法大致分为两类!一类是图形界面db2setup 创建一种是CLI创建!此处只描述一下CLI方式至于图形界面请大家搜索一下吧!db2 创建实例 创建数据库1.创建实例用户mkdir /db2/db2test 创建实例用户目录smitty user选择Add a …...
珠海疫情/网络营销seo优化
欢迎关注:机器视觉CV 公众号后台回复机器学习获取学习资源本节内容简单介绍 TF2.0TF2.0 中的部分模块 Mnist 例程TF2.0 介绍TensorFlow 是谷歌基于 DistBelief 进行研发的第二代人工智能学习系统,自 2015 年问世,并在去年 11 月迎来三周岁生日࿰…...
东莞网站建设费用/企业网站的域名是该企业的
一、单个机器无法上网 别人都可以可以,从以下几点进行检查。1、ping http://www.taobao.com如果通 但还是不能上网的话 可能是浏览器 中毒等问题!2、ping 127.0.0.1 如果能ping通说明网卡是好的 要是这个地址ping不通就要换网卡了。3、ping公司局域网的网…...
外贸做网站要多久做好/怎么给客户推广自己的产品
作者是一名从事儿网站运营的草根站长,做网站主要是为了增加一下兼职收入而已(相信大多数的站长朋友都是如此)! 事件起因; 小编8月10号建立了一个网站,想引一下蜘蛛,就在那些比较大型的站长经常进入的网站上找到了一个名为“XXX”的外链代发服…...