Colllection接口是保存单值最大的父接口,那么Map接口保存的内容是一对值,所有的内容是以:key——>value 的形式保存的。
类似 -----------------------------电话本
张三----------------------123456
李四----------------------234567
map接口本身有三个常用的子类
HashMap , Hashtable , TreeMap
1-------------------------------------新的子类:HashMap(重点)
map中的key是不能重复的,如果是重复的内容,则属于覆盖
package org.lxh.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) ;
}
}
Map的最大特点是用于查找的操作,如果查找到了则返回内容,否则返回null
package org.lxh.mapdemo;
import java.util.HashMap;
import java.util.Map;
public class HashMapDemo02 {
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);
Integer value = map.get("zhangsan") ;
System.out.println(value) ;
}
}
以上的功能是map最常见的一种功能
还可以将Map中的全部Key以Set集合的形式返回
package org.lxh.mapdemo;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapDemo03 {
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<String> set = map.keySet(); // 返回全部的key
Iterator<String> iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
}
}
还可以在以上的程序上进行扩展,再将全部的值取出。
package org.lxh.mapdemo;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapDemo04 {
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<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本身也属于无序烦人一种操作
也可以通过values()方法,将全部的value通过一个Collection接口的形式返回
package org.lxh.mapdemo;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HashMapDemo05 {
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);
Collection<Integer> col = map.values();// 取得全部value
Iterator<Integer> iter = col.iterator();
while (iter.hasNext()) {
Integer value = iter.next();
System.out.println(value);
}
}
}
2—————————旧的子类:Hashtable
Hashtable实际上与Vector的产生时代是一样的 也属于最早的集合操作类。之后只是扩展了其应用实现了Map接口
package org.lxh.mapdemo;
import java.util.Hashtable;
import java.util.Map;
public class HashtableDemo01 {
public static void main(String[] args) {
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);
}
}
3----------HashMap与Hashtable的区别
HashMap与Hashtable都是Map接口的子类,既然是Map接口的子类,name这两个类有什么区别??
HashMap:是JDK1.2之后推出的,采用异步处理操作,性能高,非线性安全的操作
Hashtable:是JDK1.0是推出的,采用同步的处理操作,性能相对较低,线性安全
4—————————按key排序的子类:TreeMap(重点)
TreeMap使用的时候可以进行按照key的方式进行排序
package org.lxh.mapdemo;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapDemo04 {
public static void main(String[] args) {
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));
}
}
}
注 ::::::::::::::map不能直接使用Iterator输出
要想输出则肯定依靠Map.Entry
Map接口使用Iteartor输出的标准操作
1.。。通过Map接口中的:Set<Map.Entry<K,V>> entrySet() 方法取得Set集合
2.。。通过Set接口为Iterator进行初始化的操作
3.。。通过Iterator取出每一个Map.Entry
4..。。通过Map.Entry进行key与value的分离
package org.lxh.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;
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());
}
}
}
在JDK1.5之后可以使用foreach输出全部的内容
package org.lxh.foreachdemo; import java.util.HashMap; import java.util.Map; public class ForeachMapDemo { 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); for (Map.Entry<String,Integer> me : map.entrySet()) { System.out.println(me.getKey() + " --> " + me.getValue()); } } }
使用非系统类作为key值
ckage 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; } }
package org.lxh.mapdemo; import java.util.HashMap; import java.util.Map; public class HashMapPersonDemo02 { public static void main(String[] args) { Map<Person, String> map = new HashMap<Person, String>(); map.put(new Person("张三", 30), "zs"); System.out.println(map.get(new Person("张三", 30))); } }