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 使用它们的自然顺序进行排序,或者通过在设置创建时提供的比较器进行排序,具体取决于使用的构造函数。 此外, 之间的主要区别Set
和 List
是 List
允许包含重复的对象,而 Set
不 .
现在,如果您专门谈论 HashSet,那么您对无序的看法是正确的。
我认为您的困惑是因为您在问自己“为什么打印输出以数字(插入)顺序显示数字?”对于您熟悉程度的人来说,这是一个复杂的答案,但它们的打印顺序是因为您要插入整数,而它们的哈希码基本上是它们的数值。而且,尽管无法保证迭代时返回哈希集元素的顺序,但 HashSet 的实现由哈希 table 支持。事实上,如果您更改这些相同值的插入顺序,很可能会以相同的数字顺序打印出这些数字。现在,记住尽管如此,顺序并不能保证。这可能不是真的,例如,如果您将集合元素更改为字符串对象。
我的问题是为什么迭代器在集合上工作?
这是我的示例代码,
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 使用它们的自然顺序进行排序,或者通过在设置创建时提供的比较器进行排序,具体取决于使用的构造函数。 此外, 之间的主要区别Set
和 List
是 List
允许包含重复的对象,而 Set
不 .
现在,如果您专门谈论 HashSet,那么您对无序的看法是正确的。
我认为您的困惑是因为您在问自己“为什么打印输出以数字(插入)顺序显示数字?”对于您熟悉程度的人来说,这是一个复杂的答案,但它们的打印顺序是因为您要插入整数,而它们的哈希码基本上是它们的数值。而且,尽管无法保证迭代时返回哈希集元素的顺序,但 HashSet 的实现由哈希 table 支持。事实上,如果您更改这些相同值的插入顺序,很可能会以相同的数字顺序打印出这些数字。现在,记住尽管如此,顺序并不能保证。这可能不是真的,例如,如果您将集合元素更改为字符串对象。