Java 为什么这个HashSet代码段会有这样的行为?
给定以下代码:Java 为什么这个HashSet代码段会有这样的行为?,java,hashset,Java,Hashset,给定以下代码: public class NewClass { public static void main(String[] args) { List<String> fruits = Arrays.asList("Orange", "Pineapple", "Banana", "Banana"); Set<String> fruitsSet = new HashSet<>(); for (Str
public class NewClass {
public static void main(String[] args) {
List<String> fruits = Arrays.asList("Orange", "Pineapple", "Banana", "Banana");
Set<String> fruitsSet = new HashSet<>();
for (String fruit : fruits) {
fruitsSet.add(fruit);
}
for (String fruit : fruitsSet) {
System.out.println(fruit);
}
}
}
我的问题是,为什么每次的顺序都是一样的,因为规范说“它对集合的迭代顺序没有保证”()“没有保证”的意思就是:没有保证。它可能正是您每次在集合中插入元素的顺序。可能是随机顺序。除了星期二是满月外,任何时候都可能是完全相同的顺序。“无保证”并不意味着“随机”或“不可预测”,它只是意味着你不能依赖任何特定的顺序,因为它可能会因任何原因而改变。“无保证”只是意味着:无保证。它可能正是您每次在集合中插入元素的顺序。可能是随机顺序。除了星期二是满月外,任何时候都可能是完全相同的顺序。“无保证”并不意味着“随机”或“不可预测”,它只是意味着你不能依赖于任何特定的顺序,因为它可能会因任何原因而改变。哈希集存储元素的顺序取决于每个元素的
哈希码。因为每次放置相同的String
s时,它们的hashCode
s也相同,顺序也相同
但是正如Louis Wasserman所说的,您不应该依赖于该顺序,因为不能保证它不会在较新的JDK中更改。HashSet
存储元素的顺序取决于每个元素的hashCode
。因为每次放置相同的String
s时,它们的hashCode
s也相同,顺序也相同
但是正如Louis Wasserman所说的,您不应该依赖于这个顺序,因为不能保证它不会在较新的JDK中更改。哈希集中的迭代顺序是由哈希函数转换每个元素以创建其哈希代码的方式决定的。 所以对于一个特定的字符串,您将得到一个特定的hashCode,它将被放置在集合的特定单元格中 不保证意味着添加橙色、菠萝和香蕉不能保证迭代时的顺序
此外,它通过不遵守某些限制(如排序)为HashSet的未来实现留出了空间。哈希集中的迭代顺序由哈希函数转换每个元素以创建其哈希代码的方式确定。 所以对于一个特定的字符串,您将得到一个特定的hashCode,它将被放置在集合的特定单元格中 不保证意味着添加橙色、菠萝和香蕉不能保证迭代时的顺序
此外,它还为HashSet的未来实现留出了空间,因为它不满足某些限制(如排序)。好的,我做了一些测试,我注意到我更改了JVM,顺序也发生了更改,这是它可能更改的原因之一。或者未来的JVM可能会故意将其随机化。或者未来的JVM可能会故意使其具有确定性。或者,未来的JVM可能会检测到您的应用程序何时关心排序,然后,也只有在那时,随机排序只是为了搞乱您。没有保证。好的,我做了一些测试,我注意到我改变了JVM,顺序也改变了,这是它可能改变的原因之一。或者未来的JVM可能会故意将其随机化。或者未来的JVM可能会故意使其具有确定性。或者,未来的JVM可能会检测到您的应用程序何时关心排序,然后,也只有在那时,随机排序只是为了搞乱您。没有保证。仅供参考,
HashSet
有一个使第一个循环不必要的构造函数:newhashset(fruits)
仅供参考,HashSet
有一个使第一个循环不必要的构造函数:newhashset(fruits)
Banana
Pineapple
Orange