一、集合特点和常用方法
1.特点
一次添加一对元素,因此也称作双列集合。(相较下,Set称为单列集合)
要保证键的唯一性。
2.功能
2.1.添加
value put(key,value);//返回前一个和key关联的值,如果没有返回null。
2.2.删除
void clear();//清空map集合。
value remove(key);//根据指定的key翻出这个键值对。
2.3.判断
boolean containsKey(key):
boolean containsValue(value):
boolean isEmpty();
2.4.获取
value get(key);//通过键获取值,如果没有该键返回null。
//注:当然可以通过返回null,来判断是否包含指定键。
int size(); //获取键值对的个数。
使用的小例子,里面大注释的代码也可以用来试一下:
public class MapDemo {
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<Integer,String>();
method_2(map);
}
public static void method_2(Map<Integer,String> map){
map.put(8,"zhaoliu");
map.put(2,"zhaoliu");
map.put(7,"xiaoqiang");
map.put(6,"wangcai");
Collection<String> values = map.values();
Iterator<String> it2 = values.iterator();
while(it2.hasNext()){
System.out.println(it2.next());
}
/*
* 通过Map转成set就可以迭代。
* 找到了另一个方法。entrySet。
* 该方法将键和值的映射关系作为对象存储到了Set集合中,而这个映射关系的类型就是Map.Entry类型(结婚证)
*
*
*/
Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
Iterator<Map.Entry<Integer, String>> it = entrySet.iterator();
while(it.hasNext()){
Map.Entry<Integer, String> me = it.next();
Integer key = me.getKey();
String value = me.getValue();
System.out.println(key+"::::"+value);
}
//取出map中的所有元素。
//原理,通过keySet方法获取map中所有的键所在的Set集合,在通过Set的迭代器获取到每一个键,
//在对每一个键通过map集合的get方法获取其对应的值即可。
/*
Set<Integer> keySet = map.keySet();
Iterator<Integer> it = keySet.iterator();
while(it.hasNext()){
Integer key = it.next();
String value = map.get(key);
System.out.println(key+":"+value);
}
*/
}
public static void method(Map<Integer,String> map){//学号和姓名
// 添加元素。
System.out.println(map.put(8, "wangcai"));//null
System.out.println(map.put(8, "xiaoqiang"));//wangcai 存相同键,值会覆盖。
map.put(2,"zhangsan");
map.put(7,"zhaoliu");
//删除。
// System.out.println("remove:"+map.remove(2));
//判断。
// System.out.println("containskey:"+map.containsKey(7));
//获取。
System.out.println("get:"+map.get(6));
System.out.println(map);
Outer.Inner.show();
}
}
接着说方法:
2.5.利用keySet遍历
//取出map中的所有元素。
//原理,通过keySet方法获取map中所有的键所在的Set集合,再通过Set的迭代器获取到每一个键,
//再对每一个键通过map集合的get方法获取其对应的值即可。
Set<Integer> keySet = map.keySet();//获取键的集合
Iterator<Integer> it = keySet.iterator();//获取集合迭代器
//遍历
while(it.hasNext()){
Integer key = it.next();
String value = map.get(key);
System.out.println(key+":"+value);
}
2.6.利用entrySet遍历
//该方法将键和值的映射关系作为对象存储到了Set集合中,而这个映射关系的类型就是Map.Entry类型(结婚证)
Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
Iterator<Map.Entry<Integer, String>> it = entrySet.iterator();
while(it.hasNext()){
Map.Entry<Integer, String> me = it.next();
Integer key = me.getKey();
String value = me.getValue();
System.out.println(key+"::::"+value);
}
2.7.values来遍历值
Collection<String> values = map.values();
Iterator<String> it2 = values.iterator();
while(it2.hasNext()){
System.out.println(it2.next());
}
2.8.用forEach(BiConsumer<? super K,? super V> action)来遍历(2019-1-12 00:11:45更新)
这应该是最简单高效的一个方法:
map.forEach((k, v)->{
System.out.println(v);
});
二、Map常见子类
1.Hashtable
内部结构是哈希表,是同步的。不允许null作为键,null作为值。
他有个小弟叫做Properties,用来存储键值对型的配置文件的信息。可以和IO技术相结合发挥最大作用。
2.HashMap
内部结构是哈希表,不是同步的。允许null作为键,null作为值。
3.TreeMap
内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序。
使用小例子:
public static void main(String[] args) {
/*
* 将学生对象和学生的归属地通过键与值存储到map集合中。
*
*/
HashMap<Student,String> hm = new HashMap<Student,String>();//student是个外部类
hm.put(new Student("lisi",38),"北京");
hm.put(new Student("zhaoliu",24),"上海");
hm.put(new Student("xiaoqiang",31),"沈阳");
hm.put(new Student("wangcai",28),"大连");
hm.put(new Student("zhaoliu",24),"铁岭");//student判断相同需要覆写hashCode和equals方法
// Set<Student> keySet = hm.keySet();
// Iterator<Student> it = keySet.iterator();
Iterator<Student> it = hm.keySet().iterator();
while(it.hasNext()){
Student key = it.next();
String value = hm.get(key);
System.out.println(key.getName()+":"+key.getAge()+"---"+value);
}
}