Iterator 如何在 set(java) 中使用?

How can Iterator can using in set(java)?

我的问题是为什么迭代器在集合上工作?

这是我的示例代码,

public class Staticex {


    public static void main(String[] args) {
        HashSet set = new HashSet();

        set.add(1);
        set.add(2);
        set.add(3);
        set.add(4);
        set.add(5);

        Iterator iter = set.iterator();
        while (iter.hasNext()) {
            System.out.println(iter.next());
        }
    }
}

明白了,set是无序的,对比List

那么,如何通过迭代器逐个获取值呢?

迭代器是不是变成了有序数据结构的列表?

参考documentation,我们看到:

Iterator<E> iterator()

Returns 此集合中元素的迭代器。 无法保证返回元素的顺序(除非此集合是某些提供保证的 class 的实例)。


由于没有保证迭代器返回元素的顺序,所以迭代器应用到无序的Set上不是问题。

而且,并不是把Set变成List

How can Iterator can using in set?

就像你在用它。

How can get the values ​​one by one through an iterator?

您的代码就是这样做的。

Is iterator changing set into like list which ordered data structure?

没有

您缺少的是“无序”的含义。这意味着返回(集合的)元素的顺序是不可预测的1,并且未在 javadoc 中指定。但是,每个元素 返回 一次 并且(因为集合的元素是唯一的!)仅返回一次 迭代。


1 - 实际上,严格来说这不是真的。如果您有关于元素 class、元素值、它们是如何创建的以及它们是如何/何时添加到 HashSet 的足够信息,并且您分析了特定的 HashSet 实现.. . 您可以预测迭代顺序是什么。例如,如果您创建一个 HashSet<Integer> 并向其添加 1、2、3、4...,您将在迭代元素时看到清晰(且可重复)的模式。这部分是由于指定 Integer.hashCode() 的方式。

Set 在逻辑意义上是无序的。当你有一袋东西时,当它们在袋子里时没有秩序感。但是当你从袋子里拿出每样东西时,一次一件,你最终会得到一些订单。就像其他答案提到的那样,您不能依赖该订单,因为它纯粹是偶然的。

I understand, set is unordered, In contrast List

这不一定是真的。 SortedSet is a subinterface of Set. As the name implies, instances of this interface are ordered in some fashion. For example, TreeSets 使用它们的自然顺序进行排序,或者通过在设置创建时提供的比较器进行排序,具体取决于使用的构造函数。 此外, 之间的主要区别SetListList 允许包含重复的对象,而 Set.

现在,如果您专门谈论 HashSet,那么您对无序的看法是正确的。

我认为您的困惑是因为您在问自己“为什么打印输出以数字(插入)顺序显示数字?”对于您熟悉程度的人来说,这是一个复杂的答案,但它们的打印顺序是因为您要插入整数,而它们的哈希码基本上是它们的数值。而且,尽管无法保证迭代时返回哈希集元素的顺序,但 HashSet 的实现由哈希 table 支持。事实上,如果您更改这些相同值的插入顺序,很可能会以相同的数字顺序打印出这些数字。现在,记住尽管如此,顺序并不能保证。这可能不是真的,例如,如果您将集合元素更改为字符串对象。