zoukankan      html  css  js  c++  java
  • LinkedHashMap和hashMap和TreeMap的区别


    区别:

    • LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的。
    • HashMap无序;LinkedHashMap有序,可分为插入顺序和访问顺序两种。如果是访问顺序,那put和get操作已存在的Entry时,都会把Entry移动到双向链表的表尾(其实是先删除再插入)。
    • LinkedHashMap存取数据,还是跟HashMap一样使用的Entry[]的方式,双向链表只是为了保证顺序。
    • LinkedHashMap是线程不安全的。

    LinkedHashMap应用场景

    HashMap是无序的,当我们希望有顺序地去存储key-value时,就需要使用LinkedHashMap了。

    Map<String, String> hashMap = new HashMap<String, String>();
            hashMap.put("name1", "josan1");
            hashMap.put("name2", "josan2");
            hashMap.put("name3", "josan3");
            Set<Entry<String, String>> set = hashMap.entrySet();
            Iterator<Entry<String, String>> iterator = set.iterator();
            while(iterator.hasNext()) {
                Entry entry = iterator.next();
                String key = (String) entry.getKey();
                String value = (String) entry.getValue();
                System.out.println("key:" + key + ",value:" + value);
            }

     我们是按照xxx1、xxx2、xxx3的顺序插入的,但是输出结果并不是按照顺序的。

    同样的数据,我们再试试LinkedHashMap

    Map<String, String> linkedHashMap = new LinkedHashMap<>();
            linkedHashMap.put("name1", "josan1");
            linkedHashMap.put("name2", "josan2");
            linkedHashMap.put("name3", "josan3");
            Set<Entry<String, String>> set = linkedHashMap.entrySet();
            Iterator<Entry<String, String>> iterator = set.iterator();
            while(iterator.hasNext()) {
                Entry entry = iterator.next();
                String key = (String) entry.getKey();
                String value = (String) entry.getValue();
                System.out.println("key:" + key + ",value:" + value);
            }

     结果可知,LinkedHashMap是有序的,且默认为插入顺序。

    插入顺序和访问顺序。

    LinkedHashMap默认的构造参数是默认  插入顺序的,就是说你插入的是什么顺序,读出来的就是什么顺序,但是也有访问顺序,就是说你访问了一个key,这个key就跑到了最后面

    accessOrder为false按照的是插入顺序,accessOrder为true按照的是访问顺序
     
    1、插入顺序访问
     Map<String, String> linkedHashMap = new LinkedHashMap<>(16, 0.75f, false);
            linkedHashMap.put("name1", "josan1");
            linkedHashMap.put("name2", "josan2");
            linkedHashMap.put("name3", "josan3");
            System.out.println("开始时顺序:");
            Set<Map.Entry<String, String>> set = linkedHashMap.entrySet();
            Iterator<Map.Entry<String, String>> iterator = set.iterator();
            while(iterator.hasNext()) {
                Map.Entry entry = iterator.next();
                String key = (String) entry.getKey();
                String value = (String) entry.getValue();
                System.out.println("key:" + key + ",value:" + value);
            }
            System.out.println("通过get方法,导致key为name1对应的Entry到表尾");
            linkedHashMap.get("name1");
            Set<Map.Entry<String, String>> set2 = linkedHashMap.entrySet();
            Iterator<Map.Entry<String, String>> iterator2 = set2.iterator();
            while(iterator2.hasNext()) {
                Map.Entry entry = iterator2.next();
                String key = (String) entry.getKey();
                String value = (String) entry.getValue();
                System.out.println("key:" + key + ",value:" + value);
            }

     2、访问顺序访问

         第三个参数用于指定accessOrder值
            Map<String, String> linkedHashMap = new LinkedHashMap<>(16, 0.75f, true);
            linkedHashMap.put("name1", "josan1");
            linkedHashMap.put("name2", "josan2");
            linkedHashMap.put("name3", "josan3");
            System.out.println("开始时顺序:");
            Set<Entry<String, String>> set = linkedHashMap.entrySet();
            Iterator<Entry<String, String>> iterator = set.iterator();
            while(iterator.hasNext()) {
                Entry entry = iterator.next();
                String key = (String) entry.getKey();
                String value = (String) entry.getValue();
                System.out.println("key:" + key + ",value:" + value);
            }
            System.out.println("通过get方法,导致key为name1对应的Entry到表尾");
            linkedHashMap.get("name1");
            Set<Entry<String, String>> set2 = linkedHashMap.entrySet();
            Iterator<Entry<String, String>> iterator2 = set2.iterator();
            while(iterator2.hasNext()) {
                Entry entry = iterator2.next();
                String key = (String) entry.getKey();
                String value = (String) entry.getValue();
                System.out.println("key:" + key + ",value:" + value);
            }
    

     因为调用了get("name1")导致了name1对应的Entry移动到了最后,这里只要知道LinkedHashMap有插入顺序和访问顺序两种就可以

     TreeMap的用法(主要是排序)

    TreeMap中默认的排序为升序,如果要改变其排序可以自己写一个Comparator
    import java.util.Comparator;
    import java.util.Iterator;
    import java.util.Set;
    import java.util.TreeMap;
    
    
    public class Compare {
        public static void main(String[] args) {
            TreeMap<String,Integer> map = new TreeMap<String,Integer>(new xbComparator());
            map.put("key_1", 1);
            map.put("key_2", 2);
            map.put("key_3", 3);   
            Set<String> keys = map.keySet();
            Iterator<String> iter = keys.iterator();
            while(iter.hasNext())
            {
                    String key = iter.next();
                    System.out.println(" "+key+":"+map.get(key));
            }
        }
    }
    class xbComparator implements Comparator
    {
        public int compare(Object o1,Object o2)
        {
            String i1=(String)o1;
            String i2=(String)o2;
            return -i1.compareTo(i2);
        }
    }

  • 相关阅读:
    python小白-day9 数据库操作与Paramiko模块
    python小白-day8 线程、进程、协程
    python小白-day8 socketserver模块
    python小白-day7 socket初识
    python小白-day7 面向对象高级部分
    python小白-day6 xml处理模块
    python小白-day6 ConfigParser模块
    2020软件定义网络实验二
    软件工程实践第一次个人作业
    2020软件定义网络实验一
  • 原文地址:https://www.cnblogs.com/zouhong/p/13533881.html
Copyright © 2011-2022 走看看