【问题标题】:How the ArrayList objects are stored inside a HashSet in Java?ArrayList 对象如何存储在 Java 中的 HashSet 中?
【发布时间】:2020-07-19 12:00:41
【问题描述】:

今天我在做一个问题,他们使用了类似的代码。 我很惊讶地看到这一点。我认为每个HashSet 都存储一个对象的哈希值,答案是 2。但是,这个 1 的答案。 谁能解释当我存储 ArrayList 的对象的 HashSet 时内部实际发生了什么以及为什么答案是 1 而不是 2?

import java.io.*;
import java.util.*;

class Code {
    public static void main (String[] args) {
        
        HashSet<ArrayList<Integer>> set=new HashSet<>();
        ArrayList<Integer> list1=new ArrayList<>();
        ArrayList<Integer> list2=new ArrayList<>();
        list1.add(1);
        list1.add(2);
        list2.add(1);
        list2.add(2);
        set.add(list1);
        set.add(list2);
        System.out.println(set.size()); // 1
    }
}

【问题讨论】:

  • 看HashSet的Javadoc就行了
  • 看看equalshashCodeAbstractList
  • 这是因为equals()hashCode()是如何为ArrayList实现的。 HashSet 使用这两个识别“重复”。还要注意contract between the two
  • 这能回答你的问题吗? How Set checks for duplicates? Java HashSet
  • 来自文档如果两个对象根据equals(Object)方法相等,那么对两个对象中的每一个调用hashCode方法必须产生相同的整数结果。 所以对于生成的两个列表相同的哈希码,当添加方法调用它时检查列表的哈希并丢弃为重复

标签: java arraylist hashset


【解决方案1】:

如果 List 的两个实例具有the same elements in the same order,则它们被视为“相等”。这意味着 list1 和 list2 是“相等的”。根据hashCode 方法的一般约定,它们也必须具有相同的哈希码

HashSet 不存储重复的项目:如果你给它两个相等的项目,它只存储第一个。所以这里只存储list1。

【讨论】:

    【解决方案2】:

    答案是1,因为两个列表都包含相同的元素。 ArrayList 的哈希码是列表中所有元素的哈希码的函数。在您的情况下,两个列表都包含相同的元素,这意味着它们对应于相同的哈希码。

    【讨论】:

      【解决方案3】:

      HashSet 实现了Set 接口,由哈希表支持。 Set 的任何实现都会简单地丢弃重复的元素。由于list1list2 相等,当您尝试将list2 插入set 时,set 将丢弃set,而set 已经有list1。因此,set 的大小仍然是1

      【讨论】:

        【解决方案4】:

        这里两个列表值相等,因此合约的哈希码也相同,并且 hashset 存储其对象的哈希值并且不包含重复项,因此 list1 被替换为 list2,因此大小为 1。

        【讨论】:

          【解决方案5】:

          它将遵循其默认行为 - 它会首先检查是否存在任何现有条目(使用 hashCode()equals() ),如果找到,它将替换它,如果没有,它将插入它。

          请注意,hashCode()equals() 方法调用最终将在对象条目上被调用 - 在这种情况下是 ArrayList 对象本身(ArrayList 又从 AbstractList 继承方法)。

          PS : It appears HashSet is implemented internally as a HashMap!

          【讨论】:

            猜你喜欢
            • 2013-03-01
            • 2017-09-27
            • 1970-01-01
            • 2017-09-30
            • 2017-11-13
            • 1970-01-01
            • 2013-03-21
            • 2021-06-10
            • 1970-01-01
            相关资源
            最近更新 更多