4个主要的map实现类介绍

技术标签: java  java之路  

一、简单介绍

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yjclsx/article/details/50975914

智能推荐

[codeforces] C. Jamie and Interesting Graph_jing16337305的博客-程序员宝宝

题目:C. Jamie and Interesting Graphtime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputJamie has recently found undirected weighted graphs with the foll...

(Copynet)Incorporating Copying Mechanism in Sequence-to-Sequence Learning论文笔记_彭伟_02的博客-程序员宝宝

《Incorporating Copying Mechanism in Sequence-to-Sequence Learning》引言最近看了一下CopyNet,感觉此网络也是比较玄学,它能够自动的,决定下一步的预测是生成模式还是复制模式。生成模式就是我们常说的注意力机制,复制模式就是这篇文章的一个创新点。他的想法是来源于,人类在阅读文章的时候,或者去做一些摘要的时候,除了自己会生成一些概...

「职业解读」软件测试工程师_软件测试小小白的博客-程序员宝宝

可能大家很多人不知道软件测试是干嘛的,可能有些听过的不会就是这里点点那里点点吗?今天,带大家详细地了解一下软件测试工程师这个职业01职业内涵测试开发工程师,是指测试开发出来的项目,并且日常会编写测试过程中的工具,减少测试重复性。软件测试工程师(SoftwareTestingEngineer)指理解产品的功能要求,并对其进行测试,检查软件有没有错误(Bug),测试软件是否具有稳定性(Robustness),写出相应的测试规范和测试用例的专门工作人员。简而言之,软件测试工程师在一家软件.

javascript 三大特性,offset、client、scroll。_N00BDream的博客-程序员宝宝

offsetwidth : border + padding + 内容offsetHright:border + padding + 内容offsetLeft:   盒子到最近定位父元素的距离offsetTop: 盒子到最近定位父元素的距离cline 系列,在事件对象 e.clineX......是翻译成可视区。但是针对某个元素 ,即便已经滚到页面以上,看不见的地方。         它的clin...

Tomcat学习之Acceptor_chungle2011的博客-程序员宝宝

http://blog.csdn.net/aesop_wubo/article/details/7627772简介Acceptor顾名思义就是接收器,用于接收用户请求,这节主要是分析Acceptor的启动和处理请求!首先来看Acceptor的类图从图中可以看出Acceptor实现了Runnable接口,可以作为一个线程启动,且都是Endpoint的内部类

排序:1.在O(n log n)的时间内使用常数级空间复杂度对链表进行排序,归并排序_全国各地的博客-程序员宝宝

法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) 空间复杂度 稳定性 复杂性 直接插入排序 O(n2)O(n2) O(n2)O(n2) O(n)O(n) O(1)O(1) 稳定 简单 ...

随便推点

var js=function(){}和function js(){}的区别_一条宝鱼的博客-程序员宝宝

在Javascript中,函数及变量的声明都将被提升到函数的最顶部,也就是说我们可以先使用后声明,但函数表达式和变量表达式只是将函数或者变量的声明提升到函数顶部,函数表达式和变量的初始化将不被提升var js=function(){} 这种叫做函数表达式 必须先定义后使用function js(){}这种是函数声明 可以先使用后定义 它会对函数的声明进行一个提升举个例子 1...

Filter过滤器是什么?_冷子轩的博客-程序员宝宝_filter过滤器有什么用

1.whatfilter过滤器的作用:拦截请求2.why网页上的某些操作或数据只有用户登录之后才能访问,用filter来过滤掉未登录的用户,只让已经登录的用户继续访问3.for利于数据的管理4.codepublic class ManagerFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { }

spark环境搭建_chouzhuicong6138的博客-程序员宝宝

一。 安装前配置 java环境,一般linux中都有 hadoop环境 python环境,一般linux中会默认安装 scala环境,需要下载 spark 软件,需要下载 二。 scala安装配置 下载scala压缩包 sudo tar -zxv...

btrace进行性能测试_chiweitree的博客-程序员宝宝

使用BTrace 做性能测试在官网https://kenai.com/projects/btrace/downloads/directory/releases/release-1.2.4下载对应的jar包 测试时后,将btrace测试类和被测试类放在同一个机器上 将btrace测试类写好,放在btrace解压的bin目录下调用如下命令进行测试 sh btrace

linux 常用操作命令_清晨细雨~的博客-程序员宝宝

目录1.查看磁盘空间2. 查看占用端口3.清理内存4.执行文件授权5.文件内特殊字符搜索6.启动jar标准输出1.查看磁盘空间#指定目录下一级目录磁盘空间du -h --max-depth=1 /home/dmin#查找大于100M文件find / -type f -size +100M2. 查看占用端口netstat-apn...

qwt6.1.2静态编译_yuzeze的博客-程序员宝宝

qwt静态编译需要用到静态的qt1. 打开qwt目录下的qwtconfig.pri文件;2. 将第27行[cpp] view plain copyQWT_INSTALL_PREFIX    = C:/Qwt-$$QWT_VERSION  改为[cpp] view plain copy