一、概述
1.认识Map集合
- Map集合称为双列集合,格式:{key1=value1,key2=value2,key3=value3,…},一次需要存一对数据作为一个元素
- Map集合的每个元素“key=value”称为一个键值对/键值对象/一个Entry对象,Map集合也被叫做“键值对集合”
- Map集合的所有键是不允许重复的,但值可以重复,键和值是一一对应的,每一个键只能找到自己对应的值
2.Map集合体系的特点
注意:Map系列集合的特点都是由键决定的,值只是一个附属品,值是不做要求的
- HashMap(由键决定特点):无序、不重复、无索引;
- LinkedHashMap(由键决定的特点):有序、不重复、无索引;
- TreeMap(由键决定的特点):按照大小默认升序排序、不重复、无索引;
二、常用方法
方法名称 | 说明 |
---|---|
public V put (K key,V value) | 添加元素 |
public int size() | 获取集合大小 |
public void clear() | 清空集合 |
public boolean isEmpty() | 判断集合是否为空,为空返回true,反之 |
public V get(Object key) | 根据键值获取对应值 |
public V remove(Object key) | 根据键删去对应值 |
public boolean containsKey(Object key) | 判断是否包含某个键 |
public boolean containsValue(Object value) | 判断是否包含某个值 |
public Set keySet() | 获取全部键的集合 |
public Collectionvalues() | 获取Map集合的全部值 |
import java.util.HashMap;
import java.util.Map;
public class MapTest2 {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<>();
map.put("手表",100);
map.put("手表", 200);
map.put("手机", 2);
map.put("java", 2);
map.put(null,null);
System.out.println(map);
//获取集合大小
map.size();
//清空集合
//map.clear();
//判断集合是否为空,为空返回true反之
map.isEmpty();
//根据键获取对应值
map.get("手表");
//根据键删除整个元素
map.remove("java");
//判断是否包含某个键
map.containsKey("手机");
//判断是否包含某个值
map.containsValue(100);
//获取全部键的集合
map.keySet();
//获取Map集合的全部值
map.values();
//扩展:把把其他Map集合中的数据倾倒入自己的集合中去
Map<Integer,Integer> C1 = new HashMap<>();
Map<Integer,Integer> C2 = new HashMap<>();
C1.put(12, 12);
C1.put(13, 13);
C2.put(14, 14);
C2.put(15, 15);
//使用putAll可将同类型的Map集合中的数据相互倾倒
C1.putAll(C2);
}
}
三、遍历方式
1、键找值
先获取Map集合全部的键,再通过遍历键来找值
方法名称 | 说明 |
---|---|
public Set keySet() | 或取对应的所有键值 |
public V get(Object key) | 根据键获取对应的值 |
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class a {
public static void main(String[] args) {
Map<String,Double> map = new HashMap<>();
map.put("张三",162.5);
map.put("张三",169.8);
map.put("赵四",165.8);
map.put("王五",169.5);
System.out.println(map);
//1.获取Map集合的全部键
Set<String> keys = map.keySet();
System.out.println(keys);
//2.遍历全部的键,根据键获取对应值
for (String key : keys){
double value = map.get(key);
System.out.println(key + "===>" + value);
}
}
}
2、键值对
把“键值对”看成一个整体进行遍历
Map提供的方法 | 说明 |
---|---|
Set<Map.Entry<K,V>>entrtSet() | 获取所有“键值对”集合 |
Map.Entry提供的方法 | 说明 |
K getKey() | 获取键 |
V getValue | 获取值 |
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class a {
public static void main(String[] args) {
Map<String,Double> map = new HashMap<>();
map.put("张三",162.5);
map.put("张三",169.8);
map.put("赵四",165.8);
map.put("王五",169.5);
System.out.println(map);
//1、调用Map集合提供entrySet方法,把Map集合转换成键值对类型的Set集合
Set<Map.Entry<String,Double>> entries = map.entrySet();
for (Map.Entry<String,Double>entry : entries){
String key = entry.getKey();
double value = entry.getValue();
System.out.println(key + "--->"+ value);
}
}
}
3、lambda
方法名称 | 说明 |
---|---|
default void forEach(BiConsumer<? super K, ? super V> action) | 结合lambda便利Map几何 |
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
public class a {
public static void main(String[] args) {
Map<String,Double> map = new HashMap<>();
map.put("张三",162.5);
map.put("张三",169.8);
map.put("赵四",165.8);
map.put("王五",169.5);
System.out.println(map);
map.forEach(new BiConsumer<String, Double>() {
@Override
public void accept(String s, Double v) {
System.out.println(s +"----->" + v);
}
});
}
}
四、HashMap
1.HashMap的底层原理:跟HashSet的底层原理是一模一样的,都是基于哈希表实现的。
2.哈希表:
- JDK8之前,哈希表=数组+链表
- JDK8开始,哈希表+数组+链表+红黑树
- 哈希表是一种增删改查,性能都较好的数据结构
3.HashMap底层是基于哈希表实现的
- 哈希表是一种增删改查,性能都较好的数据结构
- 无序、不能重复、没有索引支持的
- HashMap的键依赖hashCode方法和equals方法,这样可以保证多个对象内容一样时,HashMap集合就能认为是重复的。
4.HashMap如何实现键的唯一性
```java
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Friend friend = (Friend) o;
return Double.compare(friend.height, height) == 0 && age == friend.age && Objects.equals(name, friend.name);
}
@Override
public int hashCode() {
return Objects.hash(name, height, age);
}
五、LinkedHashMap
原理:底层数据结构依然是基于哈希表实现的,只是每个键值对元素又额外的多了一个双链表机制记录元素顺序
六、TreeMap
1.原理:TreeMap跟TreeSet集合的底层原理是一样的,都是基于红黑树实现的排序。
2.TreeMap集合同样也支持两种方式来指定排序规则
- 让类实现Comparable接口,重写比较规则。
@Override
public int compareTo(Student o) {
return Double.compare(this.age, o.age);
}
- TreeMap集合有一个有参数构造器,支持创建Comparable比较器对象,以便用来指定比较规则。
@Override
public int compare(Student o1,Student o2) {
return Double.compare(o2.getheight(), o1.getheight());
}