为什么这个HashSet代码片段会以这种方式运行?

del*_*via 0 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 (String fruit : fruits) {
            fruitsSet.add(fruit);
        }

        for (String fruit : fruitsSet) {
            System.out.println(fruit);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

每次运行代码时,元素的顺序都是相同的,消除了重复项Banana,这是典型的HashSet实现:

Banana
Pineapple
Orange
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么订单每次都相同,因为规范说"它不能保证集合的迭代顺序"(https://docs.oracle.com/javase/7/docs/api/ java/util/HashSet.html)

Lou*_*man 5

"不保证"就是说:没有保证.它可能正是每次将元素插入集合的顺序.它可以是随机顺序.除了星期二满月之外,它可以在任何时候完全相同."不保证"并不意味着"随机"或"不可预测",它只是意味着您不能依赖任何特定的订单,因为它可能因任何原因改变.