1.定义
Collection接口是保存单值的最大父接口,Map接口则是保存一对值.所有的内容是以key--->value的形式保存的.Map接口常用的子类有三个.
- HashMap
- HashTable
- TreeMap
2.新的子类HashMap
示例1:
package com.ares.mapdemo;
import java.util.HashMap;
import java.util.Map;
public class HashMapDemo01 {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("zhangsan", 1);
map.put("zhangsan", 2);
map.put("lisi", 3);
map.put("wangwu", 5);
System.out.println(map) ;
}
}
输出结果: {zhangsan=2,lisi=3,wangwu=5}
注:HashMap中key不允许有重复的值,所以当属性重复时会被覆盖.其最大的特点是用于内容的查找,查找成功则返回内容,否则返回空.
查找操作: Integer value = map.get("zhangsan") ;
示例2:将Map中的key全部以Set的集合的形式返回.
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("zhangsan", 1);
map.put("zhangsan", 2);
map.put("lisi", 3);
map.put("wangwu", 5);
Set<String> set = map.keySet(); // 返回全部的key
Iterator<String> iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
注:注意的是重复的key内容仍然不会显示,会被过滤掉.HashMap中key也是散列的.
示例3:将Map中的value以Collection集合形式返回.
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("zhangsan", 1);
map.put("zhangsan", 2);
map.put("lisi", 3);
map.put("wangwu", 5);
Collection<Integer> col = map.values();// 取得全部value
Iterator<Integer> iter = col.iterator();
while (iter.hasNext()) {
Integer value = iter.next();
System.out.println(value);
}
3.旧的子类HashTable
HashTable与Vector的产生时代是一样的,也属于最早的集合操作类,之后扩展了其应用实现了Map接口.
使用上与HashMap相像.
示例:
Map<String, Integer> map = new Hashtable<String, Integer>();
map.put("zhangsan", 1);
map.put("zhangsan", 2);
map.put("lisi", 3);
map.put("wangwu", 5);
System.out.println(map);
HashMap与HashTable的区别:
二者都是Map接口的子类.HashMap采用的是异步的处理操作,而HashTable是同步,所以HashMap性能较高,HashTable是线程安全的.
4.TreeMap类
TreeMap是按key排序的输出.
Map<String, Integer> map = new TreeMap<String, Integer>();
map.put("A、zhangsan", 1);
map.put("A、zhangsan", 2);
map.put("C、lisi", 3);
map.put("B、wangwu", 5);
Set<String> set = map.keySet(); // 返回全部的key
Iterator<String> iter = set.iterator();
while (iter.hasNext()) {
String key = iter.next();
System.out.println(key + " --> " + map.get(key));
}
输出是根据key排序后的结果,分别是A,B,C.如果是给定的任意的类要直接排序则需要实现Comparable接口.
5.注意事项
5.1 Map不能直接使用Iterator输出
要想输出需要借助Set,标准操作格式如下
示例:
package com.ares.iteartordemo;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class IteartorMapDemo {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("zhangsan", 1);
map.put("zhangsan", 2);
map.put("lisi", 3);
map.put("wangwu", 5);
Set<Map.Entry<String, Integer>> allSet = null;
//通过Set来完成
allSet = map.entrySet();
Iterator<Map.Entry<String, Integer>> iter = allSet.iterator();
while (iter.hasNext()) {
Map.Entry<String, Integer> me = iter.next();
System.out.println(me.getKey() + " --> " + me.getValue());
}
}
}
另外也可以用foreach输出:
for (Map.Entry<String,Integer> me : map.entrySet()) {
System.out.println(me.getKey() + " --> " + me.getValue());
}
5.2使用非系统类作为key
示例1:
Map<String, Person> map = new HashMap<String, Person>();
map.put(new String("zs"), new Person("张三", 30));
System.out.println(map.get("zs"));
//System.out.println(map.get(new String("zs")));
//都可以打印出:Person的toString方法.
在Map中可以通过一个匿名对象找到key对应的value.
示例2:
Map<Person, String> map = new HashMap<Person, String>();
map.put(new Person("张三", 30), "zs");
System.out.println(map.get(new Person("张三", 30)));
//但这个却不能打印出:Person的toString方法.结果为null
这样子却找不到key对应的value.为什么示例一的String就可以呢?
这里需要注意的是需要在Person类中覆写equals()方法和hasHashCode()方法来区分是否是同一个对象.
也就是说只要是非系统类作为key操作的话就必须覆写,否则会找不到.
示例:
package org.lxh.mapdemo;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof Person)) {
return false;
}
Person p = (Person) obj;
if (this.name.equals(p.name) && this.age == p.age) {
return true;
} else {
return false;
}
}
public int hashCode() { // 这个方法的返回值都是通过一个公式计算的
// 此时的公式:名字的hashCode * age
return this.name.hashCode() * this.age;
}
public String toString() { // 覆写toString()
return "姓名:" + this.name + ";年龄:" + this.age;
}
}
5.3 其他子类: IdentityHashMap
一般正常情况下,Map集合中的key是不能重复的,这种做法是Map的标准做法,但在集合中提供了一种非正常的操作类:IdentityHashMap,只要对象地址不同,则可以重复加.
示例:
package com.ares.mapdemo;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class IdentityHashMapDemo {
public static void main(String[] args) {
Map<String, Integer> map = new IdentityHashMap<String, Integer>();
map.put(new String("zhangsan"), 1);
map.put(new String("zhangsan"), 2);
Set<String> set = map.keySet(); // 返回全部的key
Iterator<String> iter = set.iterator();
while (iter.hasNext()) {
String key = iter.next();
System.out.println(key + " --> " + map.get(key));
}
}
}
需要注意的是如果用的是HashMap则只会输出一个key-value.
20150519
JAVA学习笔记系列
--------------------------------------------
联系方式
--------------------------------------------
Weibo: ARESXIONG
E-Mail: aresxdy@gmail.com
------------------------------------------------