Java笔记 - Map集合

时间:2022-03-02 12:22:59

Map集合使用键值对来存储数据,将键映射到值对象,一个映射不能包含重复的键,每一个键最多只能映射到一个值。Map也被称为双列集合,对应的Collection集合是单列集合。

  • Map集合的常用方法:

Map< K, V>
1. 添加
V put(K key,V value):返回前一个和key关联的值,如果没有返回null。如果此映射以前包含一个该键的映射关系,则用指定值替换旧值
2. 删除
void clear():清空Map集合
V remove(Object key):根据指定的key移除这个键值对,如果不存在key,返回null。
3. 判断
boolean containsKey(Object key):是否包含key
boolean containsValue(Object value):是否包含value
boolean isEmpty():Map集合是否为空,为空则返回true。
4. 获取
V get(Object key):返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
int size():获取键值对的个数
Collection< V> values():返回此映射中包含的值的 Collection 视图。就是说返回一个包含Map集合中的值的Collection集合。

    public static void main(String[] args){
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(5,"zhangsan");
map.put(3,"wangwu");
map.put(2,"zhangsan");
map.put(6,"zhaoliu");

Collection<String> values = map.values();

Iterator<String> it2 = values.iterator();
while(it2.hasNext()){
System.out.println(it2.next());
}
}

输出结果:
zhangsan
wangwu
zhangsan
zhaoliu

  • Map集合取出元素的方法:

1. keySet
Collection集合中有迭代器,可以使用迭代器来取出Collection集合中的元素,但是Map集合中没有迭代器。通过keySet方法获取Map集合中所有的键所在的Set集合,再通过Set的迭代器获取到每一个键对应的值。

public static void main(String[] args){
Map<Integer, String> map = new HashMap<Integer, String>();
keySet(map);
}

public static void keySet(Map<Integer, String> map){
map.put(5,"zhangsan");
map.put(3,"wangwu");
map.put(2,"zhangsan");
map.put(6,"zhaoliu");

Set<Integer> ks = map.keySet();
Iterator<Integer> it = ks.iterator();
while(it.hasNext()){
Integer key = it.next();
String value = map.get(key);
System.out.println(key+"...."+value);
}
}

输出结果:
2….zhangsan
3….wangwu
5….zhangsan
6….zhaoliu

2. entrySet
通过Map集合中的方法Set< Map.Entry< K,V>> entrySet()返回此映射中包含的映射关系的 Set 视图。该方法将Map集合中键与值的映射关系作为对象存储到Set集合中,Set集合中元素的类型就是Map.Entry类型的。
Map.Entry< K,V>是一个接口,表示映射项(键-值对)。接口中包含两个方法getKey()和getValue()分别返回对应的键和值。

public static void main(String[] args){
Map<Integer, String> map = new HashMap<Integer, String>();
entrySet(map);
}

public static void entrySet(Map<Integer, String> map){
map.put(5,"zhangsan");
map.put(3,"wangwu");
map.put(2,"zhangsan");
map.put(6,"zhaoliu");

Set<Map.Entry<Integer, String>> entrySet =map.entrySet();
Iterator<Map.Entry<Integer, String>> it = entrySet.iterator();
while (it.hasNext()) {
Map.Entry<Integer, String> en = it.next();
Integer key = en.getKey();
String value = en.getValue();
System.out.println(key+".........."+value);
}
}

输出结果:
2……….zhangsan
3……….wangwu
5……….zhangsan
6……….zhaoliu

  • Map集合常用子类

1. HashTable
HashTable的内部结构是哈希表,是同步的。HashTable不允许null作为键,也不允许null作为值。
HashTable在JDK1.0就已经出现了,当时还没有集合框架,没有Map集合。所以在当时单列集合就是Vector,双列集合就是HashTabel。
HashTable有一个十分重要的子类就是Properties类。它用来存储键值对型的配置文件信息。

2. HashMap

关于HashMap详解参见:http://alex09.iteye.com/blog/539545
下面直接举例说明:

public static void main(String[] args){
HashMap<Student,String> hm = new HashMap<Student,String>();
hm.put(new Student("lisi",23),"北京");
hm.put(new Student("zhaoliu",24),"上海");
hm.put(new Student("xiaoqiang",31),"沈阳");
hm.put(new Student("wangcai",28),"大连");
hm.put(new Student("zhaoliu",24),"铁岭");

Set<Map.Entry<Student,String>> entrySet = hm.entrySet();
Iterator<Map.Entry<Student,String>> it = entrySet.iterator();
while(it.hasNext()){
Map.Entry<Student,String> en = it.next();
Student key = en.getKey();
String value = en.getValue();
System.out.println(key.getName()+":"+key.getAge()+"---"+value);
}
}

public class Person {

private String name;
private int age;
//此处省略构造函数,get、set方法,hashCode方法,equals方法,toString方法
}

public class Student extends Person{
public Student() {
super();
}
public Student(String name, int age) {
super(name, age);
}
public String toString() {
return "Student:"+getName()+":"+getAge();
}
}

输出结果:
wangcai:28—大连
lisi:38—北京
zhaoliu:24—铁岭
xiaoqiang:31—沈阳
zhaoliu:24—上海

3. TreeMap
原理参见:http://blog.csdn.net/chenssy/article/details/26668941
举例说明:

public static void main(String[] args) {
TreeMap<Student,String> tm = new TreeMap<Student,String>(new ComparatorByName());

tm.put(new Student("lisi",38),"北京");
tm.put(new Student("zhaoliu",24),"上海");
tm.put(new Student("xiaoqiang",31),"沈阳");
tm.put(new Student("wangcai",28),"大连");
tm.put(new Student("zhaoliu",24),"铁岭");

Iterator<Map.Entry<Student, String>> it = tm.entrySet().iterator();
while(it.hasNext()){
Map.Entry<Student,String> me = it.next();
Student key = me.getKey();
String value = me.getValue();
System.out.println(key.getName()+":"+key.getAge()+"---"+value);
}
}

输出结果:
lisi:38—北京
wangcai:28—大连
xiaoqiang:31—沈阳
zhaoliu:24—铁岭

4. LinkedHashMap
LinkedHashMap由哈希表和链接列表实现,是有序的。