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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 刘丽娜 于 2012-11-7 16:56 编辑

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

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

8 个回复

倒序浏览
set里的元素是不能重复的,用iterator()方法来区分重复与否。
equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等。
==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
是根据元素自身的equals和hashCode方法来判断的,Object类提供了equals方法和hashCode方法,想实现自定义类被放到set中去重复的功能就必须自己实现equals和hashCode方法。
原则:当对象调用equals方法返回true时,调用该对象的hashCode方法也应该返回true。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
应该从它俩的区别谈起,==是用来判断两者是否是同一对象(同一事物),而equals是用来判断是否引用同一个对象。再看一下Set里面存的是对象,还是对象的引用。根据java的存储机制可知,set里面存放的是对象的引用,所以当两个元素只要满足了equals()时就已经指向同一个对象,也就出现了重复元素。所以应该用equals()来判断。

总结:
1. equals() 判断对象内容
2. == 判断对象引用
3. Iterator 用来遍历容器中的元素

测试代码:
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class SetTest {
    //结果输出为ELEM
    static void AddToSet(){
        String str = "ELEM";
        String str1 = new String("ELEM");
        Set set = new HashSet();
        Set setCompare = new HashSet();
        set.add(str);
        set.add(str1);
        setCompare.add(str1);
        //Iterator是用来遍历容器中的元素的
        Iterator itera = set.iterator();
        Iterator iteraCompare = setCompare.iterator();
        while(itera.hasNext())
        {
            System.out.println((String)itera.next());
        }
        while(iteraCompare.hasNext())
        {
            System.out.println((String)iteraCompare.next());
        }
        if(set.equals(setCompare)){
            System.out.println("两个对象内容相同");
        }
        if(set == setCompare){
            System.out.println("两个对象相等");
        }
        
    }
    public static void main(String[] args){
        SetTest.AddToSet();
    }

}

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
使用 set 的  contains判断元素是否存在 如果存在 方法会返回true 就不添加   否则就添加

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
Set集合分两种吧
hashSet
首先 比较 hashCode值,如果相同 比较 equals 方法,再相同 视为二者一致

TreeSet
分两种
比较对象实现 Compareble接口时 这个 是覆盖 compareTo方法 比较 一致性
自定义比较器实现Comparator接口,这个覆盖compare(Object o1,Object o2)进行比较

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
葬天 中级黑马 2012-11-6 22:20:45
7#
本帖最后由 葬天 于 2012-11-6 22:41 编辑

盛世到了~~
网速被限制了。。

回复 使用道具 举报
那要看是Set集合的那个子类,若是HashSet集合,保证元素唯一性依赖的是元素的hashCode和equals方法
而TreeSet集合则依赖元素的compareTo方法。要想证明Set集合不存重复元素可以存一下试试啊,存入相同元素,再打印出集合中的元素,看看结果得了。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
谢谢各位的回答
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马