• 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);
        }
    }
    复制代码

  • 相关阅读:
    APMServ5.2.6 无法启动Apache的一个问题
    【转】流媒体技术笔记(视频编码相关)
    用APMServ一键快速搭建Apache+PHP+MySQL+Nginx+Memcached+ASP运行平台
    java swing 基础
    python class 类
    python 经验
    python 导入(转)
    kernel ipv4/ip_output.c
    python+正则表达式(转)
    Eclipse中如何快速添加、删除jar包
  • 原文地址:https://www.cnblogs.com/zhuyeshen/p/12526361.html
Copyright © 2020-2023  润新知