JAVA基础 day16 Map集合及其子类的运用及练习

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

你可能感兴趣的:(java)