【问题标题】:Retrieval of data in HashSet检索HashSet中的数据
【发布时间】:2019-03-29 19:46:51
【问题描述】:

我想知道 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); 
        }
}

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

【问题讨论】:

  • 使用Set&lt;String&gt;set = new LinkedHashSet&lt;String&gt;()

标签: java collections set hashset


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如上所述,请参阅 HashSets 的 Javadoc - 不保证顺序。 https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html

    【讨论】:

      【解决方案3】:

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

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

      在您的情况下,看起来字符串存储在 LIFO 队列中,但 HashSet 的另一种实现可能会以不同的方式做事(即使是这个也可能随着更多的项目被插入,开始表现不同)。

      【讨论】:

        【解决方案4】:

        HashSet 与带值的 HashMap 相同。此外,它在内部使用带有值常量对象的 HashMap,称为“PRESENT”。通过这样做 HashSet 保证唯一性而不是顺序 它定位集合元素的方式类似于 Hashmap 所做的。

        你可以在网上看到HashSet的实现。

        【讨论】:

        • 某些实现可能会出现这种情况,但不能保证。
        • 你能推荐一些案例吗?
        • 无法保证,这意味着并非所有实现都如此。不要在文档明确声明这些断言是错误的情况下做出断言。在这种特定情况下,实现看起来是一个 LIFO 队列,而不是基于哈希的集合。
        【解决方案5】:

        来自 HashSet 的 Javadoc

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-15
          • 1970-01-01
          • 2011-12-07
          • 2013-08-27
          • 2015-08-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多