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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

问题:Set集合里面里的元素不能重复,那么怎样来区分和理解它呢?最好有实例,谢谢...

2 个回复

正序浏览
Set集合有两种  一种是HashSet  一种是TreeSet
底层数据结构分别是 hash表 和 二叉树    所以只要见到Hash打头的  都是hash表结构的   看到Tree打头的都是二叉树 结构的  
下面是hash结构   和   二叉树 结构  怎么排序的情况~~~!

HashSet是通过当add添加元素的时候 系统自动调用hashCode()方法判断hash值
        如果相等则不会被添加,如果相等,再通过hashCode方法调用equals方法判断。
        一般添加的时候都会在类中重写hashCode 和equals以满足实际条件的需求。
        但是,ArrayList和HashSet重写Object类中的equals方法原理都是一样的。
例如:                       
class Person
{
        private String name;
        private int age;
        Person(String name,int age)
        {
                this.name=name;
                this.age=age;
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
此equals是重写Object中的equals方法
obj形参 实参是contains中的,相当于obj=new Person("xiaoxiao11",15); 多态
        public boolean equals(Object obj)
        {
               
判断传进来的对象是否是Person对象 不是的话就返回false
                if (!(obj instanceof Person))  
                {
                        return false;
                }

因为穿参传进来的对象是Object的子类对象,体现多态性,必须向下转型
                Person p=(Person)obj;
       
                return this.name.equals(p.name)&&this.age==p.age;   
而return中的equlas是字符串中的equals方法~~! 比较字符串对象的内容是否相同
        }

}
关于TreeSet添加自定意对象,让其排序的问题。有两种方式

        第一种   让元素(对象)自身具备比较性。元素需要实现Comparable接口,覆盖
                         compareTo方法这种方式也称为元素的自然顺序,或者叫做默认顺序
                        class Student implements Comparable<Student>
                        {
                                private String name;
                                private int age;
                                Student(String name,int age)
                                {
                                        this.name=name;
                                        this.age=age;
                                }
                当在TreSet中添加对象的时候底层自动调用Comparable接口中的compareTo方法
                class Student implements Comparable <Student>
                {
                        private String name;
                        private int age;
                        Student(String name,int age)
                        {
                                this.name=name;
                                this.age=age;
                        }
                        public int compareTo(Student s)
                        {
                                System.out.println(this.name+"...compareto...."+s.name);
                                int num= new Integer(this.age).compareTo(new Integer (s.age));
                                if(num==0)       
                                        return this.name.compareTo(s.name);//比较名字是否相同时次要条件
                                return num;
                        }

                        public String getName()
                        {
                                return name;
                        }
                        public int getAge()
                        {
                                return age;
                        }
                }
第二种:    当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时需要让
                    集合(TreeSet)自身具备比较性。做法是在集合初始化时,就有了比较方式,
                    即定义一个比较器将比较器作为参数传递给TreeSet集合的构造函数。
                    比较器--定义一个类,实现Comparator接口,覆盖compare方法。
                    而当两种排序都存在时以比较器为主
                        使用了泛型--在集合初始化时把new Mycomparator()以构造方法传参传进去即可
                        class Mycomparator implements Comparator<String>
                        {
                                public int compare(String o1,String o2)       
                                {

                                        int num=new Integer(o1.length()).compareTo(new Integer (o2.length()));
                                        if (num==0)
                                        {
                                                return         o1.compareTo(o2);
                                        }
                                        return num;
                                }
                        }

评分

参与人数 1技术分 +2 收起 理由
职业规划-刘倩老师 + 2 赞一个!

查看全部评分

回复 使用道具 举报
当试图向Set集合中插入引用同一对象的多个引用变量时,其结果JVM只会向Set集合中插入一个引用变量。

并使用equals方法进行判断,是否是同一对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马