0
  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 没有对其元素进行排序。

4

8 回答 8

1

请注意, aHashSet永远不会以任何特定顺序返回您的值。

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

于 2013-07-01T09:48:48.090 回答
1

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

Hashset 有一个桶数组。根据源代码初始容量为16:

static final int DEFAULT_INITIAL_CAPACITY = 16;

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

于 2013-07-01T09:49:41.297 回答
1

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

来自HashSet JavaDoc

于 2013-07-01T09:47:53.153 回答
1

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

  intSet.add(21);
  intSet.add(22);
  intSet.add(7);
  intSet.add(3);
  intSet.add(4);
  intSet.add(9);
  intSet.add(1);
  intSet.add(13);
于 2013-07-01T09:51:36.757 回答
0

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

于 2013-07-01T09:52:00.010 回答
0

根据 Hashset 的 Java API 文档。

Set 不检索元素的顺序。

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

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

因此,如果您在一段时间后运行该程序,它可能会显示相同或不同的顺序。如果它没有显示顺序的任何变化,它可能会以这种方式获取哈希码。并且操作哈希码不在我们(开发人员)手中。

于 2013-07-12T12:50:33.687 回答
0

因为集合在概念上没有任何顺序。如果该集合明确是一个列表、一棵树等,那么就有一个特定的顺序。如果您从上面的代码中看到特定的顺序,那么它是特定于实现和值的。

于 2013-07-01T09:49:24.367 回答
0

根据 HashSet 的文档:

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

而且,它也不能保证迭代顺序永远不会是恒定的。您可以获得迭代顺序。仅供参考,在我的系统中,每次执行时迭代顺序都会发生变化。

于 2013-07-01T09:51:33.213 回答