【Java百炼成神】双生武魂——HashMap、LinkedHashMap、Hashtable
文章目录
集合概述
集合:用来保存 相同类型数据 的容器,除了保存数据,又集成了较多强大功能。 我们会在下边的学习过程中,逐个学习以下集合:HashMap、LinkedHashMap、Hashtable、 在学习 HashMap时,完成对集合基本知识的学习,如HashMap遍历等
Map概述
Map 集合叫做双列集合,每个元素都由“键”、“值”两部分组成
该集合记录的是键值对 对应关系, 通过键可以找到对应的值。比如梁山好汉的绰号与该人的对应。
HashMap基本使用
HashMap 和 HashSet 一样,是无序的(展示顺序和存放顺序可能不同) Map(HashMap)的使用: 创建对象时规定键和值的数据类型。 HashMap<键,值>
常用方法:
方法名 | 描述 |
---|---|
put(K key,V value) | 向集合中添加数据。 添加成功,返回 null 若键重复,则新值覆盖旧值。将被覆盖的旧值返回。 |
get(Object key) | 通过指定键 key 获得值 value 若获取不到,返回 null |
remove(Object key) | 移除指定 key 对应的键值,并返回值。 |
clear() | 清空集合 |
size() | 集合中键值的个数 |
isEmpty() | 集合是否为空 |
HashMap遍历
方法名 | 描述 |
---|---|
keySet() | 以 Set 集合的方式获得所有键 key |
entrySet() | 以 Set 集合的方式获得所有的键值对(Entry 对象) Entry 对象方法: 获取键:getKey() 获取值:getValue() |
方式一:keySet():【快捷键:变量名.keySet().for】
HashMap<Integer, String> map1 = new HashMap<Integer, String>();
map1.put(1,"a");
map1.put(2,"b");
map1.put(3,"c");
//1、以 set 集合方式,获取所有的 key
Set<Integer> set = map1.keySet();
//2、增强 for 遍历 set 集合,遍历出一个 key,就通过 get(key)方法获取 value 值
for(Integer key:set){
String value = map1.get(key);
System.out.println("key:"+key+" value:"+value);
}
方式二:entrySet():【快捷键:变量名.entrySet().for】
HashMap<Integer, String> map1 = new HashMap<Integer, String>();
map1.put(1,"a");
map1.put(2,"b");
map1.put(3,"c");
//1、将一个键值对封装进一个 Entry 对象,获取一个装满 Entry 对象的 set 集合
Set<Map.Entry<Integer, String>> set = map1.entrySet();
//2、增强 for 遍历 set 集合,遍历出一个 Entry 对象,就相当于获取了一个键值对
for (Map.Entry<Integer, String> entry : set) {
//2.1、通过 Entry 对象的 getKey()和 getValue()获取键值对
Integer key = entry.getKey();
String value = entry.getValue();
System.out.println("key:"+key+" value:"+value);
}
练习: 使用 map 集合存储一个人的所有属性值,并完成遍历。
Map-value存储自定义类型
同其他集合一样,Map 的 key 或 value 都可以存储自定义类型对象:
建议:1、使用 value 存储自定义对象。 2、key 使用基本数据类型或 String
练习: 使用 map 集合存储系统属性名称与属性值。 使用 map 集合存储人名与个人对象,计算所有人的平均年龄,并完成遍历。
LinkedHashMap
LinkedHashMap 是有序 Map 集合。 是在 HashMap 的基础上添加了链表结构,通过链表结构可以保证元素的存取顺序一致;
Hashtable
Hashtable 也是 Map 集合的一种已被 HashMap 取代,在很早的传统项目中会大量见到。其与 HashMap 最大的不同: Hashtable 不支持 null 作为键或值,是安全的。 HashMap 支持 null 作为键或值,是不安全的。
集合嵌套
集合嵌套并不是一个新的知识点,和 if 嵌套、for 嵌套一样,仅仅是格式上的内容。 单列集合嵌套: 传智学院(List 表示)有多个分校(list 表示),每个分校有多个班级(字符串)。
双列集合与单列集合嵌套 传智学院(Map 表示,key:分校名称、value:分校的班级集合)
双列集合嵌套 传智学院(Map 表示,key:分校名称、value:分校信息) 分校信息(Map 表示,key:班级名称、value 班级对象)
要求: 传智学院 Java 基础班 001 001 张三 002 李四 Java 就业班 001 001 王五 002 赵六 对以上数据进行对象的存储 001 张三 键值对-->定义一个 Java 基础班 001 一个 Map 集合 传智学院:存储的就是班级名称和班级的学生集合 基础班 Map<学号,姓名> 传智学院 Map<班级名称,基础班的 Map>
集合<自定义对象>-判断操作
准备工作【重要】
集合元素若为自定义对象,需要在自定义类中选中对应方法,才能进行集合元素的判断操作。 1、类中其他内容写完后,自动生成 HashCode 和 Equals 方法
2、
3、
4、
5、
ArrayList的contains判断是否包含某个元素
方法名 | 描述 |
---|---|
boolean contains(Object obj) | 判断集合中是否包含某个元素。 true 表示包含 false 表示集合中不包含该元素 |
前人已经为 String、Integer 等类重写过 equals 方法,我们就不用再重写了。 但如果集合中是自定义类,使用 contains 方法之前,则需要重写类的 equals 方法。
例如:定义一个 Person 类(姓名 name 和 年龄 age )。 集合中保存三个人: 小明,18 小红,19 小张,20 现在判断 【小张,20】 和 【小明,20】 是否存在于集合中 要求:姓名和年龄都相同,才是同一个人 实现:
HashSet 的 add 判断是否重复
HashSet 不能存储重复元素:
如果集合中是自定义类型,则必须为自定义类型重写 hashCode()和 equals()方法,HashSet 的 add 方法 才能正确去重复。
HashMap 的 put 键判断是否重复
我们知道,HashMap 中,put 重复的键,会使用新 value 替换旧 value。 如果键是自定义类型,自定义类型必须重写 hashCode 和 equals 方法
相关文章
- c++酒店管理系统课程设计_基于java的酒店管理系统源码
- java list去重_JAVA基础-List去重的6种方式[通俗易懂]
- Java编译时注解自动生成代码[通俗易懂]
- java 取余 小数_Java小数取余问题求助「建议收藏」
- 【说站】java实现PDF加密、分割和生成封面图操作
- java HashTable和HashMap的区别详解「建议收藏」
- 【Java AWT 图形界面编程】在 Canvas 画布中绘制箭头图形 ( 数据准备 | 几个关键的计算公式 | 绘制箭头直线和尾翼 )
- 图片缩放的Java类详解编程语言
- Java匹配中文的正则表达式详解编程语言
- 细思极恐-你真的会写java吗详解编程语言
- java.util.HashMap和java.util.HashTable (JDK1.8)详解编程语言
- Java学习笔记之二java标识符命名规范详解编程语言
- java集合HashMap、HashTable、HashSet详解编程语言
- Linux下配置Java环境变量的简易指南(linux配置java环境变量)
- 解锁Java 与 Oracle 的连接之门(java连接oracle)
- 策略Java实现Redis过期策略(redisjava过期)
- 节点使用Java管理Redis过期节点(redisjava过期)
- Java操作Redis实现数据快速存取(java访问redis)
- Linux平台上C语言接口调用Java语言实现(linux c调java)
- Java程序调用Linux系统命令实现更多功能(java调用linux命令)
- Java程序构建Oracle数据库直连(java直连oracle)
- Java技术将数据写入Oracle数据库(java写入oracle)
- JAVA+Hibernate无限级分类
- Java实现JSP在Servelt中连接Oracle数据库的方法