- Map 接口属于抽象类
- Map 下面有两个实现类,HashMap 和 TreeMap
一、Map 接口
1、概述
- 将键映射到值的对象
- 一个映射不能包含重复的键
- 每个键最多只能映射到一个值
2、Map 集合和 Collection 集合的区别
- Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。可以把这个理解为:夫妻对
- Collection集合存储元素是单独出现的,Collection的儿子Set是唯一的,List是可重复的。可以把这个理解为:光棍(11.11)
- Map集合的数据结构值针对键有效,跟值无关
- Collection集合的数据结构是针对元素有效
package map01;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo {
public static void main(String[] args) {
Map<String, String> m = new HashMap<>();
m.put("001", "刘德华");
m.put("001", "张学友");
m.put("002", "刘亦菲");
m.put("003", "林志玲");
m.put("004", "林志玲");
m.put("001", "刘德华");//完全重复
//增强for循环
for (Map.Entry<String, String> en : m.entrySet()) {
System.out.println("键名:" + en.getKey() + "----键值:" + en.getValue());
}
System.out.println("------------------------------");
//通过 KeySet 循环
Set<String> keys = m.keySet();
for (String k : keys) {
System.out.println("键名:" + k + "----键值:" + m.get(k));
}
System.out.println("+++++++++++++++++++++++++++++++");
System.out.println(m.containsKey("005"));
System.out.println(m.containsKey("002"));
System.out.println(m.containsValue("刘德华"));
System.out.println(m.containsValue("张学友"));
}
}
运行显示:
3、Map 接口的成员方法
V put(K key,V value)
V remove(Object key)
void clear()
boolean containsKey(Object key)
boolean containsValue(Object value)
boolean isEmpty()
int size()
V get(Object key)
Set<K> keySet()
Collection<V> values()
Set<Map.Entry<K,V>> entrySet()
4、Map 集合遍历(根据键找值)
- 获取所有键的集合
- 遍历键的集合,获取到每一个键
- 根据键找值
5、Map 集合遍历(根据键值对对象找键和值)
- 获取所有键值对对象的集合
- 遍历键值对对象的集合,获取到每一个键值对对象
- 根据键值对对象找键和值
6、Map集合的特点
- 可以存储键值对的元素
二、HashMap 实现类
1、概述
- 键是哈希表结构,可以保证键的唯一性
2、HashMap 案例
HashMap<String,String>
HashMap<Integer,String>
HashMap<String,Student>
HashMap<Student,String>
3、案例
package map02;
public class Student {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
package map02;
import java.util.HashMap;
import java.util.Set;
public class HashMapDemo {
public static void main(String[] args) {
// 创建集合对象
HashMap<Student, String> hm = new HashMap<Student, String>();
// 创建学生对象
Student s1 = new Student("貂蝉", 27);
Student s2 = new Student("王昭君", 30);
Student s3 = new Student("西施", 33);
Student s4 = new Student("杨玉环", 35);
Student s5 = new Student("貂蝉", 27);
// 添加元素
hm.put(s1, "8888");
hm.put(s2, "6666");
hm.put(s3, "5555");
hm.put(s4, "7777");
hm.put(s5, "9999");
// 遍历
Set<Student> set = hm.keySet();
for (Student key : set) {
String value = hm.get(key);
System.out.println(key.getName() + "---" + key.getAge() + "---" + value);
}
}
}
三、LinkedHashMap 实现类
1、概述
- Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序
- 由哈希表保证键的唯一性
- 由链表保证键盘的有序(存储和取出的顺序一致)
package map03;
import java.util.LinkedHashMap;
import java.util.Set;
public class LinkedHashMapDemo {
public static void main(String[] args) {
LinkedHashMap<String, String> lh = new LinkedHashMap<>();
lh.put("aaa", "java");
lh.put("bbb", "python");
lh.put("ccc", "PHP");
lh.put("ddd", "CSS");
lh.put("eee", "HTML");
lh.put("fff", "javascript");
lh.put("111", "android");
lh.put("222", "android");
lh.put("222", "android");
//遍历
Set<String> s = lh.keySet();
for (String key : s) {
String value = lh.get(key);
System.out.println("键名:" + key + "---键值:" + value);
}
}
}
运行显示:
四、TreeMap 实现类
1、概述
- 键是红黑树结构,可以保证键的排序和唯一性
- 由链表保证键盘的有序(存储和取出的顺序一致)
package map04;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapDemo {
public static void main(String[] args) {
TreeMap<String, String> tm = new TreeMap<>();
tm.put("aaa", "java");
tm.put("bbb", "python");
tm.put("ccc", "PHP");
tm.put("ddd", "CSS");
tm.put("eee", "HTML");
tm.put("fff", "javascript");
tm.put("111", "android");
tm.put("222", "android");
tm.put("222", "android");
//遍历
Set<String> s = tm.keySet();
for (String key : s) {
String value = tm.get(key);
System.out.println("键名:" + key + "---键值:" + value);
}
}
}
运行结果显示:
2、TreeMap 案例
TreeMap<String,String>
TreeMap<Student,String>
3、案例
package map05;
public class Student {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package map05;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapDemo {
public static void main(String[] args) {
TreeMap<Student, String> tm = new TreeMap<Student, String>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
int num1 = s1.getAge() - s2.getAge();
int num2 = num1 == 0 ? s1.getName().compareTo(s2.getName()) : num1;
return num2;
}
});
Student s1 = new Student("潘安", 18);
Student s2 = new Student("姜子牙", 19);
Student s3 = new Student("宋江", 22);
Student s4 = new Student("李世民", 20);
Student s5 = new Student("刘备", 21);
Student s6 = new Student("刘亦菲", 22);
tm.put(s1, "宋朝");
tm.put(s2, "商朝");
tm.put(s3, "宋朝");
tm.put(s4, "唐朝");
tm.put(s5, "三国");
tm.put(s6, "现代");
// 遍历
Set<Student> set = tm.keySet();
for (Student key : set) {
String value = tm.get(key);
System.out.println(key.getName() + "---" + key.getAge() + "---" + value);
}
}
}
五、Hashtable 实现类
1、Hashtable 和 HashMap 的区别
- Hashtable:线程安全,效率低。不允许null键和null值
- HashMap:线程不安全,效率高。允许null键和null值
2、List,Set,Map等接口是否都继承子Map接口
- List,Set继承自Collection接口
- Map接口本身就是一个顶层接口
3、案例
package map06;
import java.util.Hashtable;
public class HashtableDemo {
public static void main(String[] args) {
Hashtable<String, String> ht = new Hashtable<>();
ht.put("0001", "Lemon");
System.out.println(ht);
}
}