Map<K,V>的使用
Map:将键映射到值的对象;一个映射不能包含重复的键,每个键最多映射到一个值。
1.分类
(1)HashTable :底层是哈希表的数据结构,不可以存入null键、null值,该集合是线程同步的,jdk1.0开始,效率低;
(2)HashMap :底层是哈希表数据结构,可以使用null键、null值,该集合是线程不同步的,jdk1.2开始,效率高;
(3)TreeMap: 底层是二叉树数据结构,线程不同步,可以用于对Map集合中的键进行排序
2.一般方法:
一般情况下(键或值为非null),除了contains方法,判断Map集合是否包含一个键用可以看get方法的返回值是不是为null;
package day15.集合框架3;
import java.util.*;
public class MapDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String,String> map = new HashMap<String,String>();
//添加元素如果出现相同的键,那么后添加的值会覆盖原有的键对应的值,并返回原有的值
System.out.println("put:"+map.put("001", "zhangsan"));
System.out.println("put:"+map.put("001", "lisi"));
map.put("002", "zhangsan3");
map.put("003", "zhangsan3");
System.out.println(map.containsValue("lisi"));
System.out.println(map.get("001"));
//可以存储null键null值
map.put(null, "zhuliu");
System.out.println(map.get(null));
Collection<String> col= map.values();
System.out.println(col);
System.out.println(map);
System.out.println(map.keySet());
}
}
注意:
put()方法:添加键值对,如
Map map= new HashMap();
map.put(1,"jie1");//put返回null
map.put(1,"jie2");//put返回“jie1”,因为键相同,前一个值被覆盖,并作为put方法的返回结果
map集合中存入的是(1,“jie2”)
3.获取集合中键值队的两种方式
(1)通过keySet方法返回所有键存入的Set集合,因为Set具备迭代器,所以可以迭代方式取出所有的键,根据get方法获取每一个键对应的值;
(2)通过entrySet()方法放回键值对关系的Set集合,再通过迭代方式获取所有的键值对,注意迭代器的类型Map.Entry<>,但迭代器的next()方法返回值类型默认是Object,需要类型强制转换或者再获取迭代器时提前使用泛型的方法
package day16.map;
import java.util.*;
//获取map集合每个键值对的2中方式
public class KeySet {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "zhangsan");
map.put(2,"zhangsan2");
map.put(3, "zhangsan3");
// Set<Integer> set= map.keySet();
// Iterator<Integer> it= set.iterator();
// while(it.hasNext()){
// Integer in= it.next();
// System.out.println(in+"="+map.get(in));
// }
// System.out.println("===================");
//通过键值对关系获取键值对
Set<Map.Entry<Integer, String>> set2=map.entrySet();
Iterator<Map.Entry<Integer, String>> it2 =set2.iterator();
System.out.println(it2.equals(set2.iterator()));
//注意,返回的是一个键值对关系,每次调用的iterator返回的都是不同的
while(it2.hasNext()){
Map.Entry entry= it2.next();
//如果不带泛型,返回值是Object
System.out.println(entry.getKey()+"="+entry.getValue());
}
System.out.println(it2.hasNext());//注意此时的迭代器指针指向
Iterator<Map.Entry<Integer,String>> it3= set2.iterator();
for(;it3.hasNext();){
Map.Entry<Integer, String> entry2= it3.next();
System.out.println(entry2.getKey()+"="+entry2.getValue());
}
}
}
4. 将自定义的对象实例存入map中
package day16.map;
import java.util.*;
/*每一个学生都有对应的归属地,
学生Student,地址String
学生属性:姓名,年龄
注意:姓名和年龄相同视为同一学生,保证学生的唯一性和比较性*/
public class HashMapTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<Student,String> map= new HashMap<Student, String>();
map.put(new Student("zhangsan",18),"beijing");
map.put(new Student("zhangsan1",19),"tainjing");
map.put(new Student("zhangsan2",20),"anhui");
//迭代获取
Set<Student> set= map.keySet();
Iterator<Student> it= set.iterator();
while(it.hasNext()){
Student s= it.next();
System.out.println("["+s+"="+map.get(s)+"]");
}
}
}
class Student implements Comparable<Student>//泛型在接口实现中的应用
{
private String name;
private int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int hashCode() {
return name.hashCode()+age*12;
}
@Override
public boolean equals(Object obj) {//equals方法继承自Object 不能使用泛型
if(!(obj instanceof Student))
throw new ClassCastException();
Student s= (Student)obj;
return this.name.equals(s.name)&&this.age==s.age;
}
@Override
public int compareTo(Student s1) {
int num = this.name.compareTo(s1.name);
if(num==0)
return new Integer(this.age).compareTo(new Integer(s1.age));
// TODO Auto-generated method stub
return num;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
4.TreeMap
能够将map按键的顺序进行排序,
条件:键必须有自然顺序(实现 Comparator接口,覆盖ComparaTo方法)或者map本身在定义是传入一个比较器的实例(实现Comparable结构,覆盖Compare方法)