如何实现Java中hashmap的value值是对象的时候的排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现Java中hashmap的value值是对象的时候的排序相关的知识,希望对你有一定的参考价值。

各位大虾,我的想法是可不可以将hashmap中的value值导出到List集合中,然后再利用Collections.sort()实现排序功能
那要如何将value值导出到List集合中啊

导出到list集合还不简单:
HashMap<Key,Value> hashMap=new HashMap<Key,Value>();
Collection<Value> values=hashMap.values();
List<Value> list=new ArrayLIst<Value>(values);
这不就导出来了么。(Key和Value是类型,比如String,Integer,Boolean等等。)

===============================
当然可以,要实现排序有两种方法:
1.值对象实现Comparable接口,2.传递参数Comparator实例。
首先拿出你的所有Values:
HashMap<Key,Value> hashMap=new HashMap<Key,Value>();
Collection<Value> values=hashMap.values();
然后说第一种方法:
假设你的值对象都实现了Comparable接口:
class Value implements Comparable<Value>
...
public int compareTo(Value v)...
...

这很方便了,使用Collection.sort(values);就OK!
说第二种,这一种很灵活,可以适应一个对象进行不同的比较。
这种方法需要你实现Comparator接口:
class MyComparator implements Comparator<Value>
...
public int compare(Value v1,Value v2)...
...

再说一下返回值的问题。你一定注意到了compare和compareTo方法都有一个int的返回值,如果返回一个负数就是说被比较数要小于比较数,这样就达到了比较的目的。So easy~~
参考技术A HashMap hm=new HashMap()
hm.put("A",1);
hm.put("B",2);
hm.put("C",3);
就是这样使用,怎么还要排序呢 ?
参考技术B 建议你可以去成都盛课盟IT培训学校看看撒,他们那里的老师全是专业的软件工程师,有着丰富的工作经验和教学经验的。平时的练习跟着项目走的哈。而且现在男孩子学习java挺不错的哈,就业率高,发展空间又大。盛课盟就会无限制的为你推荐工作的哈。就在新南门致民路36号锦江新园1801这里哈。 参考技术C 比较对象要实现比较借口,叫什么Compartor,就可以直接比较了。

HashMap浅析

记得点小蓝字关注 我们

HashMap比较常用,但是具体是如何实现的,通过学习底层逻辑有了一定的了解,主要是由数组和链表实现,在这里针对HashMap做个浅析。 
结构:

上图粗略的说明HashMap中的数组,而每个数组里边是一个链表即Entry,包括:key、value、next、hash。
几个主要参数:


  1. threshold:阀值是表示达到该值时需要扩容;

  2. loadFactor:扩容因子用于计划阀值,默认是0.75;

  3. capacity:数组容量,始终是2^n。

put过程浅析

HashMap浅析

1、首先是table(实际上是一个Entry)为空时初始化数组大小inflateTable

HashMap浅析

2、计算数组下标,就是hash值与数组大小的&运算,代码很简单

HashMap浅析

3、添加到链表中addEntry

HashMap浅析

添加到链表中的操作会对现有数组大小及查询数组下标位置是否有值,同时满足则会扩容并计算新的hash和数组下标,然后再放到新的数组中。
4、数组扩容resize,将当前数组长度*2

HashMap浅析

5、放到新数组中createEntry

HashMap浅析

创建实体链表new Entry,是将新值放到链表的表头。

get过程浅析

相比较put,get就比较简单了

HashMap浅析

构造方法

拿默认方式new HashMap()进行解析。

HashMap浅析

直接调用有参构造均采用默认值。

总结

put操作主要有:
1、初始化数组及阀值;
2、计算hash值及数组下标;
3、判断数组下标位置是否存在key,若存在则新值覆盖旧值并返回旧值;
4、是否需要扩容,若扩容重新计算threshold阀值,hash值,新的数组下标;
5、若不需要扩容且不存在key则在相应数组下标位置将数据放到链表的表头;

get操作主要有:
1、计算hash值及下标;
2、找到数组下标位置,根据hash值和key遍历链表;

以上是关于如何实现Java中hashmap的value值是对象的时候的排序的主要内容,如果未能解决你的问题,请参考以下文章

HashMap浅析

HashMap的内部实现机制,Hash是怎样实现的,什么时候ReHash

java 中如何遍历hashMap的key所对应的value?

hashmap 中 hash 函数怎么是是实现的?还都有哪些 hash 的实现方式

HashMap实现原理

Java复习-hashmap和weakhashmap