一、概述
1、简述:
Map<K,V>集合是一个接口,和List集合及Set集合不同的是,它是双列集合,并且可以给对象加上名字,即键(Key)
2、特点:
1)该集合存储键值对,一对一对往里存
2)要保证键的唯一性。
二、Map集合的子类
Map
|--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。JDK1.0,效率低。
|--HashMap:底层是哈希表数据结构。允许使用null键null值,该集合是不同步的。JDK1.2,效率高。
|--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给Map集合中的键进行排序。
Map和Set很像。其实Set底层就是使用了Map集合。
三、Map集合的常用方法
1、添加
Vput(K key,V value);//添加元素,如果出现添加时,相同的键,那么后添加的值会覆盖原有键对应值,并put方法会返回被覆盖的值。
voidputAll(Map <? extends K,? extends V> m);//添加一个集合
2、删除
clear();//清空
Vremove(Object key);//删除指定键值对
3、判断
containsKey(Objectkey);//判断键是否存在
containsValue(Objectvalue)//判断值是否存在
isEmpty();//判断是否为空
4、获取
Vget(Object key);//通过键获取对应的值
size();//获取集合的长度
Collection<V>value();//获取Map集合中所以得值,返回一个Collection集合
四、Map集合的两种取出方式
Map集合的取出原理:将Map集合转成Set集合。再通过迭代器取出。
1、Set<K> keySet():将Map中所以的键存入到Set集合。因为Set具备迭代器。所以可以通过迭代方式取出所以键的值,再通过get方法。获取每一个键对应的值。
2、Set<Map.Entry<K,V>> entrySet():将Map集合中的映射关系存入到Set集合中,而这个关系的数据类型就是:Map.Entry
其实,Entry也是一个接口,它是Map接口中的一个内部接口。
Map集合的两种取出方式代码如下:
/*
存入学生进Map集合中,学生:姓名,年龄,地址。姓名和年龄相同为同一个学生
*/
import java.util.*;
class Student
{
private String name;
private int age;
//初始化名字和年龄
Student(String name,int age)
{
this.name=name;
this.age=age;
}
//复写hashCode方法,判断hash值
public int hashCode()
{
return this.name.hashCode()+age*23;
}
//复写equals方法,判断内容是否相同
public boolean equals(Object obj)
{
if(!(obj instanceof Student))
throw new RuntimeException("不是学生");
Student stu = (Student)obj;
return this.name.equals(stu.name)&&new Integer(this.age).equals(new Integer(stu.age));
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
class MapTest
{
public static void main(String[] args)
{
meth();
}
public static void meth()
{
HashMap<Student,String> ha=new HashMap<Student,String>();
ha.put(new Student("liuyi",20),"beiliu");
ha.put(new Student("liuyi",20),"beiliu");
ha.put(new Student("haner",22),"yulin");
ha.put(new Student("zhangsan",19),"beihai");
ha.put(new Student("lisi",21),"nanning");
//第一种取出方式
//取出HashMap集合中的键存到Set集合中
// Set<Student> keySet=ha.keySet();
//建立键的迭代器
// Iterator<Student> it = keySet.iterator();
//第二种取出方式
//将Map集合中的映射关系存入到Set集合中
Iterator<Map.Entry<Student,String>> it=ha.entrySet().iterator();
while(it.hasNext())
{
//第一种取出方式
// Student st=it.next();
// String str=st.getName();
// int in = st.getAge();
// String id=ha.get(st);
// System.out.println(str+" "+in+" "+id);
//第二种取出方式
Map.Entry<Student,String> m=it.next();
Student st=m.getKey();
String id=m.getValue();
String name=st.getName();
int age=st.getAge();
System.out.println(name+" "+age+" "+id);
}
}
}