1.Map是一种依照键(key)存储元素的容器,键(key)很像下标,在List中下标是整数。在Map中键(key)可以使任意类型的对象。Map中不能有重复的键(Key),每个键(key)都有一个对应的值(value)。Map中的元素是两个对象,一个对象作为键,一个对象作为值。键不可以重复,但是值可以重复。
>保证键的唯一性->Set,值可以重复->Collection
2.Map下的接口:
>Hsahtable:底层是哈希表数据结构,是线性同步,不允许存储null键和值。
>HashMap:底层是哈希表数据结构,线性不同步,允许储存null键和值。
>LinkedHashMap:该子类基于哈希表又融入了链表。可以Map集合进行增删提高效率。
>TreeMap:底层是二叉树结构,线性不同步,可以对map集合中的键进行指定顺序排序。
补充:HashSet,TreeSet的底层是用HashMap,TreeMap实现的,只操作键,就是Set集合
3.Map和Collection的不同:
>Collection一次存一个元素,Map一次存一对元素。
>Map存储元素使用put方法,Collection使用add方法
>Collection是单列集合, Map 是双列集合。
>Map 一次存入一对元素,是以键值对的形式存在.键与值存在映射关系.一定要保证键的唯一性.
4.Map集合的方法:
>v put(key,value):当存储的键相同时,新的键会替换老的键,并将老键返回。如果键没有重复,返回null。
>putAll(Map<? extends K,? extends V> m) 从指定映射中将所有映射关系复制到此映射中。
>remove() 删除关联对象,指定key对象
>clear() 清空集合对象
>value get(key); 可以用于判断键是否存在的情况。当指定的键不存在的时候,返回的是null。
>boolean isEmpty() 长度为0返回true否则false
>boolean containsKey(Object key) 判断集合中是否包含指定的key
>boolean containsValue(Object value) 判断集合中是否包含指定的value
>int size():返回长度。
例:
import java.util.HashMap;
import java.util.Map;
public class TestHashMap {
public static void main(String[] args) {
Map<Integer,String> map=new HashMap<Integer,String> ();
map.put(1, "dog"); //put写入元素
map.put(2, "cat");
map.put(3, "munt");
map.put(4, "hash");
System.out.println("获取第二个键的值"+map.get(2)); //指定键获得对应的值
System.out.println("是否包含第二个键:"+map.containsKey(3)); //判断是否包含key
System.out.println("是否包含dog这个值:"+map.containsValue("dog")); //是否包含指定值
System.out.println("map的长度为:"+map.size()); //返回长度
System.out.println("移除第二个键并返回这个键对应的值:"+map.remove(2)); //删除指定键,长度改变
map.clear(); //清空map
System.out.println("清空后的集合:"+map);
}
}
运行结果:
获取第二个键的值cat
是否包含第二个键:true
是否包含dog这个值:true
map的长度为:4
移除第二个键并返回这个键对应的值:cat
清空后的集合:{}
5.如何获取Map中元素:
原理:Map中没有迭代器的,Collection具备迭代器,只要将map转成Set集合,就可以使用迭代器。之所以转成Set,是因为Map集合具有的键的唯一性,Set就是来自于Map,Set的底层就是Map方法。
有两种方法:
>Set keySet();将map集合的键都取出来放到Set集合中。对Set集合进行迭代。迭代完成再通过get方法对获取的键进行值的获取。
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class TestKeyset {
public static void main(String[] args) {
Map<String,String> map=new HashMap<String,String> ();
map.put("a", "dog"); //put写入元素
map.put("b", "cat");
map.put("c", "munt");
map.put("d", "hash");
Set<String> k=map.keySet();
Iterator<String> i=k.iterator();
while(i.hasNext()) {
String key=i.next();
String value=map.get(key);
System.out.println(key+":"+value);
}
}
}
运行结果:
a:dog
b:cat
c:munt
d:hash
>Set entrySet();取的是键和值的映射关系。Map.Entry:其实就是一个Map中的内部接口。
为什么定义在map的内部?entry是键值关系的入口,是map的入口,访问的map中的键值对。
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class TestentrySet {
public static void main(String[] args) {
Map<String,String> map=new HashMap<String,String> ();
map.put("a", "dog"); //put写入元素
map.put("b", "cat");
map.put("c", "munt");
map.put("d", "hash");
Set<Entry<String, String>> k=map.entrySet();
Iterator<Entry<String, String>> i=k.iterator();
while(i.hasNext()) {
Entry<String, String> key=i.next();
System.out.println(key.getKey()+":"+key.getValue());
}
}
}
运行结果:
a:dog
b:cat
c:munt
d:hash