zoukankan      html  css  js  c++  java
  • Java集合框架之图解(更新中...)

    关于图我们该如何理解呢?!看看下面一个应用场景

    假设程序存储了一百万个学生,而且需要按照其学号进行检索,那么怎样的方式有效?

         此时有效的数据结构就是图(map)   按照键值对存储元素的容器(键值可以是任意类型的对象,即泛型的威力),map中不能有重复的Key,但是value值可以相同,key和value组成一个条目,图中存储的为此条目。示意图如下(画的很糟糕,见谅!):

    图的类型:

    散列图:hashMap、链式散列图LinkedHashMap、树形图TreeMap。其都定义在Map接口中,其关系如下:

    Map接口提供了查询、更新和获取集合的值和集合键值的方法。

    更新方法(update methods)包括clear、put、putAll、remove

    查询方法(query methods)包括containsKey、containsValue、isEmpty和sized

    ======================================================================================================

    AbstractMap类是一个便利类,实现了Map接口中除了entrySet()方法之外的所有方法。

    SortedMap接口扩展了Map接口,并保持映射以键值升序的顺序排列。除此之外还有附加方法firstKey()和lastKey()以返回最低键值和最高键值,headMap(toKey)返回值小于toKey的那部分图,而tailMap(fromKey)返回键值大于或等于fromKey的那部分图。

    HashMap、LinkedMap和TreeMap类是Map接口的具体实现

    三种具体实现类在何时使用时最有效呢?!答案在下面

    HashMap:对于定位一个值,插入一个映射以及删除一个映射,适宜使用HashMap

    LinkedHashMap:由其类名可知,LinkedHashMap是用链表实现来扩展HashMap类,LinkedHashMap支持图中的条目排序。而HashMap中的条目是没有顺序的,但在LinkedHashMap中,元素既可以按照他们插入图的顺序排序(插入排序)也可以按照他们最后一次被访问时的顺序,从最早到最晚(访问排序(access order))。无参构造方法是以插入顺序来创建LinkedHashMap对象的。要按访问顺序创建LinkedHashMap对象,应该使用构造方法LinkedHashMap(initialCapacity,loadFactor,true).

    TreeMap在遍历排好顺序的键值时是最高效的。键值可以使用Comparable接口或Comparator接口类来排序。

    看个简单的案例理解一下:

    import java.util.HashMap;
    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.TreeMap;
    
    public class testMap {
        public static void main(String[] args) {
            //create a HashMap
            Map<String, Integer> hashMap = new HashMap<String,Integer>();
            hashMap.put("张三", 32);
            hashMap.put("李四", 21);
            hashMap.put("王五", 22);
            
            System.out.println("Display entries is HashMap");
            System.out.println(hashMap + "
    ");
            
            //create a TreeMap from the previous HashMap
            Map< String, Integer> treeMap = new TreeMap<String,Integer>(hashMap);
            System.out.println("Display entries in ascending order of key");
            System.out.println(treeMap);
            
            //create a LinkedHashMap
            Map<String, Integer> linkedHashMap = new LinkedHashMap<String,Integer>(15,0.75f,true);
            linkedHashMap.put("张三",31);
            linkedHashMap.put("李四",28);
            linkedHashMap.put("王五",29);
            linkedHashMap.put("赵六",29);
            
            //Display
            System.out.println("Display entries in LinkedHashMap");
            System.out.println(linkedHashMap);
            
        }
    }

    那么运行结果呢:

    Display entries is HashMap
    {张三=32, 李四=21, 王五=22}
    
    Display entries in ascending order of key
    {张三=32, 李四=21, 王五=22}
    Display entries in LinkedHashMap
    {张三=31, 李四=28, 王五=29, 赵六=29}

    HashMap的输出顺序是随机的,TreeMap中的条目是按键值的升序排列的,LinkedHashMap是按元素最后一次被访问的时间从早到晚排序的

    抓住当下,不浮流年!无知本无罪,罪在明知不足,而不肯去学习!!!
  • 相关阅读:
    winform 剔除空格与换行显示
    编码
    todo
    react高阶函数组件
    Docker-compose Setup for Self-hosting Development & Deployment Tools
    Self-hosting Sentry With Docker and Docker-compose
    how does Array.prototype.slice.call() work?
    todo reading
    a better git log
    https://coderwall.com/p/7smjkq/multiple-ssh-keys-for-different-accounts-on-github-or-gitlab
  • 原文地址:https://www.cnblogs.com/SamSarah/p/4893217.html
Copyright © 2011-2022 走看看