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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张斯佳 中级黑马   /  2018-5-22 14:35  /  556 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Set:集合,元素是无序的(因为没有索引),元素不可以重复。可以有null元素。
      HashSet(JDK1.2):底层数据结构是哈希表、存取速度快、元素唯一、线程不同步。
保证性元素唯一的原理:
先判断元素的hashCode值是否相同,再判断两元素的equals方法是否为true
(往HashSet里面存的自定义元素要复写hashCode和equals方法,
以保证元素的唯一性!)
      TreeSet:底层数据结构式二叉树。可以对Set集合中的元素进行排序。元素有序、线程不同步。
保证元素唯一性的依据:compareTo方法return 0
TreeSet排序的第一种方式:让元素自身具备比较性,比如八种基本数据类型或则字符串,
实现Compareble接口,覆盖compareTo方法,
此方式是元素的自然顺序
TreeSet排序的第一种方式:当元素自身不具备比较性(比如存储学生对象时)或者具备的
比较性不是我们所需要的比较性时(比如想字符串的长度排序),
此时就需要让集合自身具备自定义的比较性。
那如何让集合自身具备比较性呢?可在集合初始化时,
就让集合具备比较方式。即定义一个类,
实现Comparator接口,覆盖compare方法。
**Set集合使用注意事项:
(1)HashSet:
通过new的方式往HashSet里面存的元素的hashCode都不同,但通常我们定义对象,
比如学生对象时,虽然是new的两个学生对象,但是当他们name和age一样时,我们认为是
同一个对象,所以为了保证元素的唯一性,我们通常在往HashSet集合里面存储元素时,
在定义对象的类中通常复写hashCode和equals方法。

public int hashCode(){
        return name.hashCode()+age*39;
}
public boolean equals(Object obj){
        if(!(obj instanceof Student))
        return false;
        Student stu = (Student)obj;
        return this.name.equals(stu.name)&&this.age==stu.age;
}


HashSet是如何保证元素唯一性的呢?
**如果两元素的hashCode值不同,则不会调用equals方法
**如果两元素的hashCode值相同,则继续判断equals是否返回true;
**hashCode和equals方法虽然定义在自定义对象类里面,但不是我们手动调用
而是往HashSet集合里面存储元素的时候,集合底层自己调用hashCode和equals
它自己拿对象去判断,自己判断两元素是否是同一个元素。
(2)TreeSet:
TreeSet要求往里面存的元素具备比较性,否则会报错。
TreeSet排序的第一种方式:让元素自身具备比较性
定义对象类,实现Compareble接口,复写compareTo方法,此方式是元素的自然顺序

class Student implements Comparable{
        private String name;
        private int age;
        public Student(String name,int age){
                this.name=name;
                this.age=age;
        }
        public String getName(){
                return name;
         }
         public int getAge(){
                return age;
         }
         public int compareTo(Object obj){
                if(!(obj instanceof Student))
                          throw new RuntimeException("不是学生对象!");
                Student stu = (Student)obj;
                int num = this.age-stu.age;
                if(num==0)
                return this.name.compareTo(stu.name);
                return num;
         }
}



TreeSet排序的第一种方式:让集合具备比较性
当元素自身不具备比较性(比如存储学生对象时)或者具备的
比较性不是我们所需要的比较性时(比如想字符串的长度排序),
此时就需要让集合自身具备自定义的比较性。
那如何让集合自身具备比较性呢?可在集合初始化时,
就让集合具备比较方式。即定义一个类,
实现Comparator接口,覆盖compare方法。

class StringLengthComparator implements Comparator{
            public int compare(Object obj1,Object obj2){
                       String s1 = (String)obj1;
                       String s2 = (String)obj2;
                       int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
                       if(num==0)
                                return s1.compareTo(s2);
                       return num;
            }
}
class TreeSetTest{
              public static void main(String[] args){
                         TreeSet ts = new TreeSet(new StringLengthComparator());
                         ts.add("addfg");
                         ts.add("dfg");
                         ts.add("agtuug");
                         ts.add("vgjkg");
                         sop(ts);
               }
}



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马