Java集合类之Map

时间:2022-01-01 03:01:27

  这两天看了一下关于Map及子类的东西,做一下小结。

 Map

 Map集合里存储的是具有映射关系的键值对,什么是映射关系,就跟数学当中的函数映射差不多,一个x值对应一个y值。Map中也一样,里面的“键”就相当于x值,“值”相当于y值。键值是不能重复的,每个键最多映射一个值。Map接口提供三种Collection接口,允许以键集合——KetSet,值集合——Values和键值对集合EntrySet来产看映射的内容。映射的顺序为迭代器在Collection视图中返回的顺序,有些映射是有顺序的如TreeMap,有些没有如HashMap。(Map中是没有直接的迭代器,实质是获得键集合或键-值的Set集合以及值集合的Collection,然后用这些集合的迭代器进行迭代,我是这样理解的,不知道对不对).Map中有一些常规的方法,如put,get,clear等,通过代码进行说明。

public class MapDemo {

	public static void main(String[] args) {
		
		Map<Integer,String> map = new HashMap<Integer,String>();
		map.put(8,"zhaoliu");  //添加元素
		map.put(2,"zhaoliu");
		map.put(7,"xiaoqiang");
		map.put(6,"wangcai");
		
		<span style="font-family:FangSong_GB2312;">//得到map中“值”的集合</span>
		Collection<String> values = map.values();
		<span style="font-family:FangSong_GB2312;">//调用迭代器</span>
		Iterator<String> it2 = values.iterator();
		while(it2.hasNext()){
			System.out.println(it2.next());
		}
	}
}
	
		Map<Integer,String> map = new HashMap<Integer,String>();
		map.put(8,"zhaoliu");
		map.put(2,"zhaoliu");
		map.put(7,"xiaoqiang");
		map.put(6,"wangcai");
		
		//获得map中键的集合,然后得到它的迭代器,遍历,再通过键值获得
                <span style="font-family:FangSong_GB2312;">//</span>元素值
		Set<Integer> keySet = map.keySet();
		Iterator<Integer> it = keySet.iterator();
		
		while(it.hasNext()){
			Integer key = it.next();
			String value = map.get(key);
			System.out.println(key+":"+value);
			
		}
//获得map中键-值的集合,其中Map.Entry<Ingeter,String> 是映射关系的类型,Entrt是Map中的内部接口
		Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
		Iterator<Map.Entry<Integer, String>> it = entrySet.iterator();
		
		while(it.hasNext()){
			Map.Entry<Integer, String> me = it.next();
			Integer key = me.getKey();
			String value = me.getValue();
			System.out.println(key+"::::"+value);
			
		}

HashMap

基于hash表的Map接口的实现,可以允许null值和null键,此类不能保证映射的顺序。HashMap是不同步的,线程不安全的,因次当多个线程访问此线程,其中至少一个线程从结构上修改了该映射,则必须保持外部同步。什么结构上修改?就是指增加或删除一个或多个映射关系的操作,而那些修改了已经存在的映射关系的值的操作则不是结构上修改。

HashMap的实例有两个实例会影响其性能:初始容量和加载因子。初始容量就是这个HashMap中数组的大小,加载因子就是当元素达到数组大小的多少时,就开始扩充数组大小。HashMap默认的初始容量为16,加载因子为0.75,也就是说当元素达到12个的时候,将调用rehash开始进行数组的扩充。

Hashtable

Hashtale是一个比较老的类,现在基本很少使用,与HashMap相比,它是线程安全的,因次性能上要比HashMap低,且不允许使用null作为键和值。

HashMap和Hashtable都是两个key通过equals方法比较返回true,并且两个key的hashcode值也相同。

LinkedHashMap

Map接口哈希表和链接表的实现,具有可预知的迭代顺序。它与HashMap不同,维护着一个运行于所有条目的双重连接表,这个链接表定义了迭代顺序,此迭代顺序通常就是插入到映射中的顺序。

TreeMap

SortedMap接口的基于红黑树的实现,此类保证了映射按照升序循序排列关键字,根据使用的构造方法不同,可能按照键的类的自然顺序进行排序,或者在创建时按照所实现的比较器进行排序。该实现也是不同步的。