Set

作者: 鉴闻俗说 | 来源:发表于2017-10-26 23:00 被阅读0次

    一、Set类似于数学中的集合,不允许有重复元素

    1、 Set只是一个接口,我们常用到的他的实现类有HashSet和TreeSet,其中HashSet是无序的,TreeSet是有序的。首先简单介绍一下HashSet:
    • 利用HashSet写一个简单的示例验证Set的元素不可重复性
    public class SetTest
    {
        public static void main(String[] args)
        {
            HashSet<String> set = new HashSet<>();
            
            System.out.println(set.add("a"));
            set.add("b");
            set.add("c");
            System.out.println(set.add("a"));
            
            System.out.println(set);
        }
    
    }
    

    运行程序,输出的结果为:

    true
    false
    [a, b, c]
    

    可见第一个a添加进集合,二后一个a未添加进集合。

    • 当HashSet存放的元素是我们自定义的对象时,而且在我们自己定义的类中没有重写hashCode()和equals(Object obj)方法。我们会发现HashSet可以存放相同的内容(内容相同,不是指相同的对象,因为对象地址不一样),举例说明
    public class SetTest3
    {
        public static void main(String[] args)
        {
            HashSet<Student> set = new HashSet<>();
            
            Student student1 = new Student("zhangsan");
            Student student2 = new Student("zhangsan");
            
            set.add(student1);
            set.add(student2);
            
            System.out.println(set);
        }
    }
    
    class Student
    {
        String name;
        
        public Student(String name)
        {
            this.name = name;
        }
    
        @Override
        public String toString()
        {
             TODO Auto-generated method stub
            return this.name;
        }
    }
    

    运行程序,输出结果为:

    [zhangsan, zhangsan]
    

    我们set 中有两个相同的内容,下面通过自定义hashCode()和equals(Object obj)方法,解决这个问题。修改以上代码:

    public class SetTest3
    {
        public static void main(String[] args)
        {
            HashSet<Student> set = new HashSet<>();
            
            Student student1 = new Student("zhangsan");
            Student student2 = new Student("zhangsan");
            
            set.add(student1);
            set.add(student2);
            
            System.out.println(set);
        }
    }
    class Student
    {
        String name;
        
        public Student(String name)
        {
            this.name = name;
        }
    
        @Override
        public String toString()
        {
            // TODO Auto-generated method stub
            return this.name;
        }
        
        
        public int hashCode()
        {
            return this.name.hashCode();
        }
        
        public boolean equals(Object obj)
        {
            if (this == obj)
            {
                return true;
            }
            if ((obj == null) || (obj.getClass() != this.getClass()))
                return false;
    
            // 能执行到这里,说明obj和this同类且非null。
            Student s = (Student) obj;
            return (name == s.name || (name != null && name.equals(s.name)));
        }
    

    再次运行程序,输出结果为;

    [zhangsan]
    

    2、TreeSet。TreeSet是一个有序的Set集合。

    • TreeSet的有序性
    public class TreeSetTest
    {
        public static void main(String[] args)
        {
            TreeSet<String> set = new TreeSet<>();
            
            set.add("C");
            set.add("F");
            set.add("B");
            set.add("D");
            set.add("A");
            set.add("E");
            
            System.out.println(set);
        }
    }
    

    运行程序,输出结果为:

    [A, B, C, D, E, F]
    
    • 通过给TreeSet构造方法传入一个比较器(继承Comparator接口),可以自定义集合的排列顺序。下面的demo中对Person对象通过其score属性进行逆序排序;
    public class TreeSetTest2
    {
        public static void main(String[] args)
        {
                    //向TreeSet中传入自定义的比较器
            TreeSet<Person> set = new TreeSet<>(new PersonComparator());
            
            Person p1 = new Person(10);
            Person p2 = new Person(20);
            Person p3 = new Person(30);
            
            set.add(p1);
            set.add(p2);
            set.add(p3);
            
            System.out.println(set);
            
        }
    }
    
    class Person
    {
        int score;
        
        public Person(int score)
        {
            this.score = score;
        }
        
        public String toString()
        {
            return String.valueOf(this.score);
        }
    }
    
    //自定义比较器,按照score逆序排列
    class PersonComparator implements Comparator<Person>
    {
        @Override
        public int compare(Person o1, Person o2)
        {
            return o2.score - o1.score;
        }
    }
    

    运行程序,输出结果为:

    [10, 20, 30]
    

    上一篇:Collection的迭代函数iterator()
    下一篇:Map

    相关文章

      网友评论

          本文标题:Set

          本文链接:https://www.haomeiwen.com/subject/ubslpxtx.html