Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hashSet中元素的顺序_Java_Hashset - Fatal编程技术网

Java hashSet中元素的顺序

Java hashSet中元素的顺序,java,hashset,Java,Hashset,我在Java1.7文档中读到“它不保证集合的迭代顺序”。 这是什么意思 我创建了一个HashSet,将其元素打印1000次。但每次我都有固定的订单。 但顺序和元素的插入顺序不同 Set<String> hashSet = new HashSet<>(); for (int i = 0; i < 10; i++) { hashSet.add("Item+" + i); } for (String s : hashSet)

我在Java1.7文档中读到“它不保证集合的迭代顺序”。 这是什么意思

我创建了一个HashSet,将其元素打印1000次。但每次我都有固定的订单。
但顺序和元素的插入顺序不同

 Set<String> hashSet = new HashSet<>();

    for (int i = 0; i < 10; i++) {
        hashSet.add("Item+" + i);
    }

    for (String s : hashSet) {
        System.out.println(s);
    }
Set hashSet=new hashSet();
对于(int i=0;i<10;i++){
添加(“项+”+i);
}
for(字符串s:hashSet){
系统输出打印项次;
}

您应该尝试向集合中添加更多元素(例如,10.000)。哈希集的默认容量为16,但一旦向该集添加更多元素,它就会在内部重新构建。在这种情况下,顺序可能会改变。

这意味着您无法确定顺序是否相同,例如,如果您在另一个JVM上运行相同的代码

使用一个特定的JVM时,机器上的顺序总是相同的,这一事实与此无关。如果命令很重要,考虑使用<代码>树目录,一个<代码>树目录将保证顺序总是相同的,不管你在哪里运行你的代码。
当然:
TreeSet
要求以某种方式(例如,按字母顺序)对项目进行排序。如果您想保留添加元素的顺序,您可能更喜欢
列表
,例如
数组列表

也许您可以看到相同的“排序”,但这不是真实的,这取决于JVM,因此,如果您想要排序的列表

  • 如果有逻辑排序,请使用Collections.sort()或实现自己的
    Comparator

  • 如果要按插入顺序对集合排序,请使用
    列表
    迭代器

    列表迭代器首先保证以列表的内部顺序(也称为插入顺序)获取列表的元素。更具体地说,是按照插入元素的顺序,或者是按照操作列表的方式。排序可以看作是对数据结构的操作,有几种方法可以对列表进行排序


在散列集合中,条目按某些内部散列函数的结果排序

对于以相同顺序添加到相同集合的同一组条目,返回顺序将始终相同,尽管哈希函数值也保持不变,除非在调用之间重新组织内部结构(即,通过扩展或收缩集合)-在重新组织时,重新计算内部哈希函数的值,条目在内部哈希表中的其他位置


顺便说一句,hash collection的条目迭代器只保证您将收到您放在那里的所有未删除的条目。

HashMap或HashSet中条目的顺序在理论上是可预测的,适用于当前一代和较旧的实现

然而,预测至少取决于:

  • 键的散列值
  • 集合或映射的初始容量
  • 在集合/地图中添加和删除关键点的精确顺序
  • 所使用的
    HashSet
    HashMap
    的具体实现(行为取决于Java版本,可能取决于补丁级别),以及
  • 对于Java 8和更高版本,无论键是否可比较
如果您拥有所有这些信息(并且准备好模拟插入/删除序列),那么您可以准确地预测迭代顺序。然而,这将是棘手的实施,并昂贵的运行


在您的示例中,哈希值相同,初始的
HashSet
容量相同,插入顺序相同,并且
HashSet
实现相同。在这些情况下(并给出所使用的精确算法),迭代顺序将是可重复的。。。即使很难预测

在这种情况下,顺序不是“随机的”,因为在构建
哈希集的过程中没有随机性。只是复杂和不透明的计算。。。但这是决定性的


我在Java1.7文档中读到“它不保证集合的迭代顺序”。这是什么意思

这意味着javadoc没有针对订单提交任何特定行为。当然,对于便携行为没有任何承诺



另请参见:

“顺序与元素的插入顺序不同”是您所期望的,因此您得到了一个无法预测或保证的顺序。你的问题是?也许你应该看到:@EJP我知道我无法预测订单。事实上,我期待一个随机顺序,但每次我在Java1.7上得到一个固定顺序。你为什么期待一个随机顺序?医生没有说订单是随机的。订单不是这种情况。@erhun哦,是的。@EJBA在我再次阅读“是”之后,他是对的,可能是一个答案被编辑了或者我误解了。
TreeSet
需要
可比的
s@SashaSalauyou正确,正如我所写的:它要求可以以某种方式订购物品。在我看来,OP似乎想要一个
列表
而不是
集合
,但问题并不十分清楚。我认为OP只是将“不可预测顺序”与“随机顺序”混淆了。是的,似乎是这样。我刚看到你的答案。它澄清了问题。这是不正确的。条目顺序还取决于在哈希表中添加和删除条目的顺序及其初始容量。当然,如果你删除然后添加相同的条目,它可以在bucket中的另一个位置,返回的结果就会改变。我更新了我的答案,让它更清楚。