刚学java不久

之前在学习hashmap的时候

无意间发现,诶?怎么结果是排序的,然后重新输入了好多次,握草,原来java 1.8都实现了hashmap的排序

天真的我没有去网上查,没有去想java collections的框架,就本真的想,hashmap真厉害

要不是今天无意间翻起,可能之后会一直按照它是排序的来用......

首先从框架角度,它是继承自abstractmap,实现了map,Cloneable, Serializable等接口,显然本身是不会对数据排序

然后在看过源码之后,这个是put调用的代码,

 final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
Node<K,V>[] tab; Node<K,V> p; int n, i;
if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).length;
if ((p = tab[i = (n - 1) & hash]) == null)//根据hash值判断是否可以直接插入
tab[i] = newNode(hash, key, value, null);
else {//如果已经有对象在此存放
Node<K,V> e; K k;
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k)))) //如果插入key与原来的key相同,当然hash值也相同,覆盖
e = p;
else if (p instanceof TreeNode)
e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
else { //key不同,但是hash值相同的对象
for (int binCount = 0; ; ++binCount) {
if ((e = p.next) == null) {
p.next = newNode(hash, key, value, null);
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
treeifyBin(tab, hash);
break;
}
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;
}
}
if (e != null) { // existing mapping for key
V oldValue = e.value;
if (!onlyIfAbsent || oldValue == null)
e.value = value;
afterNodeAccess(e);
return oldValue;
}
}
++modCount;
if (++size > threshold)
resize();
afterNodeInsertion(evict);
return null;
}

对代码看的不太仔细,但是肯定是没有排序代码的

然后想了想自己之前为什么会误以为排序的呢

看数据

 HashMap hm = new HashMap();
hm.put(5, "five");
hm.put(4, "one");
hm.put(1, "two");
hm.put(6, "zero");

......

然后再联想put的代码,然后hash的代码

 public V put(K key, V value) {
  return putVal(hash(key), key, value, false, true);
}
 static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

hashcode方法的代码,对应于每一个类,实现不同,这儿就用Integer

  public int hashCode() {
return Integer.hashCode(value);
} public static int hashCode(int value) {
return value;
}

可以看到,直接返回int值

然后hash函数内,假设key!=null,那么返回值就等于h^(h>>>16)       //这个>>>的意思应该是h/(Math.pow(2,16))    //补充,刚看到,>>>是无符号右移,这样好理解

那么,返回值就是 h与h/65536的异或了

所以,在integer对象为key的情况下,只要输入值小于65536,hash值都是integer本身数值,而hash值对应于table数组中的位置

所以在table数组中,是排序的……

当然,hashmap也是可以排序的

将它的entryset加入list对象

然后调用collections.sort即可,不过需要重写sort方法,代码如下(网上查的),hm是hashmap对象

 //实现排序/*5*/
/*List<Map.Entry<Integer, String>> lt = new ArrayList<Entry<Integer, String>>(hm.entrySet());
System.out.println(lt.get(0));
Collections.sort(lt, new Comparator<Map.Entry<Integer, String>>()
{
@Override
public int compare(Map.Entry<Integer,String> o1, Map.Entry<Integer,String> o2) {
//return (o2.getValue() - o1.getValue());
return (o1.getKey()).compareTo(o2.getKey());
}
});*/

还有

看hash函数的时候,也验证了,hashmap的key值是允许为空的,默认当作0来处理

区别于hashtable

有点乱……

不过想想是自己的第一篇博客,满意了

加油

