【1】Map集合的概述和特点
Map将键映射到值的对象。一个映射不能包含重复的键,每个键最多只能映射到一个值。Map接口提供三种collection视图,允许以键集,值集,或者键-值映射关系集的形式查看某个映射内容,映射顺序定义为迭代器在映射实现可明确保证其顺序,如TreeMap类,另一些映射实现则不保证顺序如:HashMap
【2】Map与Collection接口的不同:
A:Map是双列的,Collection是单列的
B:Map的键是唯一的,Collection的子体系Set是唯一的
C:Map集合的数据结构针对键有效,跟值无关。Collection集合的数据结构是针对元素有效
【3】Map功能概述:
A:添加功能:V put(K key,V value):添加元素。其实这个方法还有另一个功能,替换功能:如果键是第一次存储,就直接存储元素,返回null,如果键不是第一次存在,就用值把之前的值替换掉,返回之前的值
B:删除功能:void clear():移除所有的键值对元素
V remove(Object key):根据键删除键值对应的元素,并把其键对应的值返回
C:判断功能: boolean containsKey(Object key):判断是否存在指定的键
boolean containsValue(Object value):判断集合中是否包含指定的值
boolean isEmpty():判断集合是否为空
D:获取功能:Set<Map.Entry<K,V>> entrySet():返回一个键值对的Set集合
V get(Object key):根据键获取值
Set<K> keySet():获取集合中所有键的集合
Collection<V> values():获取集合中所有值的集合
E:长度功能:int size():返回集合中键值对的对数
【4】Map集合的基本功能测试
一个简单的String,String类型键值对的Map方法的使用
Map集合的两种遍历方式:
A:通过生成键值对对象,遍历集合:Set<Map.Entry<String,String>>
B:通过生成键集,遍历键找出对应的值:Set<String>
package HashMapDemo;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class HashMapDemo {
public static void main(String[] args) {
HashMap<String,String> hashMap=new HashMap<>();
hashMap.put("33","333");
hashMap.put("44","444");
hashMap.put("22","222");
Set<Map.Entry<String,String>> entries=hashMap.entrySet();//获取键值对对象
//遍历 方式1:生成键值对集合,遍历键值对集合 Map.Entry<String,String>
for (Map.Entry<String, String> entry : entries) {
String key=entry.getKey();
String value=entry.getValue();
System.out.println(key+"==="+value);
}
System.out.println("---------------------------------------");
//遍历 方式2:获取键的集合,通过键找值的方式遍历
Set<String> key=hashMap.keySet();//键集合
for (String s : key) {
String s1=hashMap.get(s);
System.out.println(s+"==="+s1);
}
}
}
【5】HashMap上个例子就用的HashMap,它的键值都是String类型
我们再来举个键是Student值是String类型的例子:
package HashMapDemo;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HashMapDemo2 {
public static void main(String[] args) {
HashMap<Student,String> hashMap=new HashMap<Student, String>();
hashMap.put(new Student("钟楚红", 23),"s001");
hashMap.put(new Student("钟楚红", 23), "s001");
hashMap.put(new Student("梅艳芳", 27),"s002");
hashMap.put(new Student("李丽珍", 26),"s003");
hashMap.put(new Student("翁虹", 27),"s004");
hashMap.put(new Student("翁虹", 27), "s004");
hashMap.put(new Student("叶子楣", 29),"s005");
hashMap.put(new Student("叶子楣222", 29),"s005");
//通过从键集获取值的方式遍历
for (Student student : hashMap.keySet()) {
String string=hashMap.get(student);
System.out.println(student.getName()+"=="+student.getAge()+"=="+string);
}
//通过获取键值对集合的迭代器的方式遍历
Iterator map=hashMap.entrySet().iterator();
while (map.hasNext()){
Map.Entry<Student,String> entry=(Map.Entry<Student,String>)map.next();
System.out.println(entry.getKey().getName()+"=="+entry.getKey().getAge()+"=="+entry.getValue());
}
}
}
再来一个键是String值是Student的例子:
package HashMapDemo;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HashMapDemo3 {
public static void main(String[] args) {
HashMap<String,Student> hashMap=new HashMap<String, Student>();
hashMap.put("s001",new Student("钟楚红", 23));
hashMap.put("s001",new Student("钟楚红", 23));
hashMap.put("s002",new Student("梅艳芳", 27));
hashMap.put("s003",new Student("李丽珍", 26));
hashMap.put("s004",new Student("翁虹", 27));
hashMap.put("s004",new Student("翁虹", 27));
hashMap.put("s005",new Student("叶子楣", 29));
hashMap.put("s005",new Student("叶子楣222", 29));
//通过从键集获取值的方式遍历
for (String string : hashMap.keySet()) {
Student student=hashMap.get(string);
System.out.println(string+student.getName()+"=="+student.getAge()+"==");
}
//通过获取键值对集合的迭代器的方式遍历
Iterator map=hashMap.entrySet().iterator();
while (map.hasNext()){
Map.Entry<String,Student> entry=(Map.Entry<String,Student>)map.next();
System.out.println(entry.getKey()+"=="+entry.getValue().getAge()+"=="+entry.getValue().getName());
}
}
}
【6】LinkedHashMap的概述和使用
A:LinkedHashMap:Map接口的哈希表和链接列表实现,具有可预知的迭代顺序
B:LinkedHashMap的特点:底层数据结构是链表和哈希表,元素有序且唯一,元素的有序性由链表数据结构保证,唯一性由哈希表数据结构保证;Map集合的数据结构只与键有关
【7】TreeMap集合键
A:键的数据结构是红黑树,可保证键的排序和唯一性,排序分为自然排序和比较器排序
B:线程是不安全的效率比较高
再次举一个TreeMap集合键是Student 值是String的实例
package TreeMapDemo;
import HashSetDemo.Student;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapDemo2 {
public static void main(String[] args) {
TreeMap<Student,String> treeMap=new TreeMap<>();
treeMap.put(new Student("钟楚红", 23),"s001");
treeMap.put(new Student("钟楚红", 23), "s001");
treeMap.put(new Student("梅艳芳", 27),"s002");
treeMap.put(new Student("李丽珍", 26),"s003");
treeMap.put(new Student("翁虹", 27),"s004");
treeMap.put(new Student("翁虹", 27), "s004");
treeMap.put(new Student("叶子楣", 29),"s005");
treeMap.put(new Student("叶子楣222", 29),"s005");
for (Student integer :treeMap.keySet()) {
System.out.println(integer.getName()+integer.getAge()+"=="+treeMap.get(integer));
}
Set<Map.Entry<Student,String>> entries=treeMap.entrySet();
for (Map.Entry<Student,String> entry: entries
) {
Student key=entry.getKey();
System.out.println(key.getName()+"==="+key.getAge()+"====="+entry.getValue());
}
}
}
实现Comparable接口
@Override
public int compareTo(Student s) {
//System.out.println(this+"==="+s);
//需求:按照年龄大小来排序学生
//年龄一样了,不能说明是同一个对象,我们还得比较姓名是否一样
int flag=0;
int num=this.age-s.getAge();
int num2=num==0?this.name.compareTo(s.name):num;
return -num2;
}