目录
1.8 HashMap、LinkedHashMap、TreeMap的区别
双列集合Map
1.1 概述
java.util.Map:Map是一种接口,用于表示键值对的集合。它提供了一种将键映射到值的方式,其中每个键只能映射到一个值。Map提供了一组方法来操作和访问其中的元素。Map中的键是唯一的,每个键对应一个值。可以通过键来访问和更新值。常见的实现类包括HashMap、LinkedHashMap、TreeMap等。
1.2 特点
- Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)。
- Map集合中的元素,key和value的数据类型可以相同,也可以不同。
- Map集合中的元素,key是不允许重复的,value是可以重复的。
- Map集合中的元素,key和value是一一对应的。
1.3 Map接口中的常用方法
public V put(K key,V value):把指定的键与指定的值添加到Map集合中。
返回值:V
存储键值对的时候,key不重复,返回值V为null。
存储键值对的时候,key重复,会使用新的value值替换Map中重复的value,返回被替换掉的value值。
public V remove(Object key):把指定的键所对应的键值对元素在Map集合中删除,返回被删除元素的值。
返回值:V
key存在,V返回被删除的值。
key不存在,V返回null。
public V get(Object key):根据指定的键,在Map集合中获取对应的值。
返回值:V
可以存在,V返回对应的value值。
可以不存在,V返回null。
public boolean containsKey(Object key):判断集合中是否包含指定的键。
返回值:包含返回true,不包含返回false。
public Set<K> keySet():获取Map集合中所有的键,存储到Set集合中。
作用:通过键找值的方式去遍历Map集合。
实现步骤:
1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中。
2.遍历set集合,获取Map集合中的每一个key。
3.通过Map集合中的方法get(key),通过key找到value。
public Set<Map.Entry<K,V>> entrySet:获取到Map集合中所有的键值对对象的集合(Set集合)。
作用:使用Entry对象遍历Map集合。
实现步骤:
1.使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中。
2.遍历Set集合,获取每一个Entry对象。
3.使用Entry对象中的方法getKey和getValue获取键和值。
1.3.1 练习
package com.zhy.coll;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class TestMap {
public static void main(String[] args) {
//创建Map集合对象,多态
Map<String,Integer> map = new HashMap<>();
//1.put:将指定的键与指定的值添加到Map集合中
map.put("zhangsan",17);
map.put("lisi",29);
Integer i = map.put("wangwu",30);
Integer i2 = map.put("zhangsan",27);
System.out.println("存储不重复key的返回值:" + i);
System.out.println("存储重复key的返回值:" + i2);
System.out.println("初始化Map集合:" + map);
System.out.println();
//2.remove:根据key移除Map集合中的元素
Integer i3 = map.remove("zenghai");
Integer i4 = map.remove("lisi");
System.out.println("移除集合中不存在key的返回值:" + i3);
System.out.println("移除集合中存在key的返回值:" + i4);
System.out.println("移除元素指定key之后的集合:" + map);
System.out.println();
//3.get:根据key获取集合中对应的值
Integer i5 = map.get("zhangsan");
Integer i6 = map.get("haidi");
System.out.println("获取集合中存在的key的返回值:" + i5);
System.out.println("获取集合中不存在的key的返回值:" + i6);
System.out.println();
//4.containsKey:判断集合中是否包含key,包含返回true,不包含返回false
System.out.println("集合中是否包含zhangsan的key:" + map.containsKey("zhangsan"));
System.out.println("集合中是否包含zengyue的key:" + map.containsKey("zengyue"));
System.out.println();
//5.keySet:将map中所有的键存储到Set集合中,然后通过迭代器或者增强for遍历
System.out.print("使用keySet遍历Map集合:");
Set<String> keySets = map.keySet();
for (String key : keySets){
Integer value = map.get(key);
System.out.print(key + "=" + value + "\t");
}
//6.entrySet:将map中所有的键值对存储在Set集合中,使用Entry对象遍历Map集合
System.out.print("\n使用entrySet遍历Map集合:");
Set<Map.Entry<String, Integer>> entrySets = map.entrySet();
for (Map.Entry<String, Integer> keyAndValue : entrySets){
String key = keyAndValue.getKey();
Integer value = keyAndValue.getValue();
System.out.print(key + "=" + value + "\t");
}
}
}
注:HashMap存储自定义类型键值,Map集合保证键是唯一的:作为key的元素,必须重写hashCode和equals方法,以保证key唯一。
1.4 HashMap集合
1.4.1 概述
java.util.HashMap:HashMap是一种实现了Map接口的键值对存储结构。它是基于哈希表的实现,通过哈希函数将键映射到数组中的位置来存储和检索值。
1.4.2 特点
- HashMap集合底层是哈希表:查询的速度特别的快。
- HashMap集合是一个无序的集合,不保证元素的顺序,也不保证迭代顺序。
- HashMap允许存储null键和null值,并允许多个null值存储。
- HashMap中的键和值可以是任意类型的对象,通过hashCode()和equals()方法来确定键的唯一性。如果两个键的hashCode()值相等并且equals()方法返回true,则将被视为同一个键,后插入的值会覆盖旧值。
package com.zhy.coll;
import java.util.HashMap;
public class TestMap {
public static void main(String[] args) {
//HashMap特点:无序,不可存储重复元素
HashMap<String,Integer> hashMap = new HashMap<>();
hashMap.put("zhangsan",18);
hashMap.put("lisi",30);
hashMap.put("wangwu",27);
hashMap.put("zhangsan",35);
System.out.println(hashMap);//输出:{lisi=30, zhangsan=35, wangwu=27}
}
}
1.5 LinkedHashMap集合
1.5.1 概述
java.util.LinkedHashMap:LinkedHashMap是Java的一种实现了Map接口的类,它继承自HashMap类。它是一种既保留了插入顺序又保留了访问顺序的Map,即可以通过插入顺序或访问顺序来遍历。与HashMap不同的是,LinkedHashMap在内部使用了双向链表来维护插入顺序或访问顺序。
1.5.2 特点
- LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序)。
- LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的。
package com.zhy.coll;
import java.util.LinkedHashMap;
public class TestMap {
public static void main(String[] args) {
//LinkedHashMap特点:有序(根据键插入的顺序),不可存储重复元素
//如果遇到重复元素,键不变,值改为最新的
LinkedHashMap<String,Integer> linkedHashMap = new LinkedHashMap();
linkedHashMap.put("zhangsan",18);
linkedHashMap.put("lisi",30);
linkedHashMap.put("wangwu",27);
linkedHashMap.put("zhangsan",35);
System.out.println(linkedHashMap);//输出:{zhangsan=35, lisi=30, wangwu=27}
}
}
1.6 TreeMap集合
1.6.1 概述
java.util.TreeMap:在Java中,TreeMap是一种实现了SortedMap接口的类,它按照键的自然顺序进行排序。它是一个有序的键值对集合,基于红黑树数据结构实现,可以快速地进行插入、删除和查找操作。
1.6.2 特点
- 键值对按 键 的顺序进行排序,并且支持快速的查找操作。
- TreeMap可以存储不重复的键值对,键不能为null,值可以为null。
- TreeMap是基于红黑树实现的,所以插入、删除和查找操作的时间复杂度都为O(log n)。
package com.zhy.coll;
import java.util.*;
public class TestMap {
public static void main(String[] args) {
Map<String,Integer> map = new TreeMap<>();
map.put("aaa",28);
map.put("ccc",30);
map.put("bbb",34);
//输出:{aaa=28, bbb=34, ccc=30}
//treeMap会对存储的元素根据键进行排序
System.out.println(map);
//TreeMap的key不能存储空值,会引发空指针异常:java.lang.NullPointerException
map.put(null,null);
//但是value可以存储null
map.put("ddd",null);
}
}
1.7 Map集合练习
计算一个字符串中每个字符出现的次数。
package com.zhy.coll;
import java.util.*;
public class TestMap {
public static void main(String[] args) {
//1.定义一个map集合,键为字符,值为字符出现的次数
Map<Character,Integer> map = new LinkedHashMap<>();
//2.使用Scanner类,从键盘接收一个字符串
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
//3.将字符串转换成字符数组,遍历每一个字符
char[] strArray = str.toCharArray();
for (char c : strArray){
//4.判断字符,如果map中已经存在,则根据key或者对应的value,然后+1
if (map.containsKey(c)){
map.put(c,map.get(c) + 1);
}else {
//5.如果map中不存在,则将字符加入到map中,value=1
map.put(c,1);
}
}
//6.遍历集合
Set<Character> characters = map.keySet();
for (Character c : characters){
System.out.println(c + "出现了" + map.get(c) + "次");
}
}
}
1.8 HashMap、LinkedHashMap、TreeMap的区别
HashMap、LinkedHashMap和TreeMap是Java中常用的三种Map实现类,它们的区别如下:
集合 | 数据结构 | 元素是否有序 | 元素是否排序 | 性能 | 键为空 |
---|---|---|---|---|---|
HashMap | 哈希表 | 无序 | 不排序 | 高 | 允许 |
LinkedHashMap | 哈希表+链表 | 按照插入顺序 | 不排序 | 中 | 允许 |
TreeMap | 红黑树 | 从小到大排序 | 排序 | 低 | 不允许 |
总结:HashMap适用于大部分场景下的快速查找;LinkedHashMap适用于保持插入顺序的场景;TreeMap适用于有序存储和范围查找的场景。