Map接口
Collection操作之前已经发现,每次保存的对象都是一个对象。但是在Map中保存的是一对对象,以keyàvalue的形式保存。
Map接口常用子类:
HashMap:无序存放的,是新的操作类,key不允许重复
HashTable: 无序存放的,是旧的操作类,key不允许重复
TreeMap:可以排序的Map集合,按集合中的key排序,key不允许重复
WeakHashMap:弱引用的Map集合,当集合中某些内容不再被引用时,可以清除掉无用的数据,可以使用GC进行回收
IdetityHashMap:key可以重复的Map集合
举例:向Map集合中插入数据
1 package com.feimao.a1; 2 3 4 5 import java.util.HashMap; 6 7 8 9 public class HashMapDemo01 { 10 11 public static void main(String args[]){ 12 13 HashMap<String , String> h = new HashMap<String , String>(); 14 15 h.put("feimao" , "zhubaobao"); 16 17 h.put("xiao" , "taotao"); 18 19 h.put("Hash" , "Demo"); 20 21 String s = h.get("xiao"); 22 23 System.out.println("取出的内容 :" + s); 24 25 } 26 27 }
举例:在Map中使用contains方法()判断key和value的值是否存在
1 package com.feimao.a1; 2 3 4 5 import java.util.HashMap; 6 7 8 9 public class HashMapDemo01 { 10 11 public static void main(String args[]){ 12 13 HashMap<String , String> h = new HashMap<String , String>(); 14 15 h.put("feimao" , "zhubaobao"); 16 17 h.put("xiao" , "taotao"); 18 19 h.put("Hash" , "Demo"); 20 21 /* String s = h.get("xiao"); 22 23 System.out.println("取出的内容 :" + s);*/ 24 25 if(h.containsKey("feimao")){ 26 27 System.out.println("搜索的key存在!"); 28 29 }else{ 30 31 System.out.println("搜索的key不存在"); 32 33 } 34 35 if(h.containsValue("taotao1")){ 36 37 System.out.println("搜索的value存在!"); 38 39 }else{ 40 41 System.out.println("搜索的value不存在!"); 42 43 } 44 45 } 46 47 }
HashMap和Hashtable的区别
两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全。
Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,因此相对而言HashMap性能会高一些,我们平时使用时若无特殊需求建议使用HashMap,在多线程环境下若使用HashMap需要使用Collections.synchronizedMap()方法来获取一个线程安全的集合(Collections.synchronizedMap()实现原理是Collections定义了一个SynchronizedMap的内部类,这个类实现了Map接口,在调用方法时使用synchronized来保证线程同步,当然了实际上操作的还是我们传入的HashMap实例,简单的说就是Collections.synchronizedMap()方法帮我们在操作HashMap时自动添加了synchronized来实现线程同步,类似的其它Collections.synchronizedXX方法也是类似原理。
HashMap可以使用null作为key,不过建议还是尽量避免这样使用。HashMap以null作为key时,总是存储在table数组的第一个节点上。而Hashtable则不允许null作为key。
HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。
HashMap扩容时是当前容量翻倍即:capacity*2,Hashtable扩容时是容量翻倍+1即:capacity*2+1。
HashMap和Hashtable的底层实现都是数组+链表结构实现。