4个主要的map实现类介绍

4个主要的map实现类介绍一、简单介绍map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。其中这四者的区别如下(简单介绍):HashMap:我们最常用的Map,HashMap的值是没有顺序的,他是按照key的HashCode来实现的,就是根据key的HashCode值来存储数据,根据key可以直接获取它的Value,同时它具有很快的访问…

大家好,又见面了,我是你们的朋友全栈君。

一、简单介绍

map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。其中这四者的区别如下(简单介绍):

HashMap:我们最常用的Map,HashMap的值是没有顺序的,他是按照key的HashCode来实现的,就是根据key的HashCode 值来存储数据,根据key可以直接获取它的Value,同时它具有很快的访问速度。HashMap最多只允许一条记录的key值为Null(多条会覆盖);允许多条记录的Value为 Null。非同步的。

TreeMap: 能够把它保存的记录根据key排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。

Hashtable: 与 HashMap类似,不同的是:key和value的值均不允许为null;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢,只有hashtable是继承自Dictionary抽象类的,hashMap和treeMap都继承自AbstractMap抽象类,LinkedHashMap继承自hashMap。

LinkedHashMap: 保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空,非同步的。

一些常识:

1.Collection与Map集合是不是继承自Object?–不是,两个都是接口,Object是类,怎么可能会继承自Object,详细看java.util下的具体接口。

二、Map排序

TreeMap

TreeMap默认是升序的,如果我们需要改变排序方式,则需要使用比较器:Comparator。

Comparator可以对集合对象或者数组进行排序的比较器接口,实现该接口的public compare(T o1,To2)方法即可实现排序,该方法主要是根据第一个参数o1,小于、等于或者大于o2分别返回负整数、0或者正整数。如下:

 

复制代码代码如下:

public class TreeMapTest {

    public static void main(String[] args) {

        Map<String, String> map = new TreeMap<String, String>(
                new Comparator<String>() {

                    public int compare(String obj1, String obj2) {

                        // 降序排序
                        return obj2.compareTo(obj1);
                    }
                });
        map.put(“c”, “ccccc”);
        map.put(“a”, “aaaaa”);
        map.put(“b”, “bbbbb”);
        map.put(“d”, “ddddd”);

        Set<String> keySet = map.keySet();
        Iterator<String> iter = keySet.iterator();
        while (iter.hasNext()) {

            String key = iter.next();
            System.out.println(key + “:” + map.get(key));
        }
    }
}

 

运行结果如下:

d:ddddd 
c:ccccc 
b:bbbbb 
a:aaaaa

上面例子是对根据TreeMap的key值来进行排序的,但是有时我们需要根据TreeMap的value来进行排序。对value排序我们就需要借助于Collections的sort(List<T> list, Comparator<? super T> c)方法,该方法根据指定比较器产生的顺序对指定列表进行排序。但是有一个前提条件,那就是所有的元素都必须能够根据所提供的比较器来进行比较。如下:

 

复制代码代码如下:

public class TreeMapTest {

    public static void main(String[] args) {

        Map<String, String> map = new TreeMap<String, String>();
        map.put(“d”, “ddddd”);
        map.put(“b”, “bbbbb”);
        map.put(“a”, “aaaaa”);
        map.put(“c”, “ccccc”);

        //这里将map.entrySet()转换成list
        List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
        //然后通过比较器来实现排序
        Collections.sort(list,new Comparator<Map.Entry<String,String>>() {

            //升序排序
            public int compare(Entry<String, String> o1,
                    Entry<String, String> o2) {

                return o1.getValue().compareTo(o2.getValue());
            }

        });

        for(Map.Entry<String,String> mapping:list){ 
               System.out.println(mapping.getKey()+”:”+mapping.getValue()); 
          } 
    }
}

 

运行结果

a:aaaaa 
b:bbbbb 
c:ccccc 
d:ddddd

HashMap

我们都是HashMap的值是没有顺序的,他是按照key的HashCode来实现的。对于这个无序的HashMap我们要怎么来实现排序呢?参照TreeMap的value排序,我们一样的也可以实现HashMap的排序。

 

复制代码代码如下:

public class HashMapTest {

    public static void main(String[] args) {

        Map<String, String> map = new HashMap<String, String>();
        map.put(“c”, “ccccc”);
        map.put(“a”, “aaaaa”);
        map.put(“b”, “bbbbb”);
        map.put(“d”, “ddddd”);

        List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
        Collections.sort(list,new Comparator<Map.Entry<String,String>>() {

            //升序排序
            public int compare(Entry<String, String> o1,
                    Entry<String, String> o2) {

                return o1.getValue().compareTo(o2.getValue());
            }

        });

        for(Map.Entry<String,String> mapping:list){ 
               System.out.println(mapping.getKey()+”:”+mapping.getValue()); 
          } 
     }
}

 

运行结果

a:aaaaa 
b:bbbbb 
c:ccccc 
d:ddddd

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139048.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • restful 幂等性(什么是幂次法则)

    理解RESTful的幂等性,并且设计符合幂等规范的高质量RESTfulAPI。怎么理解幂等性HTTP幂等方法,是指无论调用多少次都不会有不同结果的HTTP方法。不管你调用一次,还是调用一百次,一千次,结果都是相同的。还是以之前的博文的例子为例。【GET】/users#查询用户信息列表【GET】/users/1…

    2022年4月10日
  • centos系统安装git

    centos系统安装gitcentos安装git

    2022年11月1日
  • pycharm 开启代码提示[通俗易懂]

    pycharm 开启代码提示[通俗易懂]1、先打开pycharm2、依次选择红框部分3、搞好之后,代码提示便可以使用了

    2022年8月26日
  • python pyc文件解析_pyc文件

    python pyc文件解析_pyc文件codeobject¶在我们导入python脚本时在目录下会生成个一个相应的pyc文件,是pythoncodeobj的持久化储存形式,加速下一次的装载。文件结构¶pyc文件由三大部分组成最开始4个字节是一个Maigcint,标识此pyc的版本信息接下来四个字节还是个int,是pyc产生的时间序列化的PyCodeObject,结构参照include/code.h,序列化方法pyth…

    2022年6月29日
  • dirsearch讲解_中国指南网

    dirsearch讲解_中国指南网获取更多学习资料、想加入社群、深入学习,请扫我的二维码或加Memory20000427。在本文中,我们将学习如何使用Dirsearch。说起国内的御剑套装,相信各位都已经非常熟悉了。但御剑已经好多年不更新了,而且需要windows,有时候线程设置大了点,扫了半天中途还可能卡住不动了,也没有实时的数据保存,前功尽弃。总之各种不爽。现在好用的webscanner也层出不穷,我根据自己的需求和实际使用体验,最终选择了dirsearch这款工具。基本情况它是一个命令行工具,旨在暴力激活成功教程网站中的目录和

    2022年9月28日
  • win10命令行强制删除文件_win10cmd强制删除文件夹

    win10命令行强制删除文件_win10cmd强制删除文件夹提醒:以下方法文件永久删除,常规方法无法恢复,慎用,慎用,慎用针对电脑中不知什么软件生成的无用文件,使用修改文件夹属性的可视化方法,试过多次都没有成功,后通过执行命令行删除文件。步骤如下:(1)

    2022年8月1日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号