菜鸟学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}
说这些大家应该明白了吧,这个类的其他的方法都是实现的接口中的,我就不再说了