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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曾辉 黑马帝   /  2012-1-12 13:48  /  2082 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

8 个回复

倒序浏览
你问题真多{:soso_e127:}
回复 使用道具 举报
1、什么是Set?
     Set是Collection容器的一个子接口,它不允许出现重复元素,当然也只允许有一个null对象。
2、如何来区分重复与否呢?
    “ 用 iterator() 方法来区分重复与否 ”,这是在网上流传的答案,个人认为这是个错误的答案。JPI中写的很明白:“set 不包含满足e1.equals(e2) 的元素对 e1 和 e2 ”,由此可见回答使用equals()区分更合适。
     3、为什么用equals()而不用==来区分?
     应该从它俩的区别谈起,==是用来判断两者是否是同一对象(同一事物),而equals是用来判断是否引用同一个对象。再看一下Set里面存的是对象,还是对象的引用。根据java的存储机制可知,set里面存放的是对象的引用,所以当两个元素只要满足了equals()时就已经指向同一个对象,也就出现了重复元素。所以应该用equals()来判断。
回复 使用道具 举报
呵呵,不懂就要问,学习中......
回复 使用道具 举报
set集合分为,hashset和treeSet
hashset是根据对象的hashset值来先判断是否为同一元素,hash值相同的在比较equals,
TreeSet是二叉树的结构,大的数放在第一个数的右边,小的在左边,就这么找,找到最后比较的也应该是equals,
所以我觉得都有吧,毕竟==和hash一样,比较的都是地址值.
回复 使用道具 举报
zl918 黑马帝 2012-1-12 16:09:22
地板
加入Set的元素必须定义equals()方法以确保对象的唯一性。实际上Set就是Collection,只是行为不同。(这是继承与多态思想的典型应用:表现不同的行为。)Set不保存重复的元素(至于如何判断元素相同则较为负责)
存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。
回复 使用道具 举报
大梅 黑马帝 2012-1-26 00:09:44
7#
翻了一下源码,HashSet是用HashMap集合实现的,例如添加一个元素时调用的是HashMap的put方法。当添加元素的时候,已存在于集合的元素不应该被添加进去。
public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }
        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }
注意红色部分,我们可以发现源码中既用==比较一下,又用equals比较一下,只要其中一个一样,再加上这个对象存储在相应的hashcode的存储区内,我们就认为这两个值相等。
==是比较了对象中的值,equals是比较了对象存储的地址,两者有这样的区别。

回复 使用道具 举报
黄秋 黑马帝 2012-1-26 22:01:07
8#
==比较的是两个对象的地址,而equals比较的是两个对象的内容(值)。
当equals为true时,==不一定为true:
  1.         public static void main(String[] args) {
  2.                 String s1,s2,s3,s4;
  3.        s1=new String("abc");
  4.        s2="abc";
  5.        s3="abc";
  6.        s4=new String("abc");
  7.        System.out.println(s3==s2);
  8.        System.out.println(s1==s2);
  9.        System.out.println(s1==s4);
  10.                 System.out.println(s1.equals(s2));
  11.                 System.out.println(s1.equals(s4));
  12.         }
复制代码
//为 true false false true true
s1与s2、s4的比较,用“==”为false,显然与目的不符,判断它们的值是否相等,应用equals方法。所以set 一般用equals方法比较两个对象,前面几楼也有解释。Integer还要特殊一点,小于128 的保存在常量池,大于等于128在堆:
  1.          Integer a = 127;
  2.          Integer b = 127;
  3.          Integer c = 128;
  4.          Integer d = 128;
  5.          System.out.println(a ==b);  //true
  6.          System.out.println(c ==d);  //false
  7.          System.out.println(c.equals(d));  //true
复制代码
总结:
1、两个简单类型的数值是否相等,可用“==”来比较;
2、两个对象的值是否相等,则要用对象的equals()方法比较;
3、两个对象是否指向同一对象(地址),则使用“==”来进行比较;
4、对于自定义的类,应该根据情况覆盖其父类或Object类中的equals()方法,否则默认的equals()方法功能与“==”相同。
回复 使用道具 举报
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

首先:
        == :用于比较基本数据类型的值是否相等,还可以用于比较两个对象是否指向同一个对象。

        equals():是Object类中的方法,一般类在新建时都会重写equals()和hashCode ()方法。

Set集合 : hashSet集合在添加元素时,会自动调用元素类中的hashCode()和equals()方法,会对新添加的元素与集合中元素进行比较,                        
                 如果集合中有则不会添加到集合中,如果没有则添加到结合中。

                 TreeSet集合在添加元素时,会调用元素类中的compareTo()方法或者调用比较器的compare( )方法,如果方法返回的值为0,
                 则不能填加到结合。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马