zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【Java百炼成神】双生武魂——HashMap、LinkedHashMap、Hashtable

JAVA HashMap hashtable 炼成 LinkedHashMap
2023-06-13 09:15:16 时间

文章目录

集合概述

Map概述

HashMap基本使用

HashMap遍历

Map-value存储自定义类型

LinkedHashMap

Hashtable

 集合嵌套

集合<自定义对象>-判断操作

准备工作【重要】

ArrayList的contains判断是否包含某个元素

HashSet 的 add 判断是否重复 

HashMap 的 put 键判断是否重复

 写在最后

集合概述

集合:用来保存 相同类型数据 的容器,除了保存数据,又集成了较多强大功能。  我们会在下边的学习过程中,逐个学习以下集合: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 方法