菜鸟学Java(十九)

初学者学Java(十九)

                     可变的数组--------集合类之Map

在前面说过集合类可以分为两大类:Collection和Map。在这一篇我们来探讨一下Map接口。

                                                   Map接口

       和Collection的实现类不同,Map内存放的是两个值:key(键)和Value(值),两者之间是映射的关系,也就是说一个键映射一个值。所以在Map中Key是不允许重复的,但Value是可以重复的。

       下面我们来看一下Map接口中定义了那些方法:

1.添加操作:V  put(Kkey, V value);这个方法是想集合中放一个键和值,K和V在我们后面讲到泛型的时候会讲到,现在就当他是Object就行,不过k和v是不一样的Object。

2.取值操作:Vget(Object key);返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回null。

3.返回一个所有键的集合:Set<K>keySet();因为key是不允许重复的,而Set也是不允许重复的,所以规定返回一个Set的对象。

4.返回一个所有值的集合:Collection<V>values();因为values的值没有要求,所以返回的是一个Collection对象。

5.计算元素的个数:intsize();返回此映射中的键-值映射关系数。

6.删除操作:Vremove(Object key);如果存在一个键的映射关系,则将其从此映射中移除,返回的是这个键所对应的值。

下面我们来看看Map接口的具体的实现类。

Map有两个实现类:HashMap和TreeMap类。

HashMap

HashMap类是基于哈希表的 Map 接口的实现,最大的特点是无序,其实他的顺序是靠散列技术来决定的,但表现出来就是没有顺序的。

HashMap 的实例有两个参数影响其性能:初始容量和加载因子。初始容量是HashMap在创建时的容量。加载因子是HashMap是用来衡量容量是否够用的判断因素,当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 扩容操作。例如初始容量为16.默认的加载因子为0.75.所以当集合中有12个元素时,他就会扩容。

                  构造方法

无参构造方法:

public HashMap();

构造一个具有默认初始容量(16) 和默认加载因子 (0.75) 的空 HashMap。

可以自定义初始容量的构造方法:

public HashMap(int initialCapacity)

        构造一个带指定初始容量和默认加载因子 (0.75) 的空HashMap。

                   普通方法

      关于普通的方法,HashMap大多都是实现自Map接口的,下面我来写个程序来说明一下,这些方法的使用:

例:

package test;

import java.util.*;

public class HashMapTestOne {

    public static void main(String[]args) {

        HashMap map1= new HashMap();

        //向集合中添加三个元素并输出

        map1.put("a", "张三");

        map1.put("b", "李四");

        map1.put("c", "王五");

        System.out.println(map1);

        //向集合中添加一个已经存在的键的元素,并输出

        map1.put("a", "赵六");

        System.out.println(map1);

        //查看某个键对应元素的值

        System.out.println(map1.get("a"));

        //键的集合,并输出

        Set set1 = map1.keySet();

        System.out.println(set1);

        //值的集合,并输出

        Collection collect1 = map1.values();

        System.out.println(collect1);

        //元素的个数

        System.out.println("HashMap中元素的个数是:"+map1.size());

        //删除“c”映射的元素,并输出剩下的元素

        map1.remove("c");

        System.out.println(map1);

    }

}

运行的结果是:

{b=李四, c=王五, a=张三}

{b=李四, c=王五, a=赵六}

赵六

[b, c, a]

[李四, 王五, 赵六]

HashMap中元素的个数是:3

{b=李四, a=赵六}

 

            这样大家应该可以对明白HashMap的使用方法了,下面我来讲一下TreeMap。

                                   TreeMap

            有的时候我们需要一个有顺序的Map集合,这是我们就需要这个TreeMap类,TreeMap类不仅实现了Map接口,也实现了SortedMap接口。所以他的集合中的映射具有了一定的顺序。

            我们先来了解一下他的构造方法:

            1.public TreeMap();首先来了解的还是无参的构造方法,他是按照自然顺序来构建一个空的映射集合,其内的元素必须是可以比较的,否则就会抛出异常。但在实际应用中,我们需要其内的元素按我们的要求来排序,这是我们就需要下一个构造方法。

           2.public TreeMap(Comparator  comparator);这个构造方法可以按照我们的需要来进行元素排序,不过需要我们来传如一个比较器,来说明我们是对元素是如何排序的。我写个程序来说明一下。

例:

package test;

import java.util.*;

/**

 *输入学生学号来排序,高的排在前面。

 */

class Student

{

    public int studentId;

    public int studentScore;

    public Student(int studentId,int studentScore)

    {

        this.studentId = studentId;

        this.studentScore = studentScore;

    }

}

/*

 * 定义比较器.

 */

class StudentComparator implements Comparator

{

    public int compare(Object o1, Object o2) {

        int studentOneId =((Integer)o1).intValue();

        int studentTwoId =((Integer)o2).intValue();

        return studentTwoId - studentOneId;

    }

}

public class TreeMapTest {

    public static void main(String[]args) {

        TreeMap map1 = new TreeMap(new StudentComparator());

        Student s1 = new Student(001 , 80);

        Student s2 = new Student(002 , 90);

        Student s3 = new Student(003 , 70);

        map1.put((Integer)s1.studentId,(Integer)s1.studentScore);

        map1.put((Integer)s2.studentId,(Integer)s2.studentScore);

        map1.put((Integer)s3.studentId,(Integer)s3.studentScore);

        System.out.println(map1);

        }

}

运行结果:

{3=70, 2=90, 1=80}

如果没有这个比较器的结果:

{1=80, 2=90, 3=70}

说这些大家应该明白了吧,这个类的其他的方法都是实现的接口中的,我就不再说了