Hashset 中追加元素的table的对应索引位置已经是一个链表,追加成功后,退出循环,为什么不进去e!=null
时间: 2024-04-01 08:31:46 浏览: 24
在Hashset中追加元素时,如果对应索引位置已经有一个链表,那么新的元素将被添加到链表的末尾。在循环中,当程序找到对应的链表时,它会遍历链表中的每个元素,直到找到一个空的节点为止。因此,在找到空节点之后,程序会退出循环,而不是继续遍历链表。在这种情况下,e变量仍然为null,因为它没有被设置为链表中的任何元素。因此,程序不会进入if(e != null)代码块。
相关问题
Hashset中在索引位置相同并已经是链表的末尾追加元素成功,为什么e!=null不成立
在 HashSet 中,如果一个哈希槽中已经有一个链表存在,并且要往该链表的末尾添加一个新的元素,那么在添加之前需要先判断该链表的最后一个元素的 next 节点是否为 null,如果为 null,则可以直接将新元素添加到链表的末尾。这是因为在 HashSet 内部的实现中,每个链表的末尾都会有一个 null 节点,用来表示该链表已经到达了尾部。
因此,当您在向一个已经是链表末尾的哈希槽中添加元素时,判断 e!=null 不成立的原因是因为 e 已经是该链表的最后一个元素,它的 next 节点已经是 null 了。
需要注意的是,如果您在向一个已经是链表末尾的哈希槽中添加元素时,发现 e 不为 null,那么可能是因为在多线程情况下,另外一个线程已经在同时向该链表中添加元素了,所以在添加之前需要做好同步措施。
Java中为什么前几个加入HashSet中的元素会不见
Java中的HashSet是一种基于散列表实现的无序集合,当我们向HashSet中添加元素时,HashSet会根据元素的哈希值将元素存储在散列表中。如果多个元素的哈希值相同,那么它们就会被放在同一个链表中。
当我们向HashSet中添加元素时,如果新元素的哈希值和已有元素的哈希值相同,那么新元素就会覆盖已有元素。因此,如果我们将多个元素的哈希值设置为相同的值,那么只会保留最后一个添加的元素,前面添加的元素会被覆盖掉,从而导致前几个加入HashSet中的元素会不见。
为了避免这种情况,我们可以在实现自定义类时,重写equals方法和hashCode方法,保证每个元素的哈希值都不同,从而能够正确地使用HashSet。