Map集合详解

1.Map集合的概述
  • Map是一种键值对(key-value)的集合,Map集合中每一个元素都包含一个键对象和一个值对象,其中键Key对象不允许重复,而值Value对象可以重复。
  • Map集合没有继承Collection接口,其提供的是key到value的映射,Map中不能包含相同的key值,每个key只能影射一个相同的value,key值还决定了存储对象在映射中的存储位置。
2.Map的子类
  • Hashtable :底层是哈希表数据结构,不允许存入null键null值,该集合是线程同步的,效率低。jdk1.0
  • HashMap :底层是哈希表数据结构,允许存入null键null值,该集合是线程不同步的,将hashtable替代,效率高。jdk1.2
  • TreeMap : 底层是二叉树数据结构,线程不同步,可用于给Map集合中的键进行排序。
3.Map集合与Collection集合的区别
  • Map是双列的,即键值对,Collection是单列的

  • Map的键唯一,Collection的子体系set是唯一的

  • Map集合的数据结构值针对键有效,与值无关,Collection集合的数据结构针对元素有效

  • Collection集合的继承图
    [外链图片转存失败(img-Zaw0bpL5-1562295440735)(media/15532714818029/15533063311200.jpg)]

  • Map集合的继承图
    [外链图片转存失败(img-mvAZ9gr2-1562295440737)(media/15532714818029/15533064081778.jpg)]

  • Map存储元素使用put方法,Collection存储元素使用put方法

  • Map遍历没有直接取出元素的方法,而是先转成set集合,再通过迭代获取元素。

4.Map集合中常用的方法
  1. 添加功能
put(K key,V value):添加元素。
    如果键是第一次存储,就直接存储元素,返回null
    如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
  1. 删除功能
  void clear():移除所有的键值对元素
  remove(Object key):根据键删除键值对元素,并把值返回
  1. 判断功能
    boolean containsKey(Object key):判断集合是否包含指定的键
    boolean containsValue(Object value):判断集合是否包含指定的值
    boolean isEmpty():判断集合是否为空
  1. 获取功能
        Set<Map.Entry<K,V>> entrySet():
        get(Object key):根据键获取值
        Set<K> keySet():获取集合中所有键的集合
        Collection<V> values():获取集合中所有值的集合
  1. 长度功能
    int size():返回集合中的键值对的个数
5. Map实例:
  • Map集合的遍历之键找值

     	HashMap<String, Integer> hm = new HashMap<>();
     	hm.put("张三", 23);
     	hm.put("李四", 24);
     	hm.put("王五", 25);
     	hm.put("赵六", 26);
     	
     	/*Set<String> keySet = hm.keySet();    //获取集合中所有的键
     	Iterator<String> it = keySet.iterator();  //获取迭代器
     	while(it.hasNext()) {	    //判断单列集合中是否有元素
     		String key = it.next();  //获取集合中的每一个元素,其实就是双列集合中的键
     		Integer value = hm.get(key);  //根据键获取值
     	System.out.println(key + "=" + value);//打印键值对
     	}*/
     	
     	for(String key : hm.keySet()) {  //增强for循环迭代双列集合第一种方式
     		System.out.println(key + "=" + hm.get(key));
     	}  
      	
    
    
    
    
    
  • Map集合的遍历之键值对对象找键和值

      HashMap<String, Integer> hm = new HashMap<>();
      	hm.put("张三", 23);
      	hm.put("李四", 24);
      	hm.put("王五", 25);
      	hm.put("赵六", 26);
         /* //获取所有的键值对象的集合
          Set<Map.Entry<String, Integer>> entrySet=hm.entrySet(); 
         Iterator<Entry<String, Integer>> it =entrySet.iterator();//获取迭代器
      while(it.hasNext()) {
      	Entry<String, Integer> en = it.next();  //获取键值对对象
      	String key = en.getKey();    //根据键值对对象获取键
      	Integer value = en.getValue();   //根据键值对对象获取值
      	System.out.println(key + "=" + value);
      }
      */		
      for(Entry<String,Integer> en : hm.entrySet()) {
      	System.out.println(en.getKey() + "=" + en.getValue());
      }
    
    

Hashtable

  • key和value的值均不允许为null
  • 它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。

hashMap

  • hashMap是一个最常用的Map集合,它根据键的HashCode值存储数据,根据键获取值,具有很快的访问速度,遍历时,获取的数据的顺序是随机的。
  • HashMap只允许一条记录的键为null,而允许多条记录的值为null
  • HashMap不支持线程同步(任意一个时刻有多个线程同时写HashMap),可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap
LinkedHashMap
  • LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。也可以在构造时带参数,按照应用次数排序。
  • LinkedHashMap在遍历的时候会比HashMap慢,不过有种情况例外:当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢。因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
  • 键(key)和值(value)均允许为null,线程不同步的。

HashMap和Hashtable的区别

  • HashMap和Hashtable的区别
    • Hashtable是JDK1.0版本出现的,是线程安全的,效率低,HashMap是JDK1.2版本出现的,是线程不安全的,效率高
    • Hashtable不可以存储null键和null值,HashMap可以存储null键和null值

TreeMap

  • TreeMap实现SortMap接口,能够把它保存的记录根据键排序。
  • 默认是按照键(key)的升序排序,也可以指定排序的比较器,当用iterator遍历TreeMap时,得到的记录是排过序的。
  • TreeMap不允许键(key)的值为null,线程不同步的。
1. TreeMap对集合中的键进行排序的方法
  • 方式一:元素自身具备比较性
    和TreeSet一样原理,需要让存储在键位置的对象实现Comparable接口,重写compareTo方法,也就是让元素自身具备比较性,这种方式叫做元素的自然排序也叫做默认排序。
  • 方式二:容器具备比较性
    当元素自身不具备比较性,或者自身具备的比较性不是所需要的。那么此时可以让容器自身具备。需要定义一个类实现接口Comparator,重  写compare方法,并将该接口的子类实例对象作为参数传递给TreeMap集合的构造方法。

注意:当Comparable比较方式和Comparator比较方式同时存在时,以Comparator的比较方式为主;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值