繁体   English   中英

HashSet按升序给出输出

[英]HashSet giving the output in ascending order

  import java.util.Iterator;
  import java.util.*;
  public class HashSetDemo
  {
  public static void main(String[] args)
  {
  HashSet<Integer> intSet = new HashSet<Integer>();
  intSet.add(2);
  intSet.add(7);
  intSet.add(7);
  intSet.add(3);
  intSet.add(4);
  intSet.add(9);
  intSet.add(1);
  intSet.add(13);
  System.out.println(intSet);
  intSet.remove(1);
  System.out.println(intSet);

我已经编写了上面的代码来实现HashSet,但是当我运行它时,我总是得到升序的输出。 我不明白为什么会发生这种情况,因为HashSet不能对元素进行排序。

HashSet不保证集合的迭代顺序。 特别是,它不能保证订单会随着时间的推移保持恒定

HashSet JavaDoc中

请注意, HashSet绝不会以任何特定顺序返回您的值。

您必须使用TreeSet (或其他某种SortedSet )来实现排序的迭代。

哈希集不保证元素的顺序。 但是它计算其中的对象的哈希码。 因为整数可能会给出顺序的哈希码(直到达到最大容量),您可能会遇到它

哈希集包含一系列存储桶。 根据源代码的初始容量为16:

static final int DEFAULT_INITIAL_CAPACITY = 16;

因此,当您尝试使用小整数时,它们会按顺序放置

不能保证设置这些值并进行测试。

  intSet.add(21);
  intSet.add(22);
  intSet.add(7);
  intSet.add(3);
  intSet.add(4);
  intSet.add(9);
  intSet.add(1);
  intSet.add(13);

因为从概念上讲,集合没有任何顺序。 如果集合明确是列表,树等,则存在特定的顺序。 如果您从上面的代码中看到特定顺序,则该顺序特定于实现和值。

根据HashSet的文档:

它不保证集合的迭代顺序。 特别是,它不能保证顺序会随着时间的推移保持恒定。

并且,它也不能保证迭代顺序永远不会恒定。 您可以获取迭代顺序。 仅供参考,在我的系统上,每次执行的迭代顺序都在变化。

随着时间的推移添加和删除元素,迭代顺序可能会更改。 您永远不应该依赖Hashset的迭代顺序,因为它“不能保证迭代顺序”,尽管在实践中,如果使用默认构造函数创建新的Hashset并添加相同的元素,则最终得到相同的迭代订购。

根据哈希集的Java API文档。

Set不会检索元素的Order。

由于您已经在HashSet中输入了元素,并且它可以按任何顺序返回,这可能是因为它每次都占用不同的顺序。

Set的行为,尤其是Hashset,取决于您添加到Set中的每个对象的Hashcode。

因此,如果过一会儿运行该程序,它可能会显示相同或不同的顺序。 如果未按顺序显示任何更改,则可能采用该哈希码。 操纵哈希码不在我们(开发人员)手中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM