A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

9 个回复

倒序浏览
用equals();方法稳妥,它可以重写,"=="比较的是值,而"equals();"比较的是内存中的地址

点评

哥们,说反了吧,==比较的是地址,equal()比较的是内容吧  发表于 2012-7-11 23:40
回复 使用道具 举报
加入Set里面的元素是定义equals()方法来确保对象的唯一性的。
区别
==比较的是2个对象的地址,
而equals比较的是2个对象的内容。
显然,当equals为true时,==不一定为true
回复 使用道具 举报
苑占丽,呵呵
回复 使用道具 举报
Set中主要有两个子类HashSet和TreeSet
HashSet通过hashCode和equals两个方法来完成。如果元素的HashCode值相同,才会判断equals是否为true;如果元素的hashCode值不同,不会调用equals。
TreeSet通过equals方法来实现唯一性
回复 使用道具 举报
Set:元素不可以重复,是无序。他的两个子类Hashset和TreeSet
HashSet: 内部数据结构是哈希表 ,是不同步的。
如何保证该集合的元素唯一性呢?
是通过对象的hashCode和equals方法来完成对象唯一性的。 如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。  如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。 如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。               
  记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。 一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。建立对象判断是否相同的依据。        
哈希表确定元素是否相同
1,判断的是两个元素的哈希值是否相同。
        如果相同,在判断两个对象的内容是否相同。
2,判断哈希值相同,其实判断的是对象的hashCode的方法。判断内容相同,用的是equals方法。
注意:如果哈希值不同,是不需要判断equals。
      
TreeSet:可以对Set集合中的元素进行排序。是不同步的。
  判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。                                

                             

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
田向向 发表于 2012-7-11 23:04
苑占丽,呵呵

哈哈,你也在呀,技术分怎么那么高呀。。。
回复 使用道具 举报
苑占丽 发表于 2012-7-12 09:47
哈哈,你也在呀,技术分怎么那么高呀。。。

,呵呵,上线的时候QQ小窗口M我一下,
回复 使用道具 举报
Set:元素是无序的,元素不可以重复
|——HashSet:hashCode是判断元素存储的区域的。  存储某个元素时,先判断hashCode值,确定这个元素存储的区域。   如果hashCode值相同,表明存储的区域相同,这时调用equals方法比较两个元素是否相同。     所以在创建元素时应该保证当两个元素用equals比较相同时,它们的hashCode也必须相等。   如果它们的hashCode不相等,它们将不会存储到一个区域,那么也就不会调用equals进行比较了。这时便可能导致存入重复元素。  而默认的hashCode值的结果是跟内存地址有关的,所以当两个元素内存地址不同时,hashCode也不同。   所以我们一般要复写hashCode方法。尽量定义不同的hashCode值,这样避免不必要的equals比较,增加效率。 而当我们已经加入元素后,我们变不能再更改跟hashCode值有关的成员变量了。这会导致内存泄漏。  (总结来说:HashCode是靠hashCode和equals来判断元素唯一性的。)
|——TreeSet:可以对Set中的元素进行排序。保证元素唯一性的方法是compareTo方法返回值为是否为0。如果为0则为相同元素。如果不为0则不是相同元素。  有两种排序方式:一种是元素自身具备比较性,元素需要实现Comparable接口,覆盖compareTo方法,这种方式叫自然排序,或默认排序。   第二种:自身不具备比较性,或具备比较性不是所需要的,那么在TreeSet初始化时传入比较方式。
==和equals的区别:==比较的是两个对象的内存地址。equals比较的是两个对象的内容。当==为true时,肯定equals为true;当equals为ture时,==不一定为true。
回复 使用道具 举报
set里的元素是不能重复的,用iterator()方法来区分重复与否。
equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等。
==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马