神奇小知识:Hashmap居然对key”排序“了?

Hashmap添加key值后在发现有顺序

今天刷题的过程中使用hashmap对一串英文字母和数字进行去重的过程中,发现hashmap的keyset值居然是有顺序的,神奇的发现让我觉得hashmap1.8之后还对key进行排序了?于是开启了验证之路。

首先,字符串数据如下:
在这里插入图片描述
将数据去重后,输出hashmap的ketset结果。
在这里插入图片描述
发现在数据中,插入顺序明明是7-6-3-9-4-0-1,结果缺是排序好的这一串数字。
并且英文字母 a-z 在插入时 b-a-c-z-m-s,输出结果也是排序好的。
实现代码如下:

import javax.xml.soap.Node;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

/**

  • Created by zgl on 2020/7/27.
    */
    public class LeetCode_38jianzhi {
    public static void main(String[] args){
    String s = “bbbbaaac77639401zms”;
    String s_1 = “0”;
    String s_2 = “1”;
    String s_3 = “9”;
    String s_4 = “5”;
    String s_5 = “16”;
    System.out.println(s_1.hashCode());
    System.out.println(s_2.hashCode());
    System.out.println(s_3.hashCode());
    System.out.println(s_4.hashCode());
    System.out.println(s_5.hashCode());
    char[] a = new char[20];
    for(int i = 0; i< s.length();i++){
    a[i] = s.charAt(i);
    }
    long [] a_hashcode = new long[20];
    // for(int i = 0 ; i< s.length();i++){
    // a_hashcode[i] = Arrays.toString(a[i]).hashCode();
    // }

     HashMap<Character,Character> hashMap = new HashMap<Character,Character>();
     HashMap<String,Character> hashMap_1 = new HashMap<String,Character>();
    
     Map.Entry mapentry;
     for(int i = 0; i< s.length(); i++){
         char c = s.charAt(i);
         if(hashMap.containsKey(c)){
             continue;
         }else {
             hashMap.put(s.charAt(i), '1');
    
         }
    
     }
     hashMap_1.put(s_1,'1');
     hashMap_1.put(s_2,'1');
     hashMap_1.put(s_3,'1');
     hashMap_1.put(s_4,'1');
     hashMap_1.put(s_5,'1');
    
    
     String s_srot = hashMap.keySet().toString();
     String s_ss = hashMap_1.keySet().toString();
     System.out.println(hashMap);
     System.out.println(s_srot);
    

// char[]
// Arrays.sort(s_srot);
}
}

通过验证发现,hashmap在存放Node数组的下标index 的计算是对key值得hashcode取模得到的,由于0-9的hashcode就是ASC码刚好是从48-57。所以在计算的时候数组下标时的顺序刚好满足0-9的先后顺序,因此将数字加入到hashmap的先后次序不影响数字在Node数组里面的位置。(故出现排序的效果)

在这里插入图片描述
在这里插入图片描述
经过发现大于10的数字计算hashcode就会不满足排序好的状态。上图是对比

顺便补一波源码:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
经过源码发现,hashmap的成员变量是实现map.entry接口的Node数组,执行put方法添加元素时使用的是putVal方法,该方法是根据计算的hash值作为数组的下标i的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值