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的。