目录
一、Map接口
1、Map接口的解释
2、Map集合的常用方法
3、关于Map接口中常见的子类添加问题
二、Set接口
1、Set集合的解释
2、Set集合常用的方法
三、练习题
1、只出现一次的数字
2、复制带随机指针的链表
3、规律单词
4、宝石与石头
5、旧键盘打字
四、相关代码
一、Map接口
1、Map接口的解释
Map 是 Java 中特别常见的一种数据类型,以键值对存储数据
HashMap是基于哈希表实现的
、TreeMap是基于RBTree(红黑树-二分搜索树)实现的
2、Map集合的常用方法
Map
是 Java 中特别常见的一种数据类型,以键值对存储数据 HashMap是基于哈希表实现的
、TreeMap是基于RBTree(红黑树-二分搜索树)实现的
2、Map集合的常用方法
(1)根据相应的key值取出相应的value值
(2)Map集合的遍历:实际上就是取出这一对一对的元素
Map中键值对这个类型——>Map.Entry(代表一个个键值对)
这个方法的返回值是一组键值对象
(3)添加一个新的键值对
如果key不存在,就新增一个Map.Entry对象保存到Map集合中
如果key存在,就修改原来的value为新的value,返回修改前的value
(4)删除 key对应的的这一个键值对,返回对应的value值
(5)返回当前Map集合中所有key值集合,因为key是不重复的,所以返回了一个Set类型的集合
(6)返回当前Map集合中所有value集合
(7)判断当前的key值在Map集合中是否存在,存在返回true,否则返回false
(8)判断value在Map集合中是否存在
(9)
3、关于Map接口中常见的子类添加问题
(1)Map接口中元素的添加顺序和元素的保存顺序是没有必要的联系的
在HashMap中按保存的元素顺序是由hash函数决定的
(1)Map接口中元素的添加顺序和元素的保存顺序是没有必要的联系的
在HashMap中按保存的元素顺序是由hash函数决定的
在TreeMap中的compareTo方法决定的,要能使用TreeMap保存元素,该类就必须实现Comparable或者使用比较器
(2)关于保存null值的说明
在HashMap中可以保存null值,其中key和value都可以为空,并且key为null有且只有一个
在TreeMap中key值不能为null,value值可以为null
二、Set接口
1、Set集合的解释
Set其实就是披着外衣的Map,也是Collection接口的子接口,和List集合最大的区别在于,Set集合保存的元素不能重复,因此Set结合一般用来进行去重处理。
Collection接口特性,一次只能保存一个元素,而Map接口可以一次保存一対元素,叫做键值对对象。
2、Set集合常用的方法
(1)添加元素,添加成功则返回true,若已经存在该元素,则添加失败,返会false
(2)判断一个元素是否在Set集合中存在
(3)在Set集合中删除指定元素,若果元素不存在,删除失败,返回false,否则删除该元素,返回true
(4)可以发现在Set集合中不提供修改元素的方法,如果要修改元素,就只能把要修改的元素先删除,然后添加新元素
(5)相关代码
三、练习题
1、只出现一次的数字
package priority_queue.leetcode;
import java.util.HashMap;
import java.util.Map;
public class Num136 {
public int singleNumber(int[] nums) {
//先遍历原数组,将出现的元素以及频次保存到Map集合中
Map map=new HashMap<>();
for (int i:nums) {
map.put(i,map.getOrDefault(i,0)+1);
}
//遍历Map集合找到频次为1的元素
int ret=0;
for (Map.Entry entry: map.entrySet()){
if (entry.getValue().equals(1)){
ret=entry.getKey();
}
}
return ret;
}
}
2、复制带随机指针的链表
(1)遍历原链表,在Map集合中维护和新链表的映射关系
(2)再次遍历原链表,通过映射关系维护新链表的next和random
package priority_queue.leetcode;
import java.util.HashMap;
import java.util.Map;
public class Num138 {
public Node copyRandomList(Node head) {
//遍历原链表,使用Map集合维护原链表节点和新链表节点的映射关系
Map map=new HashMap<>();
for (Node x=head;x!=null;x=x.next){
Node node=new Node(x.val);
map.put(x,node);
}
//再次遍历原链表,通过映射关系维护新链表的next和random
for (Node x=head;x!=null;x=x.next){
//原1.next=原3
//新1.next=新3
map.get(x).next=map.get(x.next);
//原1.random=原5
//新1.random=新5
map.get(x).random=map.get(x.random);
}
return map.get(head);
}
}
class Node {
int val;
Node next;
Node random;
public Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}
3、规律单词
将pattern中的字母以及str中的字符都转变为数字,然后进行比较
4、宝石与石头
使用Set集合存储宝石中的字符,然后去遍历石头中的字符,看是否处在即可
package Map_and_Set.Leetcode;
import java.util.HashSet;
import java.util.Set;
public class Num771 {
public int numJewelsInStones(String jewels, String stones) {
//使用set集合保存jewels中的字符
Set set=new HashSet<>();
for (int i = 0; i
5、旧键盘打字
package Map_and_Set.Leetcode;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class jiujianpan {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String expectedStr=null;
String actualStr=null;
while (scanner.hasNextLine()){
expectedStr=scanner.nextLine();
actualStr=scanner.nextLine();
}
//注意输出的字母都是大写,所以直接先转为大写
expectedStr=expectedStr.toUpperCase();
actualStr=actualStr.toUpperCase();
//遍历实际输入的字符串存到set集合中
Set set=new HashSet<>();
for (int i = 0; i set1=new HashSet<>();
for (int i = 0; i
6、前k个高频词
四、相关代码
https://gitee.com/ren-xiaoxiong/rocket_class_ds/tree/master/src/Map_and_Sethttps://gitee.com/ren-xiaoxiong/rocket_class_ds/tree/master/src/Map_and_Set



