MAP集合:该集合存储键值对,一对一对存。并且要保证键的唯一性。
collection为单列集合,Map为双列集合。
Map集合常用的子类:
HashTable:底层是哈希表数据结构,不可以将null设置为键或者值。该集合线程同步
HashMap:底层是哈希表数据结构,允许使用null键和null值,该集合线程不同步。
TreeMap:底层是二叉树数据结构,线程不同步,可以用于给集合中的键进行排序。
Map中的put为添加方法,如果添加了相同的键,则后添加的值会覆盖键原有的值,并且put方法会返回被覆盖的那个值。
Map中可以通过get来获得某个键的值。
Map集合中没有迭代器,要想取出所有的值有两种方法。
KeySet:将Map中所有的键都存入到Set集合中,set集合中有迭代器,我们迭代每一个键值,再用Map集合的get方法,获得相对应的值。
import java.util.*;
class MapDemo
{
public static void main(String[]args)
{
Map<String,String>map=new HashMap<String,String>();
map.put("01","cui");
map.put("02","li");
map.put("03","zhao");
map.put("04","wu");
Set <String>s=new HashSet<String>();
s=map.keySet();
Iterator <String>it=s.iterator();
while(it.hasNext())
{
System.out.println(map.get(it.next()));
}
}
}
entrySet方法 取出集合的映射关系,将其关系存在Set集合中。该集合的泛型类型为映射关系,即Map.Entry
import java.util.*;
class EntrySetDemo
{
public static void main(String []args)
{
Map map=new HashMap();
map.put("01","cui");
map.put("02","li");
map.put("03","zhao");
map.put("04","wu");
Set<Map.Entry<String,String>> entrySet=map.entrySet();
Iterator<Map.Entry<String,String>> it=entrySet.iterator();
while (it.hasNext())
{
Map.Entry<String,String> me=it.next();
System.out.println(me.getKey()+":"+me.getValue());
}
}
}
在我们定义一个类,该类可能有很多对象,并且可能存于HashSet,TreeSet等容器时,我们必须得覆盖其中的equals和hashcode两个方法,来保证以我们的规则来确定元素的唯一性。(set集合元素唯一)。
例子:将学生和归属地作为映射。学生类有名字和年龄属性。定义map集合,学生是唯一的,将学生作为键,归属地为值存入。将名字和年龄相同的当作相同元素。获取map中元素。代码如下。
import java.util.*;
class Student implements Comparable<Student>//实现Comparable接口,当存储TreeSet集合时可以有一个我们定义的排序方法。
{
private String name;
private int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
public int hashCode() //当我们将多个对象传入HashSet等哈希值相关的集合中时,我们需要覆盖hashcode和equals来确定按照我们的规则来保证元素的唯一性。
{
return name.hashCode()+10*this.age;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Student))
throw new ClassCastException("类型不匹配");
Student s=(Student)obj;
return (s.name).equals(this.name)&&this.age==s.age;
}
public int compareTo(Student s)
{
int num=new Integer(this.age).compareTo(new Integer(s.age));
if (num==0)
return this.name.compareTo(s.name);
return num;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
class MapTest
{
public static void main(String []args)
{
Map<Student,String> m=new HashMap<Student,String>();
m.put(new Student("zhangsan",15),"shanghai");
m.put(new Student("lisi",16),"beijing");
m.put(new Student("wangwu",18),"henan");
m.put(new Student("zhangsan",15),"anhui");
Set<Student> s=m.keySet();
Iterator <Student>it=s.iterator();
while(it.hasNext())
{
Student stu=it.next();
System.out.println(stu.getName()+"---"+stu.getAge());
}
}
}
当我们想对传入的元素进行排序时,只需要建立TreeMap集合。
因为Student类中已经定义了自然排序是按照年龄来排序。如果想要改变排序方式,可以自己建立比较器,和TreeSet中的方法一样。
import java.util.*;
class TreeMapDemo
{
public static void main(String[]args)
{
TreeMap<Student,String> t=new TreeMap<Student,String>();
t.put(new Student("zhangsan",18),"shanghai");
t.put(new Student("lisi",16),"beijing");
t.put(new Student("wangwu",7),"henan");
t.put(new Student("zhangsan",56),"anhui");
Set<Map.Entry<Student,String>> s=t.entrySet();
Iterator <Map.Entry<Student,String>>it=s.iterator();
while (it.hasNext())
{
Map.Entry<Student,String> me=it.next();
System.out.println(me.getKey().getName()+"--"+me.getKey().getAge()+"--"+me.getValue());
}
}
}
![结果](http://img.blog.csdn.net/20161013205804854)
TreeMap练习,打出字母出现的次数
//字母是唯一的,次数不唯一,字母可以作为键,次数可以作为值
//先查看集合中是否有这个键,没有就将这个字母和1作为键值对存入,有的话将值+1再重新存入。
import java.util.*;
class MapTest1
{
public static void main(String []args)
{
String s="abcabcdabcde";
char []arr=s.toCharArray();
TreeMap<Character,Integer>t=new TreeMap<Character,Integer>();
for (int i=0;i<arr.length;i++)
{
if(!(t.containsKey(arr[i])))
t.put(arr[i],1);
else{
int num=t.get(arr[i])+1;
t.put(arr[i],num);
}
}
Set<Character>s1=t.keySet();
Iterator<Character>it=s1.iterator();
while(it.hasNext())
{
char a=it.next();
int b=t.get(a);
System.out.print(a+"("+b+")");
}
}
}
![结果](http://img.blog.csdn.net/20161013215644224)
Map集合的扩展:可以进行集合嵌套。
比如有一个学校,学校里面有很多班,班里有学生,学生属性为年龄和姓名。
这时候可以
HashMap