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,表示不是访问顺序而是插入顺序存储的,这也是默认值,表示LinkedHashMap中存储的顺序是按照调用put方法插入的顺序进行排序的。LinkedHashMap也提供了可以设置accessOrder的构造方法,我们来看看这种模式下,它的顺序有什么特点?
    复制代码
            // 第三个参数用于指定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);
        }
    }
    复制代码

  • 相关阅读:
    linux-cp
    linux-rmdir
    linux-tail
    linux-head
    linux 重定向
    hadoop环境安装及错误总结
    vim 图册
    为什么可以这么快! awk 与python的应用
    八大排序算法的 Python 实现
    linux的文件隐藏属性 chattr lsattr
  • 原文地址:https://www.cnblogs.com/zhuyeshen/p/12526361.html
Copyright © 2011-2022 走看看