继上文的【Java集合】逻辑结构超强、表达十分清晰的“Collection接口”及“List接口、Set接口”解析,本文还将介绍Java集合中的另一种类型:Map类型。
这里是引用
从Collection接口出发理解Map接口:
我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图。
Map容器的特点:
添加:
V put(K key, V value)
// 如果之前没有存在该键,那么返回的是null,如果之前就已经存在该键了,那么就返回该键之前对应的值。void putAll(Map extends K,? extends V> m)
//把参数的Map数据全部添加到调用此方法的Map中;删除
V remove(Object key)
//根据键删除一条map中的数据,返回的是该键对应的值。void clear()
//无返回值,删除全部。获取:
V get(Object key)
//根据指定的键获取对应的值int size()
//获取map集合键值对个数判断:
boolean containsKey(Object key)
//判断map集合是否包含指定的键:Boolean containsValue(Object value)
//判断map集合中是否包含指定的值Boolean isEmpty()
//判断是都为空;**获取键值对:**key只能以set来保存,因为key是不可以重复的;value用collection来保存;
//获取键值对
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Main {
public static void main(String[] args) {
//创建Map对象
Map<String,String> map = new HashMap<String,String>();
//添加映射关系
map.put("ITCAST001", "张三");
map.put("ITCAST002", "李四");
map.put("ITCAST005", "李四");
//Set keySet() : 以Set的形式获返回所有的key
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println(key);
}
System.out.println("-----------");
//Collection values() :以Collection形式返回所有Value
Collection<String> values = map.values();
for (String value : values) {
System.out.println(value);
}
}
}
迭代:
//遍历实例
public class Main {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("aa","AAA");
map.put("bb","BBB");
map.put("cc","CCC");
Set<String> keySet = map.keySet();
Iterator<String> it = keySet.iterator(); //因为Set是Collection,所以可以获取迭代器
while(it.hasNext()) {
String key = it.next();
System.out.println("Key:"+key+" Value:"+map.get(key));
}
for(String key:keySet) { //增强for
System.out.println("Key:"+key+" Value:"+map.get(key));
}
//values方法
Collection<String> values = map.values();
for(String ele:values) {
System.out.println("Value:"+ele);
}
//将Map转换成Set
Set<Map.Entry<String,String>> set = map.entrySet(); //Entry是一个内部类
for(Map.Entry<String,String> ele:set) {
System.out.println("Key:"+ele.getKey() +" Value:"+ele.getValue());
}
map.forEach((k,v) -> System.out.println("Key:"+k+" Value:"+v));
}
}
HashMap容器内的所有元素对的
键(KEY)
都是唯一不可重复
的。
**存储原理:**根据键的hashCode 值存储于哈希表中。
HashMap中的Key如何保证不重复?
保证键唯一不可重复的原理:
//第一个HashMap实例
public class Main {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("aa","AAA");
map.put("bb","BBB");
map.put("cc","CCC");
map.put("bb","BbbbB"); //如果出现了相同键,则覆盖。
for(String key:map.keySet()) { //增强for
System.out.println("Key:"+key+" Value:"+map.get(key));
}
//Key:aa Value:AAA
//Key:bb Value:BbbbB
//Key:cc Value:CCC
}
}
注:LinkedHashMap类保证迭代的顺序。保存了记录的插入顺序,在用Iterator 遍历LinkedHashMap
时,先得到的记录肯定是先插入的
TreeMap容器内的所有元素对的
键(KEY)
都是有序
的。
TreeMap特性:
Key的排序规则(与TreeSet一样):
Key为自定义类的自动排序规则(与TreeSet一样):
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
TreeMap<Character, Integer> tree = new TreeMap<Character, Integer>();
tree.put('c',10);
tree.put('b',2);
tree.put('a',5);
tree.put('h',12);
System.out.println(tree); //键的会自动根据字典顺序,排好序输出
}
}
//输出:{a=5, b=2, c=10, h=12}
实现Comparable接口、定义CompareTo方法:
import java.util.Comparator;
import java.util.TreeMap;
class Emp implements Comparable<Emp>{
String name;
int salary;
public Emp(String name, int salary) {
super();
this.name = name;
this.salary = salary;
}
@Override
public String toString() {
return "[姓名:"+this.name+" 薪水:"+ this.salary+"]";
}
@Override
public int compareTo(Emp o) {
return this.salary - o.salary;
}
}
public class Demo6 {
public static void main(String[] args) {
TreeMap<Emp, String> tree = new TreeMap<Emp, String>(comparator);
tree.put(new Emp("冰冰", 2000),"001");
tree.put(new Emp("家宝", 1000),"002");
tree.put(new Emp("习总", 3000),"003");
tree.put(new Emp("克强", 5000),"005");
System.out.println(tree);
}
}
创建TreeMap对象时传入比较器:
class Emp {
String name;
int salary;
public Emp(String name, int salary) {
super();
this.name = name;
this.salary = salary;
}
@Override
public String toString() {
return "[姓名:"+this.name+" 薪水:"+ this.salary+"]";
}
}
//自定义一个比较器
class MyComparator implements Comparator<Emp>{
@Override
public int compare(Emp o1, Emp o2) {
return o1.salary - o2.salary;
}
}
public class Demo6 {
public static void main(String[] args) {
//创建一个自定义比较器
MyComparator comparator = new MyComparator();
TreeMap<Emp, String> tree = new TreeMap<Emp, String>(comparator);
tree.put(new Emp("冰冰", 2000),"001");
tree.put(new Emp("家宝", 1000),"002");
tree.put(new Emp("习总", 3000),"003");
tree.put(new Emp("克强", 5000),"005");
tree.put(new Emp("财厚", 5000),"008");
System.out.println(tree);
}
}