Map集合
上文我们讲了java中的Queue集合,今天我们来讲讲java.util包中更为常见的集合类Map集合。
Map集合中包含的是元素对(即键(“key”)和值(values)),它们可以使任何引用类型的数据,其中,Map的key值是不可重复的,因为该类重写了equals方法,使得该方法返回值总为false。
Key和value是一一对应的关系,即通过指定的key,总能找到唯一的value对象。Map里的key放在一起可以看成一个Set集合,实际上Map中包含了一个keySet()方法,用于返回Map里所有key组成的Set集合。
Map中的所有value放在一起可以看成一个list集合,元素与元素之间可以重复,每个元素可以根据索引来查找。只是Map中的索引不再使用整数值,而是以另外一个对象作为索引。如果需要从Map中取出元素,则需要提供该元素的key索引。
方法区:
HashMap和Hashtable实现类
区别:
1、Hashtable是一个线程安全的Map实现,但HashMap是线程不安全。所以HashMap比Hashtable性能更高一点。
2、Hashtable不允许使用null作为key和value,而HashMap则可以。
样例:
public class MapDemo {
public static void main(String[] args) {
Map map=new HashMap();
map.put(null, null);
System.out.println(map.size());
Map map1=new Hashtable();
map1.put(null, null);
System.out.println(map1.size());
}
}
运行结果:
1
Exception in thread “main” java.lang.NullPointerException
at java.util.Hashtable.put(Hashtable.java:394)
at collection.MapDemo.main(MapDemo.java:13)
分析:Hashmap正常运行,而Hashtable则报NullPointerException(空指针异常)的错误,说明Hashtable并不能存放null值。
注意 :尽量不要使用可变对象作为HashMap的key,如果使用了可变对象作为了map的key,则在程序中尽量不要去修改变量。
样例:public static void main(String[] args) {
String Str="123";
Map map =new HashMap();
map.put(Str, "lisi");
Str="abc";
System.out.println(map.get(Str));
System.out.println(map.get("123"));
}
}
分析:因为刚开始调用put方法的时候存放的值是堆内存中变量的值,这时已经固定是上面代码中的“123”这个值,如果再更改变量的话,该变量的值变为“abc”,所以输出的时候返回null,因为Str中的值已经不是存放时的值了。
LinkedHashMap实现类
LinkedHashMap是HashMap的子类,同LinkedHashSet一样,LinkedHashMap在存储数据元素时同样使用了链表来维护key-value对的存放顺序,该链表负责维护Map的迭代顺序,迭代顺序与key-value对的插入顺序保持一致。
Map集合还包含许多知识,具体请接下文。