Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,ArrayList对象如何存储在哈希集中?_Java_Arraylist_Hashset - Fatal编程技术网

在Java中,ArrayList对象如何存储在哈希集中?

在Java中,ArrayList对象如何存储在哈希集中?,java,arraylist,hashset,Java,Arraylist,Hashset,今天我在做一个问题,他们使用了类似的代码。 看到这一点我很惊讶。我认为每个HashSet存储一个对象的散列,答案是2。然而,这个问题的答案是1。 谁能解释一下当我存储对象的ArrayList的HashSet时,内部实际发生了什么,以及为什么答案是1而不是2 import java.io.*; import java.util.*; class Code { public static void main (String[] args) { HashSe

今天我在做一个问题,他们使用了类似的代码。 看到这一点我很惊讶。我认为每个
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
    }
}
import java.io.*;
导入java.util.*;
类别代码{
公共静态void main(字符串[]args){
HashSet=newhashset();
ArrayList list1=新的ArrayList();
ArrayList list2=新的ArrayList();
清单1.添加(1);
清单1.添加(2);
清单2.添加(1);
清单2.添加(2);
set.add(列表1);
set.add(列表2);
System.out.println(set.size());//1
}
}

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

如果列表中有两个实例,则认为它们“相等”。这意味着列表1和列表2“相等”。根据
hashCode
方法的一般约定,它们也必须具有相同的hash代码


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

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

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

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

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


!

只需阅读hashset的Javadoc,看看
AbstractList的
equals
hashCode
,这是因为
equals()
hashCode()
是如何为ArrayList实现的。HashSet使用这两种方法识别“重复”。请注意,这回答了你的问题吗?如果根据equals(Object)方法,两个对象相等,那么在两个对象上调用hashCode方法必须产生相同的整数结果。所以,对于这两个列表,生成相同的哈希代码,当add方法调用它时,检查列表的哈希,并将其作为重复项丢弃