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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)语法格式:row_number()over(partitionby分组列orderby排序列desc)row_number()over()分组排序功能:在使用row_number()over()函数时候,over()里头的分组以及排序的执行晚于where、groupby、orderby的执行。例一:表数据:createtableTEST_…

    2022年4月26日
    55
  • mybatis详解(全)「建议收藏」

    mybatis详解(全)「建议收藏」mybatis详解

    2022年10月6日
    3
  • WSGI、Flask及Werkzeug三者之间的关系

    WSGI、Flask及Werkzeug三者之间的关系目录一、WSGI是什么?二、Werkzeug是什么三、Flask的WSGI实现一、WSGI是什么?WSGI是一套接口规范。一个WSGI程序用以接受客户端请求,传递给应用,再返回服务器的响应给客户端。WSGI程序通常被定义成一个函数,当然你也可以使用类实例来实现。下图显示了python中客户端、服务器、WSGI、应用之间的关系:从下往上开始介绍:客户端:浏览器或者app。web服务器:Web服务器是指驻留于因特网上某种类型计算机的程序。当Web浏览器(客户端)连到服务.

    2022年9月28日
    2
  • 怎么完全卸载赛门铁克_如何干净彻底卸载有密码的诺顿symantec杀毒软件

    怎么完全卸载赛门铁克_如何干净彻底卸载有密码的诺顿symantec杀毒软件工具/原料注册表方法/步骤1:点击【开始】菜单,选择【运行】,或直接按【Window徽标键+R】方法/步骤2:输入【smc-stop】后打开程序界面,提示输入密码再打开注册表,按【Window徽标键+R】,然后输入【regedit】敲回车方法/步骤3:依次展开【HKEY_LOCAL_MACHINE\SOFTWARE\Symantec\SymantecEndpointProte…

    2022年6月10日
    96
  • 调幅收音机原理图及分析_调频调幅收音机区别

    调幅收音机原理图及分析_调频调幅收音机区别标题:致小白:详解调幅收音机的原理妈妈再也不用担心我不懂收音机啦!作者:Pleiades_Antares出品:BDF元培调查组北京市内包小组版权声明:本作系完全原创,他人不得在原作者不知

    2022年8月2日
    8
  • W3C网页标准_网页规范

    W3C网页标准_网页规范什么时W3C标准?网页的制作的主要标准是W3C制定的WEB技术标准,W3C:(worldwidewebconsortium)万维网联盟,万维网联盟创建于1994年,是web技术领域最具权威和影响力的国际中立性技术标准机构。WEB标准WEB标准不是某一个标准,而是一系列标准的集合。网页主要由三部分组成:结构(structure),表现(presentation)和行为(behavior)。对应的标准也分为三方面:结构化标准语言主要包7777777777777777777777777777777.

    2025年12月11日
    2

发表回复

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

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