ArrayList 对象如何存储在 Java 中的 HashSet 中?
How the ArrayList objects are stored inside a HashSet in Java?
今天我在做一道题,他们用了类似的代码。
我很惊讶地看到这一点。我以为每个 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
}
}
答案是1
,因为两个列表包含相同的元素。 ArrayList 的哈希码是列表中所有元素的哈希码的函数。在您的例子中,两个列表都包含相同的元素,这意味着它们对应于相同的哈希码。
如果 List 的两个实例具有 the same elements in the same order,则它们被视为“相等”。所以这意味着 list1 和 list2 是“相等的”。根据 hashCode
方法的一般约定,它们也必须具有相同的哈希码
HashSet 不存储重复项:如果给它两个相同的项,它只存储第一个。所以这里它只存储 list1。
HashSet
实现 Set
接口,由散列 table 支持。 Set
的任何实现都只是丢弃重复的元素。由于 list1
和 list2
相等,当 set
已经有 [时,当您尝试将 set
插入 set
时,set
将丢弃 set
=13=]。因此,set
的大小仍然是 1
.
此处两个列表值相等,因此合约的散列码也相同,散列集存储其对象的散列值且不包含重复项,因此 list1 被 list2 替换,因此大小为 1。
它会遵循它的默认行为 - 它会首先检查是否有任何现有条目(使用 hashCode() and equals() ),如果找到,它会替换它,如果没有,它会插入它。
请注意,hashCode()
和 equals()
方法调用最终将在对象条目上调用 - 在本例中为 ArrayList object itself (ArrayList inturn inherits the methods from AbstractList)。
PS : It appears HashSet is implemented internally as a HashMap !
今天我在做一道题,他们用了类似的代码。
我很惊讶地看到这一点。我以为每个 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
}
}
答案是1
,因为两个列表包含相同的元素。 ArrayList 的哈希码是列表中所有元素的哈希码的函数。在您的例子中,两个列表都包含相同的元素,这意味着它们对应于相同的哈希码。
如果 List 的两个实例具有 the same elements in the same order,则它们被视为“相等”。所以这意味着 list1 和 list2 是“相等的”。根据 hashCode
方法的一般约定,它们也必须具有相同的哈希码
HashSet 不存储重复项:如果给它两个相同的项,它只存储第一个。所以这里它只存储 list1。
HashSet
实现 Set
接口,由散列 table 支持。 Set
的任何实现都只是丢弃重复的元素。由于 list1
和 list2
相等,当 set
已经有 [时,当您尝试将 set
插入 set
时,set
将丢弃 set
=13=]。因此,set
的大小仍然是 1
.
此处两个列表值相等,因此合约的散列码也相同,散列集存储其对象的散列值且不包含重复项,因此 list1 被 list2 替换,因此大小为 1。
它会遵循它的默认行为 - 它会首先检查是否有任何现有条目(使用 hashCode() and equals() ),如果找到,它会替换它,如果没有,它会插入它。
请注意,hashCode()
和 equals()
方法调用最终将在对象条目上调用 - 在本例中为 ArrayList object itself (ArrayList inturn inherits the methods from AbstractList)。
PS : It appears HashSet is implemented internally as a HashMap !