引用:https://blog.csdn.net/w2393040183/article/details/78092318

常用的Map有4种:分别是HashMap,TreeMap,Hashtable和LinkedHashMap等。下面是简单的介绍:

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

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

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

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

Tree默认按升序排序,要实现自定义排序需要实现Comparator接口。代码如下:

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));}}

这里的compareTo方法,查看源码是:

public int compareTo(String anotherString) {int len1 = value.length;int len2 = anotherString.value.length;int lim = Math.min(len1, len2);char v1[] = value;char v2[] = anotherString.value;int k = 0;while (k < lim) {char c1 = v1[k];char c2 = v2[k];if (c1 != c2) {return c1 - c2;}k++;}return len1 - len2;}

该方法,具体效果如下  来自:https://blog.csdn.net/qq_34115598/article/details/79892478

长度短的与长度长的字符一样,则返回的结果是两个长度相减的值(len1-len2):

a="hello";
b="hell";
num=1;
或者
a="h";
b="hello";
num=-4;

2)长度不一样且前几个字符也不一样,从第一位开始找,当找到不一样的字符时,则返回的值是这两个字符比较的值(c1-c2,ascii码相减)

a="assdf";
b="bdd";

num=-1;

2.当两个比较的字符串是英文且长度相等时,

1)一个字符

a="a";   //97
b="b";   //98
num=-1;

2)多个字符,第一个字符不同则直接比较第一个字符
a="ah";    //a=97
b="eg";    //e=101
num=-4

3)多个字符,第一个字符相同则直接比较第二个字符,以此类推

a="ae";   //e=101
b="aa";   //a=97
num=4;

所以该比较器如果将obj1和obj倒过来,会导致原值变成原来的相反数,所以源码里若颠倒,则又变为升序排序。需要注意的是,这样子实现的排序是根据key的值来进行排序的,如果要根据Value值进行排序,需要借助于Collections的sort(List<T> list, Comparator<? super T> c)方法,该方法根据指定比较器产生的顺序对指定列表进行排序。但是有一个前提条件,那就是所有的元素都必须能够根据所提供的比较器来进行比较。代码如下:

public static void main(String[] args) {Map<String, String> map = new TreeMap<String, String>();map.put("2", "ddddd");map.put("12", "bbbbb");map.put("13", "aaaaa");map.put("33", "ccccc");//这里将map.entrySet()转换成listList<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(Map.Entry<String, String> o1,Map.Entry<String, String> o2) {return o1.getValue().compareTo(o2.getValue());}});for(Map.Entry<String,String> mapping:list){System.out.println(mapping.getKey()+":"+mapping.getValue());}}

结果如下:

13:aaaaa
12:bbbbb
33:ccccc
2:ddddd    可以看到是按value进行了排序。

转载于:https://www.cnblogs.com/MYoda/p/11152213.html

关于java集合框架(三):Map概述与TreeMap相关推荐

  1. java集合课程,I学霸官方免费课程三十三:Java集合框架之Map集合

    I学霸官方免费教程三十三:Java集合框架之Map集合 Map接口 Map集合采用键值对(key-value)的方式存储数据,其中键不可以重复.值可以重复. 常用类有HashMap.TreeMap和P ...

  2. Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  3. Java集合查找Map,Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  4. [javaSE] 集合框架(Map概述)

    Map集合,将key对象映射到value对象 三个主要的子类:Hashtable,HashMap,TreeMap Hashtable:底层是哈希表数据结构,不允许使用null值,线程同步 HashMa ...

  5. (Java集合框架)Map集合

    Map集合 概述 现实生活中,常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系的对象 ...

  6. java集合框架07——Map架构与源代码分析

    前几节我们对Collection以及Collection中的List部分进行了分析,Collection中还有个Set,因为Set是基于Map实现的,所以这里我们先分析Map,后面章节再继续学习Set ...

  7. Java集合框架List,Map,Set等全面介绍

    Java Collections Framework是Java提供的对集合进行定义,操作,和管理的包含一组接口,类的体系结构. Java集合框架的基本接口/类层次结构: java.util.Colle ...

  8. Java OOP 7 JAVA 集合框架

    Java OOP 第七章 JAVA 集合框架 文章目录 Java OOP 第七章 JAVA 集合框架 一.学习目标 二.数组存在的缺陷 三.Java集合框架 四.Collection接口 五.Coll ...

  9. 史上最全的集合框架讲解 ----- Java 集合框架(3)---- Map 相关类最全解析

    引言 好了,步入正题,上篇文章Java 集合框架(2)---- List 相关类解析中我们一起看了一下 List 接口的相关具体类(ArrayList.LinkedList-.),这篇开始我们开始探索 ...

  10. Java 集合框架(5)---- Map 相关类解析(中)

    本文标题大纲: 文章目录 前言 HashMap TreeMap 指定 TreeMap 的元素排序方式 前言 还是先上那张图吧,我又偷懒了,还是只关注 Map 接口下的类就行了: 在上上篇文章中我们一起 ...

最新文章

  1. 你需要掌握的三种编程语言
  2. 【Python-ML】SKlearn库性能指标-混淆矩阵和F1
  3. Java后端返回通用接口设计
  4. 做百度AI工程师,还要会“相牛”?
  5. ubuntu 开启 apache mod_rewrite
  6. windows命令提示符_如何个性化Windows命令提示符
  7. Python基础(二)--数据类型,运算符与流程控制
  8. EdgeRoutine技术专家教你把JS代码跑到CDN边缘
  9. python学习之random
  10. 朗锐智科发布PCIe-3504PoE 千兆以太网图像采集卡
  11. GitOps—通过CI/CD自动化构建虚拟机模版
  12. mongodbVUE基本操作(转)
  13. 圣杯布局(三栏布局)
  14. Markdown初使用
  15. GTC '19 经典回顾 | 如何编排和创造二次元中的舞蹈?
  16. 群晖域名解析出现错误?别慌,排查原因有步骤
  17. 用邮件联系导师有哪些注意事项需要关注呢?如何选择适合自己的导师呢?
  18. 剑指offer 青蛙跳楼梯
  19. 如何把meshlab中的圆环去掉_MeshLab中插件的添加过程
  20. oracle 速度最快 驱动,c# – Oracle ODP.NET托管驱动程序在64位运行速度比在32位运行速度慢50-100%...

热门文章

  1. MyBatis的入门知识
  2. BugkuCTF多种方法解决
  3. Java的知识点22——时间处理相关类、Date时间类(java.util.Date)、DateFormat类和SimpleDateFormat类、Calendar日历类
  4. CTFshow php特性 web130
  5. 编程艺术 二进制中1的个数
  6. OpenCV基本绘图
  7. calcBackProject函数(搜索小物体的位置)
  8. springboot配置html资源路径,SpringBoot普通.html文件视图配置
  9. collections python_python: collections
  10. 【三种可能问题】RuntimeError: cuDNN error: CUDNN_STATUS_NOT_SUPPORTED