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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 《手把手教你学DSP》总结1

    《手把手教你学DSP》总结11.开始学习时不要纠结DSP的具体结构,大体了解有哪些功能模块即可,DSP的工作原理不是重点,在后期使用时再详细弄懂所需结构的详情2.C2000系列即TMS320C2000包括F24XX,C28XX,F28XX为低端型号,C5000系列面向低功耗,C6000系列面向高性能3.TI的DSP型号含义例如:TMS320F2812PGFA  例如:TMS320F2812PGFA

  • 大数据的两种处理方式是什么_大数据的基本处理模式

    大数据的两种处理方式是什么_大数据的基本处理模式大数据的处理方式有两种:基于内存的流式处理和基于硬盘的存储处理。流式处理就好象是在经过的数据面前建一道水闸。数据流过这里,经过闸门的时候,就进行筛选过滤,分析出有价值的内容,然后丢弃,以后也不再使用

  • ftp客户端发起对ftp服务器_ftp登陆命令

    ftp客户端发起对ftp服务器_ftp登陆命令FTP是一个C/S类型的软件,连接服务端需要FTP客户端才能完成,常见的FTP客户端有以下几种:浏览器:可以通过浏览器中输入ftp://ip或者ftp://域名的方式3分钟了解计算机发展历史-组团学来访问FTP自带客户端:命令行下可以使用ftp命令去连接三方客户端:FileZilla8uftp图形软件或者文本界面的lftp等三种方式中,文本界面是比较麻烦的,无法鼠标流。所以我重点给大家讲解一…

    2022年10月21日
  • eclipse怎么配置svn插件_dip插件有哪几种

    eclipse怎么配置svn插件_dip插件有哪几种Eclipse安装插件的几种方法(eclipse安装SVN插件)在这里啰嗦一句,其实更新的版本mar2更好用。但是由于在低电压版的本本上,mar2跑不起来,经常假死,kepler可以很流畅。 so,如果为了携带了轻便低电压版CPU的本本,mar2跑不起来,就用kepler吧。以Eclipse(Kepler)安装SVN插件为例,记录eclipse安装插件的几种方法。 1eclipsemarket…

    2022年10月10日
  • xmlns属性

    xmlns属性今天在看网上其他的项目,发现有一行代码我不明白意思:百度之后,才知道,这是一个属性。在XHTML中,xmlns属性是必需的。在HTML中,xmlns属性是无效的。xmlns属性规定文档的xml命名空间。然而,如果在XHTML文档中未使用xmlns, http://w3.org 的HTML验证器也能正确识别文档。这是因为命名空间”xmln

    2022年10月23日
  • 将原字符串(自定义)按字符的ASCII 码值顺序排序后输出_字符串逆序输出java

    将原字符串(自定义)按字符的ASCII 码值顺序排序后输出_字符串逆序输出java将string的各个字符按照ASCII排序后,重新生成一个string的代码

发表回复

您的电子邮箱地址不会被公开。

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