首页 > 试题广场 >

HashSet子类依靠()方法区分重复元素。

[单选题]
HashSet子类依靠()方法区分重复元素。
  • toString(),equals()
  • clone(),equals()
  • hashCode(),equals()
  • getClass(),clone()
推荐
HashSet内部使用Map保存数据,即将HashSet的数据作为Map的key值保存,这也是HashSet中元素不能重复的原因。而Map中保存key值前,会去判断当前Map中是否含有该key对象,内部是先通过key的hashCode,确定有相同的hashCode之后,再通过equals方法判断是否相同。
编辑于 2016-10-30 00:08:19 回复(4)
C
发表于 2015-10-18 11:11:53 回复(0)
选C

HashSet的底层还是用HashMap来实现的。将Entry<K,V>的V都变成了同一个Object对象,public static final PRESENT = new Object()。
而HashMap的数据结构是数组+链表+红黑树。

调用K的hashCode方法,然后高低16位进行&运算。得到的hash值,与数组tab[](桶)的长度-1进行&运算,确定插入对象在哪一个桶上。然后调用对象的equals方法,形成链表。当链表长度大于8时,链表转红黑树。
发表于 2018-06-29 19:13:35 回复(1)
比较对象相等时也是要最好同时重写这两个方法。一直记着hashcode用来找桶,equals用来在桶里找相同那一个。
发表于 2017-05-13 09:56:39 回复(0)
List
    ArrayList
    LinkedList
    Vector
Set
    HashSet
    LinkedHashSet
    TreeSet
Map
    Hashtable
    HashMap
    LinkedHashMap
    TreeMap
    ConcurrentHashMap
发表于 2016-08-24 14:23:25 回复(0)
C。如果之类的hashCode()值相等,equals()也相等,就确定为相等,即重复元素。
发表于 2015-10-18 11:42:45 回复(3)
HashSet的底层结构是HashMap,HashMap是Map接口的实现类,也由键+值组成,键相等用equals()判断,值相等用HashCode()判断。
1.键相同,对应的值一定相等;
2.值相等,对应的键不一定相等。
发表于 2021-05-24 14:26:14 回复(0)
对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode。在Java中也一样,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。   为什么这么说呢?考虑一种情况,当向集合中插入对象时,如何判别在集合中是否已经存在该对象了?(注意:集合中不允许重复的元素存在)   也许大多数人都会想到调用equals方法来逐个进行比较,这个方法确实可行。但是如果集合中已经存在一万条数据或者更多的数据,如果采用equals方法去逐一比较,效率必然是一个问题。此时hashCode方法的作用就体现出来了,当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址,所以这里存在一个冲突解决的问题,这样一来实际调用equals方法的次数就大大降低了,说通俗一点:Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。
发表于 2020-05-03 23:30:06 回复(0)
有2点明确: 1.HashSet内部数据结构的存储方式:Map 2.Map是(Key,Value)的结构,这里的Key要经过hashcode()方法计算,这里算出的值是唯一的,然后再通过equal()方法比较key的值,这样做就确保了key的不重复性,也就是HashSet具有不重复的特性。
发表于 2020-04-26 12:29:13 回复(0)
HashSet的底层结构是HashMap,HashMap是Map接口的实现类,也由键+值组成,键相等用equals()判断,值相等用HashCode()判断。 1.键相同,对应的值一定相等; 2.值相等,对应的键不一定相等。
发表于 2021-11-02 22:50:24 回复(0)
 List接口:存储序的、可重复的数据。
1. ArrayList:线程不安全的,效率高;底层使用Object[] 存储
2. LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
3. Vector:线程安全的,效率低;底层使用Object[] 存储
Set接口:存储无序的、不可重复的数据  
1. HashSet:线程不安全的;可以存储null值
2. LinkedHashSet:HashSet的子类;添加数据时,每个数据维护了两个引用,记录此数据前一个数据和后一个数据。对于频繁的遍历操作,LinkedHashSet效率高于HashSet.
3. TreeSet:可以照添加对象的指定属性,进行排序。

发表于 2021-07-22 21:15:34 回复(0)
hashcode找有没有相同的   equals找究竟是哪一个同,
发表于 2019-07-19 22:05:10 回复(0)
HashSet 添加元素,首先比较hash值 是否有相同hash,没有则添加成功,有则继续比较equals,如果不同则添加成功,否则不添加。
发表于 2017-11-23 16:25:22 回复(0)
LLJ头像 LLJ
if (p.hash == hash &&
                ((k = p.key) == key || (key != null && key.equals(k))))
                e = p;

发表于 2016-04-20 12:41:12 回复(0)
hashcode找有没有相同的   equals找究竟是哪一个同,
发表于 2023-03-12 19:39:07 回复(0)
选C
HashSet集合是如何保证元素唯一:
HashSet类实现了Set接口,Set接口继承了Collection接口,
HashSet底层是由HashMap实现的,调用add()方法添加元素时其实底层是调用了HashMap的put()方法,put()方法调用了key值的hashcode()方法返回一个哈希值,把这个哈希值跟HashSet集合里其他元素的哈希值遍历对比,如果没有遍历出相同的哈希值则直接添加该新的元素,如果遍历出相同的哈希值则再对比地址值,地址值不相同则添加元素,相同则使用equals()方法继续比较,如果是返回false则添加,如果返回true是不添加元素。
编辑于 2021-12-23 11:45:46 回复(0)
HashSet底层仍是HashMap,通过key计算出来的Hashcode去判断具体添加在那个桶上,通过equals去判断是否相同

发表于 2021-09-08 19:10:20 回复(0)
HashSet的底层还是用HashMap来实现的,而HashMap的数据结构是数组+链表+红黑树。链接:
调用K的hashCode方法,然后高低16位进行&运算。得到的hash值,与数组tab[](桶)的长度-1进行&运算,确定插入对象在哪一个桶上。然后调用对象的equals方法,形成链表。当链表长度大于8时,链表转红黑树。
发表于 2021-07-07 17:33:37 回复(0)
关于hashcode的判断
hash函数 hashCode方法
判断相等 equals方法
发表于 2021-01-26 15:43:13 回复(0)
首次全对,加油!
发表于 2021-01-18 01:06:02 回复(0)
<p>C</p>
发表于 2020-05-30 00:36:22 回复(0)