关于hashmap的排序的更多相关文章

  1. 如何对一个不断更新的HashMap进行排序

    如何对一个不断更新的HashMap进行排序? 解答:等到HashMap更新稳定后,用ArrayList包装进行排序.或者自己写一个可以类似HashMap的有序Map,每次更新的时候都进行排序,构建自己 ...

  2. HashMap按键排序和按值排序

    对map集合进行排序   今天做统计时需要对X轴的地区按照地区代码(areaCode)进行排序,由于在构建XMLData使用的map来进行数据统计的,所以在统计过程中就需要对map进行排序. 一.简单 ...

  3. TreeMap/LinkedHashMap/HashMap按键排序和按值排序

    今天做统计时需要对X轴的地区按照地区代码(areaCode)进行排序,由于在构建XMLData使用的map来进行数据统计的,所以在统计过程中就需要对map进行排序. 一.简单介绍Map 在讲解Map排 ...

  4. Java List/HashSet/HashMap的排序

    在对Java无序类集合,如List(ArrayList/LinkedList).HashSet(TreeSet有序).HashMap等排序时,Java中一个公共的类Collections,提供了对Ja ...

  5. 对HashMap进行排序

    首先来看看Map集合获取元素的三种常见方法keySet().values().entrySet() 1. values():返回map集合的所有value的Collection集合(于集合中无序存放) ...

  6. java中hashMap的排序

    hashMap排序,示例: private void test(){ Map<String, List<String>> unSupportedDatesMap=new Has ...

  7. Java HashMap 默认排序

    先看一段Java代码. package com.m58.test; import java.text.ParseException; import java.text.SimpleDateFormat ...

  8. java 中对hashmap进行排序

    public class HashMapSort { public static void main(String[] args) { HashMap<Integer, Student> ...

  9. HashMap集合排序方法

    首先我们先来看看Map集合获取元素的三种常见方法(1)entrySet(),(2)keySet(),(3)values() 1. entrySet():(1)先返回map集合的所有"映射&q ...

随机推荐

  1. java读取pdf总结

    第三方软件 1.pdfbox PDFBox 0.7.3.PDFBox是一个开源的对pdf文件进行操作的库. PDFBox-0.7.3.jar加入classpath.同时FontBox1.0.jar加入 ...

  2. 在Github上搭建博客

    貌似还是这个链接最靠谱呀 http://my.oschina.net/nark/blog/116299   如何利用github建立个人博客:之一 在线编辑器http://markable.in/ed ...

  3. A TLS packet with unexpected length was received 解决方法

    参考:A TLS packet with unexpected length was received. 系统环境 主系统 OS X,虚拟机 Ubuntu 14.04 64bit. 问题描述 在git ...

  4. C++函数的返回值——返回引用类型&非引用类型

    函数的返回主要分为以下几种情况: 1.主函数main的返回值: 允许主函数main没有返回值就可结束:可将主函数main返回的值视为状态指示器,返回0表示程序运行成功,其他大部分返回值则表示失败. 2 ...

  5. UVa 10054 项链(欧拉回路)

    https://vjudge.net/problem/UVA-10054 题意:有一种由彩色珠子连接成的项链.每个珠子的两半由不同颜色组成.相邻两个珠子在接触的地方颜色相同.现在有一些零碎的珠子,需要 ...

  6. 前端工程化 - npm

    什么是npm npm的全称Node Package Manager,npm原先只是作为nodejs的包管理工具,然而随着前端社区的发展,如今npm不仅是nodejs的包管理工具,还是前端js的包管理工 ...

  7. SpringBoot.资料

    1.du 搜 "springboot 视频" 2.SpringBoot视频教程_哔哩哔哩 (゜-゜)つロ 干杯_-bilibili.html(https://www.bilibil ...

  8. RabbitMQ入门_03_推拉模式

    我们知道,消费者有两种方式从消息中间件获取消息: 推模式:消息中间件主动将消息推送给消费者 拉模式:消费者主动从消息中间件拉取消息 推模式将消息提前推送给消费者,消费者必须设置一个缓冲区缓存这些消息. ...

  9. EVEREST Ultimate Edition 5.50 正式版 序列号

    EVEREST Ultimate Edition 5.50 正式版 序列号 EVEREST 5.5 Final 序列号 注册码 搜集到的EVEREST最新的5.5版本的序列号 序列号: C4J1IPH ...

  10. <<网络是怎样连接的>>笔记第2章用电信号传输Tcp/ip数据

    创建套接字: 协议栈的内部结构.套接字的实体,以及创建套接字的操作过程 连接服务器: “连接”具体是进行怎样的操作,在这个过程中协议栈到底是如何工作的, 以及客户端和服务器是如何进行交互的. 收发数据 ...