Java HashSet中的数据检索

Java HashSet中的数据检索,java,collections,set,hashset,Java,Collections,Set,Hashset,我想知道以何种方式在HashSet中检索数据 我以不同的顺序插入了数据,而输出数据是以另一个顺序。 有人能告诉我这背后的逻辑吗 代码如下:- class Test { public static void main(String[]args) { HashSet<String> h = new HashSet<String>(); // Adding element

我想知道以何种方式在HashSet中检索数据 我以不同的顺序插入了数据,而输出数据是以另一个顺序。 有人能告诉我这背后的逻辑吗

代码如下:-

    class Test 
    { 
        public static void main(String[]args) 
        { 
            HashSet<String> h = new HashSet<String>(); 

            // Adding elements into HashSet using add() 
            h.add("India"); 
            h.add("Australia"); 
            h.add("South Africa"); 
            System.out.println(h); 
        }
}
类测试
{ 
公共静态void main(字符串[]args)
{ 
HashSet h=新的HashSet();
//使用add()将元素添加到HashSet中
h、 添加(“印度”);
h、 添加(“澳大利亚”);
h、 添加(“南非”);
系统输出打印ln(h);
}
}

输出:-[南非、澳大利亚、印度]

来自HashSet的Javadoc

它不保证 集合的迭代顺序;特别是,它不能保证 随着时间的推移,秩序将保持不变


HashSet的工作原理与具有值的HashMap相同。此外,它在内部使用名为“PRESENT”的值常量对象的HashMap。通过这样做,HashSet可以保证唯一性,但不能保证顺序,它可以像Hashmap一样定位集合元素


您可以在internet上看到HashSet的实现。

如前所述,HashSet中元素的顺序不能保证是任何东西,也不能保证随着时间的推移保持不变

这是由于底层数据结构的性质造成的


在您的例子中,字符串似乎存储在后进先出队列中,但HashSet的另一个实现可能会有不同的表现(即使是这个实现,也可能随着插入更多的项,开始表现出不同的行为)。

如上所述,请参阅Javadoc for HashSet-顺序不保证

如果希望LinkedHashSet保持元素的顺序,请使用它。

使用
Setset=new LinkedHashSet()
这可能适用于某些实现,但不能保证。您能建议一些情况吗?不能保证,这意味着并非所有实现都是这样。不要在文档明确指出这些断言是错误的情况下做出断言。在这种特定情况下,实现看起来是一个后进先出队列,而不是基于哈希的集合。