当前位置: 首页 > news >正文

[自用】JavaSE--集合框架(二)--Map集合体系

概述

Map集合体系

HashMap:

LinkedHashMap:

就是在HashMap的基础上变得有序,代码同上,顺序会变成下图

TreeMap:

可排序,默认升序,其他规则和HashMap一样,无索引、不重复,后面的出现的数据会覆盖前面出现的数据

Map常用方法

同List集合,方法基本都是公共的

补充方法:putAll

如下图,可以将map2复制一份到map1中,且满足不重复的原则,map2中复制进去的相当于后来的数据,会覆盖原来在map1中相同的键(java2被覆盖)

Map遍历方式

第一种:键找值

将所以键放到一个set集合里,然后通过循环遍历set集合中的键找对应map的值

第二种:遍历键值对

与第一种思路接近,将键值对装进set集中中,再使用增强for循环进行遍历。

但是增强for循环的写法是  for( 类型 变量 : 集合) { };   其中的类型难以确定,因为键值对有可能两个元素类型不一样,比如<String , Double>

因此需要通过 map.enterySet( ) 方法获取所有键值对封装成对象装入set集中去,写法: Set< Map.Entery<类型1, 类型2> > entries = map.entery( );  

相当于键值对的类型就是  Map.Entery<类型1, 类型2>  ,装入到entries集合中去,之后遍历entries即可

示例:

第三种:Lambda表达式

jdk1.8开始可以使用的,这个方法有点赖了,巨简洁,如下图

更有甚者-->

原版代码其实如下图,然后采用了lambda表达式对匿名内部类进行简化

HashMap

无序、不重复、无索引

其实HashSet的本质就是没有值的HashMap,因此HashMap的原理与之前学习的HashSet一致,采用哈希表实现,如下图,HashMap用键来计算哈希值,且放入的数据是一个 键值对entry对象(下图的一个结点)

下面是从 【自用】JavaSE--集合框架(一)--Collection集合体系 中复制的:

HashMap同样也有对对象的去重原理,方法同HashSet,下面是从   【自用】JavaSE--集合框架(一)--Collection集合体系  中复制来的:

 HashSet默认不能对内容一样的两个不同对象进行去重!因为虽然内容一样,但是地址是不同的,因此HashSet会认为两个对象并不是重复的

解决办法:在对象的类中重写 equals方法 与 HashCode方法 即可,直接右键generate可以生成,具体如下,简单的理解 ---> 重写后的equals方法:若对象相同会返回true,而重写后的hashcode方法:若两个对象的内容一样就返回相同的哈希值

LinkedHashMap

有序、不重复、无索引

原理也与LikndHashSet一样,在哈希表的基础上增加了双链表,不同点就是存入的是 键值对 对象以及用键来计算哈希值

TreeMap

按照键的顺序默认升序排序(可自定义排序规则)、不重复、无索引

其实已经知道了,原理也是和TreeSet一样的!!!按照键默认升序排序,但是如果键是一个对象,就需要自定义排序,方法同TreeSet,具体如下(复制于【自用】JavaSE--集合框架(一)--Collection集合体系):

自定义排序规则

 由于无法对对象进行直接排序,因此需要自己指定排序规则,如下图,之前在学习Arrays.sort时学过,这里方法一样

补充:

  1. 如果两种方法都是用了,TreeSet会采用就近原则使用外部重写的Comparator规则,而不使用对象类内部重新的
  2. 如果两个对象中出现的某一项相同,比如采用年龄排序,年龄都是16,则会丢失其中一个,因为Set的规则就是出现输入相同的数据时会保留先前输入的

Comparable

让需要排序的对象类实现Comparable泛型接口,重写comparetor,自己指定规则,就能对对象进行排序了,示例如下:

Comparator

Comparator是一个匿名内部类,在传入参数时直接重写,可以利用TreeSet的有参构造器直接设置Comparator对象

示例如下,其中调用的 Double.compare(double a,double b) 方法:a>b return 1 ; a<b return -1; a==b return0

集合的嵌套

集合中还有集合,示例如下

http://www.dtcms.com/a/288904.html

相关文章:

  • nvm、npm、pnpm、cnpm、yarn
  • `MYSQL`、`MYSQL_RES` 和 `MYSQL_FIELD`的含义与使用案例
  • RCE随笔(1)
  • Node.js worker_threads 性能提升
  • VUE2 学习笔记2 数据绑定、数据代理、MVVM
  • 习题4.4 给出4个湖从大到小的顺序
  • 交通出行大前端与 AI 融合:智能导航与出行预测
  • 详解Mysql Order by排序底层原理
  • 黑马教程Webday6
  • 【Docker基础】Docker-compose常用命令实践(二):状态与日志查看
  • kafka生产端和消费端的僵尸实例以及解决办法
  • Vue开发前端报错:‘vue-cli-service‘ 不是内部或外部命令解决方案
  • 【Java学习|黑马笔记|Day18】Stream流|获取、中间方法、终结方法、收集方法
  • 【Linux】2. Linux下的C/C++开发环境
  • 【UE5医学影像可视化】读取dicom数据生成2D纹理并显示
  • pytest-log
  • 嵌入式Linux:获取线程ID
  • 数组算法之【合并两个有序数组】
  • 137. Java 泛型 - 泛型与通配符:子类型化关系
  • 【Linux】权限详解 权限本质、权限属性、su、sudo提权、chmod\chown\chgrp、文件类别
  • RxSwift-事件属性
  • Vuex 核心知识详解:Vue2Vue3 状态管理指南
  • Servlet快速入门
  • Docker在NAS部署MoonTV+OrionTV
  • 44.sentinel授权规则
  • tidyverse-数据读入
  • 基于智慧经营系统的学校住宿登记报表分析与应用探究-毕业论文—仙盟创梦IDE
  • 如何防止任务长期处于“等待”状态
  • Python基础和高级【抽取复习】
  • 基于单片机的自动条幅悬挂机