从上图中可以发现,Map接口与Collection接口是不同的。
Map接口中的每个元素都使用"键值对"的形式存储在集合中。(key→value)
其接口定义如下:
public interface Map<K,V>
K泛型代表的是key,V泛型代表的是value。在使用Map时必须指定两个具体的类型。
Map常见的实现子类:HashMap,TreeMap
HashMap
HashMap是Map的子类,其类定义如下:
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
HashMap与HashSet相同,其内部结构也是散列表。是一种无序的集合。
Map接口的常用方法如下:
方法 | 类型 | 描述 |
---|---|---|
void clear() | 普通方法 | 清空集合 |
V put(K key, V value) | 普通方法 | 添加元素 |
V get(Object key) | 普通方法 | 根据Key获取value |
V remove(Object key) | 普通方法 | 根据Key删除value |
boolean containsKey(Object key) | 普通方法 | 判断是否存在某Key |
boolean containsValue(Object value) | 普通方法 | 判断是否存在某value |
Set<K> keySet() | 普通方法 | 所有Key返回成一个Set集合 |
Collection<V> values() | 普通方法 | 所有value返回成一个Collection集合 |
还有一个特殊的方法,
Set< Map.Entry<K, V> > entrySet() 普通方法 将一个Map对象转为Set集合
该方法会在文章最后一部分进行详解
V put(K key, V value) 和 V get(Object key)
添加元素 和 获取元素
栗子:
public static void main(String[] args) {
Map<String,Integer> map =new HashMap<>();
map.put("张三",18);
map.put("张三",19);//重复添加会覆盖上一次的value
map.put("盖伦",22);
map.put("灵狐者",26);
System.out.println(map.get("张三"));
}
程序运行结果:
19
V remove(Object key)
删除元素
栗子:
public static void main(String[] args) {
Map<String,Integer> map =new HashMap<>();
map.put("张三",18);
map.put("盖伦",22);
map.put("易大师",23);
System.out.println(map.get("盖伦"));
map.remove("盖伦");
map.remove("易大师",23);//remove(Object key, Object value) 重载
System.out.println(map.get("盖伦"));
System.out.println(map.get("易大师"));
}
程序运行结果:
22
null
null
boolean containsKey(Object key) 和 boolean containsValue(Object value)
判断key是否存在 和 判断value是否存在
栗子:
public static void main(String[] args) {
Map<String,Integer> map =new HashMap<>();
map.put("张三",18);
map.put("盖伦",22);
map.put("易大师",23);
System.out.println(map.containsValue(22));
System.out.println(map.containsValue(56));
System.out.println(map.containsKey("易大师"));
System.out.println(map.containsKey("沙砾"));
}
程序运行结果:
true
false
true
false
Set<K> keySet()
把所有Key返回成一个Set集合
栗子:
public static void main(String[] args) {
Map<Integer,String> map =new HashMap<>();
map.put(18,"藕片");
map.put(29,"竹笋");
map.put(31,"辣条");
map.put(27,"锅盖");
Set<Integer> set = map.keySet();//返回一个Set集合,Set的泛型要与Map中的Key泛型相同
Iterator<Integer> iterator = set.iterator();//获取到Set直接使用迭代器
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
程序运行结果:
18
27
29
31
Collection<V> values()
把所有value返回成一个Collection集合
栗子:
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(18, "藕片");
map.put(29, "竹笋");
map.put(31, "辣条");
map.put(27, "锅盖");
Collection<String> values = map.values();
Iterator<String> iterator = values.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
程序运行结果:
藕片
锅盖
竹笋
辣条
Set< Map.Entry<K, V> > entrySet()
Set< Map.Entry<K, V> > entrySet()
该方法是返回一个Set集合,在Set集合中 他的泛型被指定为Map.Entry
Entry是定义在Map接口中的内部接口,其定义如下:
interface Entry<K,V>
从之前的内容可以知道,在Map集合操作中,所有元素都是通过 "键值对" 的形式保存的。
那么对于Map集合来说,实际上是将 "键值对" 的数据保存在了Map.Entry接口的实例中,
然后再把Map.Entry的实例对象插入到Map集合中,如图:
栗子:
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(18, "藕片");
map.put(29, "竹笋");
map.put(31, "辣条");
map.put(27, "锅盖");
Set<Map.Entry<Integer, String>> set = map.entrySet();
Iterator<Map.Entry<Integer, String>> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
程序运行结果:
18=藕片
27=锅盖
29=竹笋
31=辣条
TreeMap
TreeMap是Map的子类。TreeMap主要特点是key有序,如果是自定义的类必须要实现Comparable接口并重写compareTo()方法。(比较器)
栗子:
public static void main(String[] args) {
Map<String, String> map = new TreeMap<>();
map.put("D", "藕片");
map.put("A", "竹笋");
map.put("C", "辣条");
map.put("Z", "锅盖");//无序添加 结果有序
Set<String> set = map.keySet();
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
程序运行结果:
A
C
D
Z
不关是HashMap还是TreeMap,只要使用自定义的类作为Key,必须重写equals() 和 hashCode()
标签:Map,Set,Java,拾贝,iterator,map,value,put,第十五天 From: https://www.cnblogs.com/Ocraft/p/17808486.html