zoukankan      html  css  js  c++  java
  • (10)集合之双列集合Map,HashMap,TreeMap

    Map中的元素是两个对象,一个对象作为键,一个对象作为值。键不可以重复,但是值可以重复。

    看顶层共性方法找子类特有对象.

    MapCollection在集合框架中属并列存在

    Map存储的是键值对

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

    Map集合没有直接取出元素的方法,而是先转成Set集合,在通过迭代获取元素

    Map集合中键要保证唯一性

    也就是Collection是单列集合, Map 是双列集合

    总结

    Map一次存一对元素, Collection 一次存一个Map 的键不能重复保证唯一

    Map 一次存入一对元素,是以键值对的形式存在.键与值存在映射关系.一定要保证键的唯一性.

    Map学习体系:

     ---| Map  接口    将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

    ---| HashMap  采用哈希表实现,所以无序

                ---| TreeMap   可以对健进行排序

    ---|Hashtable:

    底层是哈希表数据结构,线程是同步的,不可以存入null键,null值。

    效率较低,被HashMap 替代。

    ---|HashMap:

    底层是哈希表数据结构,线程是不同步的,可以存入null键,null值。

    要保证键的唯一性,需要覆盖hashCode方法,和equals方法。

      ---| LinkedHashMap

    该子类基于哈希表又融入了链表。可以Map集合进行增删提高效率。

    ---|TreeMap:

    底层是二叉树数据结构。可以对map集合中的键进行排序。需要使用Comparable或者Comparator 进行比较排序。return 0,来判断键的唯一性。

    常规方法:

    1、添加:

    1V put(K key, V value)    (可以相同的key值,但是添加的value值会覆

    盖前面的,返回值是前一个,如果没有就返回null                                          

    2putAll(Map<? extends K,? extends V> m)  从指定映射中将所有映射关

    系复制到此映射中(可选操作)。

    2、删除

    1remove()    删除关联对象,指定key对象

    2clear()     清空集合对象

    3、获取

         1value get(key); 可以用于判断键是否存在的情况。当指定的键不存在的时候,返

    回的是null

    3、判断:

    1boolean isEmpty()   长度为0返回true否则false

        2boolean containsKey(Object key)  判断集合中是否包含指定的key

    3boolean containsValue(Object value)  判断集合中是否包含指定的value

    4、长度:Int size()

    遍历Map的方式

    第一种方式:使用keySet

    Map转成Set集合(keySet()),通过Set迭代器取出Set集合中的每一个元素(Iterator)就是Map集合中的所有的键,再通过get方法获取键对应的值。

     1 public class Demo2 {
     2     public static void main(String[] args) {
     3         Map<Integer, String> map = new HashMap<Integer, String>();
     4         map.put(1, "aaaa");
     5         map.put(2, "bbbb");
     6         map.put(3, "cccc");
     7         System.out.println(map);
     8 
     9         //
    10         // 获取方法:
    11         // 第一种方式: 使用keySet
    12         // 需要分别获取key和value,没有面向对象的思想
    13         // Set<K> keySet() 返回所有的key对象的Set集合
    14 
    15         Set<Integer> ks = map.keySet();
    16         Iterator<Integer> it = ks.iterator();
    17         while (it.hasNext()) {
    18             Integer key = it.next();
    19             String value = map.get(key);
    20             System.out.println("key=" + key + " value=" + value);
    21         }
    22     }
    View Code

    第二种方式通过values 获取所有值,不能获取到key对象

     1 public static void main(String[] args) {
     2         Map<Integer, String> map = new HashMap<Integer, String>();
     3         map.put(1, "aaaa");
     4         map.put(2, "bbbb");
     5         map.put(3, "cccc");
     6         System.out.println(map);
     7 // 第二种方式:
     8         // 通过values 获取所有值,不能获取到key对象
     9         // Collection<V> values()
    10 
    11         Collection<String> vs = map.values();
    12         Iterator<String> it = vs.iterator();
    13         while (it.hasNext()) {
    14             String value = it.next();
    15             System.out.println(" value=" + value);
    16         }
    17 }
    View Code

    第三种方式: Map.Entry

    public static interface Map.Entry<K,V>

    通过Map中的entrySet()方法获取存放Map.Entry<K,V>对象的Set集合。

    Set<Map.Entry<K,V>> entrySet()

    面向对象的思想将map集合中的键和值映射关系打包为一个对象,就是Map.Entry

    ,将该对象存入Set集合,Map.Entry是一个对象,那么该对象具备的getKeygetValue获得键和值。

     1 public static void main(String[] args) {
     2         Map<Integer, String> map = new HashMap<Integer, String>();
     3         map.put(1, "aaaa");
     4         map.put(2, "bbbb");
     5         map.put(3, "cccc");
     6         System.out.println(map);
     7         // 第三种方式: Map.Entry对象 推荐使用 重点
     8         // Set<Map.Entry<K,V>> entrySet()
     9         
    10 
    11         // 返回的Map.Entry对象的Set集合 Map.Entry包含了key和value对象
    12         Set<Map.Entry<Integer, String>> es = map.entrySet();
    13 
    14         Iterator<Map.Entry<Integer, String>> it = es.iterator();
    15 
    16         while (it.hasNext()) {
    17             
    18             // 返回的是封装了key和value对象的Map.Entry对象
    19             Map.Entry<Integer, String> en = it.next();
    20 
    21             // 获取Map.Entry对象中封装的key和value对象
    22             Integer key = en.getKey();
    23             String value = en.getValue();
    24 
    25             System.out.println("key=" + key + " value=" + value);
    26         }
    27     }
    View Code

    HashMap

    底层是哈希表数据结构,线程是不同步的,可以存入null键,null要保证键的唯一性,需要覆盖hashCode方法,和equals方法。

    案例:自定义对象作为Map的键

    TreeMap

    TreeMap的排序,TreeMap可以对集合中的键进行排序。如何实现键的排序?

    方式一:元素自身具备比较性

    TreeSet一样原理,需要让存储在键位置的对象实现Comparable接口,重写compareTo方法,也就是让元素自身具备比较性,这种方式叫做元素的自然排序也叫做默认排序。

    方式二:容器具备比较性

    当元素自身不具备比较性,或者自身具备的比较性不是所需要的。那么此时可以让容器自身具备。需要定义一个类实现接口Comparator,重写compare方法,并将该接口的子类实例对象作为参数传递给TreeMap集合的构造方法。

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

    注意:在重写compareTo或者compare方法时,必须要明确比较的主要条件相等时要比较次要条件。(假设姓名和年龄一直的人为相同的人,如果想要对人按照年龄的大小来排序,如果年龄相同的人,需要如何处理?不能直接return 0,以为可能姓名不同(年龄相同姓名不同的人是不同的人)。此时就需要进行次要条件判断(需要判断姓名),只有姓名和年龄同时相等的才可以返回0.

    通过return 0来判断唯一性。

  • 相关阅读:
    安装lnmp 时如何修改数据库数据存储地址及默认访问地址
    ubuntu 设置root用户密码并实现root用户登录
    解决ubuntu 远程连接问题
    linux 搭建FTP服务器
    PHP 根据ip获取对应的实际地址
    如何发布自己的composer包
    使用composer安装composer包报Your requirements could not be resolved to an installable set of packages
    laravel 框架配置404等异常页面
    使用Xshell登录linux服务器报WARNING! The remote SSH server rejected X11 forwarding request
    IoTSharp 已支持国产松果时序数据库PinusDB
  • 原文地址:https://www.cnblogs.com/OliverZhang/p/6019515.html
Copyright © 2011-2022 走看看