(JAVA)HashSet里面保存的数据怎么变成有顺序的了?

发布于 2022-01-05 09:00:08 字数 1478 浏览 773 评论 12

@tcxu 你好,想跟你请教个问题:

package jiu;
/**
 *@ClassName  HashSetDemo
 *
 * @Description 测试HashMapSet集合类
 *
 * @date  2014-3-3  上午8:45:26
 * 
 */

import java.util.HashSet;

public class HashSetDemo {
    public static void main(String args[]) {
        // 创建HashSet对象
        HashSet<String> hs = new HashSet<String>();
        // 加入元素到HastSet中
        hs.add("B");
        hs.add("A");
        hs.add("D");
        hs.add("E");
        hs.add("C");
        hs.add("F");
        System.out.println(hs);
    }
}

不是说HashSet是无序的吗?怎么输出结果却有序了?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(12

笑红尘 2022-01-08 05:32:21

我记得现在jdk8 版本的hashSet底层是调用HaseMap 的K来实现无序的,无序的概念并不是说你输入什么都会打乱顺序,他会按照HashCode进行插入到Hash 中,最后会用hash表存的顺序输出!

别再吹冷风 2022-01-08 05:31:21

hashSet的无序是指不能以写入的顺序或倒序输出

顾忌 2022-01-08 05:29:23

你对无序这个概念有误差啊

怎言笑 2022-01-08 05:28:44

输出应当显示 26 行 (for 循环进行了 26 次),可你显示的输出共 27 行。最后一行 "[A, Z]"是多出来的、是不应当出现的(可能是你复制粘贴时的错误)。

本王不退位尔等都是臣 2022-01-08 05:19:05

回复
@tcxu : 看 [U, F] 这一行,就知道不是有序的

把回忆走一遍 2022-01-08 04:51:50

回复
就字符串比较而言,前5行,即 [A,Z] ... [E,V], 为升序, 从第6行[U,F]起,变为降序。....

梅窗月明清似水 2022-01-08 04:47:40

回复
@tcxu : 一组总共就两个,比较升序降序没意义。总之,按顺序加入的,打印出来有升序,有降序,说明不是有序的

顾忌 2022-01-08 03:35:45

引用来自“wy65”的评论

可以把所有字母全部加入,然后在看看还是不是有序的

夜无邪 2022-01-07 22:06:22

    hash 是无须的,或者说是不保证有序的。
    但多次重新运行下列代码,亦可看出:每个 Integer 元素的哈希值,就是它的整形数的值。而且 hashset 的输出结果都是进行排序了的,那hashset 是怎么做到对结果的有顺序输出的呢?

import java.util.HashSet;
import java.lang.Integer;
import java.util.Random;

public class SetOfInteger {
    public static void main(String[] args) {
        Random random=new Random(47);
        HashSet<Integer> intset=new HashSet<Integer>();
        for(int i=0;i<1000;i++){
        	int n = random.nextInt(50);
        	System.out.print( n + " hashCode: " + new Integer(n).hashCode() + ", ");
            intset.add(n);
        }
        System.out.println("n" + intset);
    }
}

输出:

    回答是: 虽然 hash 有它自己的顺序, 但这个顺序是hash的顺序.不一样的哈希算法,顺序也是不一样的。而且有序输出跟有序存储是两码事。
    看来 正如 HashSet能对结果进行排序吗 的讨论指出的那样, "你需要百度下:数据结构、存储结构、还有hash键值对。总的来说你缺的太多,别一下直接想这么深的问题,先从数据结构开始学" 。

旧城烟雨 2022-01-06 15:20:14

    是的,HashSet 元素的存储(地址)是无序的。一般来讲,通过进行迭代的迭代器也是依次将各个元素(字符串),无序地输出。

    楼主所示的"有序结果",其实是一种极其特殊案例:每个元素都仅是一(单)个字符,或都是数字字符,或都是小写英文字符,或都是大写英文字符。

    元素的存储地址,视这个元素的哈希值而定。由于元素仅有一个字符,其哈希值的计算结果,就会是这个给定字符的 ascii 码(参见: 哈希算法)的值。结果, 打印出的 HashSet 列表,就会是貌似经过排序后的结果。但要注意构成这种案例的条件:元素必须 都是单个数字字符、或都是单个英文小写字符、或都是单个英文大写字符。

    下列代码显示每个元素的哈希值,以及最终调用 toString() 输出 HashSet hs 的结果。输出结果显示,单个字符元素的哈希值,就是它的 ASCII值。

import java.util.HashSet;

public class HashSetDemo {
 static void showHashSet(String[] s){
	HashSet<String> hs = new HashSet<String>();	
	for (int i=0;i<s.length;i++){
		hs.add(s[i]);
		System.out.println(s[i] + "的哈希值:" +s[i].hashCode()+ " ");
		}		
	System.out.println("toString的结果:" + hs);	
	}
 public static void main(String args[]) {
  	String data[][]=new String[5][6];
  	String dat[]={
  		"B","A","D","E","C","F", // 可以打印出貌似排序的结果
  		"6","4","3","1","2","5", // 可以打印出貌似排序的结果 
  		"BB","AA","DD","EE","CC","FF",
  		"42","41","45","46","44","43",
  		"Base","Alberta","Done","End","Coding","Factory"};
  	for (int i=0;i<dat.length;i++)
  		data[i/6][i%6]=dat[i];
  	for (int i=0;i<data.length;i++)
  		showHashSet(data[i]);
     }
 }

输出:

B的哈希值:66
A的哈希值:65
D的哈希值:68
E的哈希值:69
C的哈希值:67
F的哈希值:70
toString的结果:[A, B, C, D, E, F]
6的哈希值:54
4的哈希值:52
3的哈希值:51
1的哈希值:49
2的哈希值:50
5的哈希值:53
toString的结果:[1, 2, 3, 4, 5, 6]
BB的哈希值:2112
AA的哈希值:2080
DD的哈希值:2176
EE的哈希值:2208
CC的哈希值:2144
FF的哈希值:2240
toString的结果:[BB, AA, DD, EE, CC, FF]
42的哈希值:1662
41的哈希值:1661
45的哈希值:1665
46的哈希值:1666
44的哈希值:1664
43的哈希值:1663
toString的结果:[44, 45, 46, 41, 42, 43]
Base的哈希值:2063089
Alberta的哈希值:743772625
Done的哈希值:2135970
End的哈希值:69819
Coding的哈希值:2023747466
Factory的哈希值:572770538
toString的结果:[Done, Alberta, Coding, Factory, End, Base]

 

叹沉浮 2022-01-06 06:19:08

HashSet的原理是:计算对象的hash值,并映射到数组的下标。再看一下String的hashCode()方法的源码

哈希值是通过char对应的int值计算出来的,即:char对应的int值越大,hash值就越大。

而在拉丁字母A、B、C、D的char字符对应的int值恰巧是递增的,所以他们的hash值也恰巧是递增的,所以最终映射到HashSet内的数组的位置也是顺序的。

冷弦 2022-01-05 18:40:56

可以把所有字母全部加入,然后在看看还是不是有序的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文