HashSet按升序给出输出

时间:2013-07-01 09:46:05

标签: java collections

  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没有命令它的元素。

8 个答案:

答案 0 :(得分:1)

  

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

来自HashSet JavaDoc

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

Hashset不保证元素的顺序。但它会计算其中对象的哈希码。您可能正在使用它,因为整数可能会提供顺序哈希码(直到达到容量最大值)

Hashset有一系列存储桶。根据源代码初始容量为16:

static final int DEFAULT_INITIAL_CAPACITY = 16;

因此,当你尝试小整数时,他们会按顺序放置

答案 3 :(得分: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);

答案 4 :(得分:0)

因为一套概念上没有任何订单。如果该集明确是List,树等,那么就有一个特定的排序。如果您从上面的代码中看到特定的订单,则它特定于实现和值。

答案 5 :(得分:0)

根据HashSet的文档:

  

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

而且,它也不能保证迭代顺序永远不会是恒定的。您可以获得迭代订单。在我的系统中,每次执行都会改变迭代顺序。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

根据Hashset的Java API文档。

  

Set不会检索元素的顺序。

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

  

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

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