Java_总结十五(集合——Set接口——Set中常用的两个实现类HashSet、TreeSet)

一、Set 接口

  Set接口没有提供Collection接口额外的方法,但实现Set接口的集合类中的元素是不可重复的

 

二、HashSet 集合类

  --HashSet不保存元素的加入顺序。

  --HashSet根据元素的哈希码进行存放,取出时也可以根据哈希码快速找到。

  --向HashSet中添加元素时,系统为保证不重复,先比较hashCode( ) ,如果相同,再比较equals(),如果还相同,则认为是同一个对象,不再加入,add(...)返回false,

  --[Demo] 要存入HashSet集合的自定义类型的对象通常需要重写hashCode()和equals()方法

  --同一个对象的hash值一定相同,同一个hash值不一定是同一个对象,甚至可能是不同类的对象。

 

  HashSet 存对象,重写hashCode()和equals()方法例子

public class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

    //重写hashCode()方法
    @Override
    public int hashCode() {
        
        return this.name.hashCode() + this.age;//因为age是整型可以转成hashCode,也可以不转
    }
    
    //重写equals()方法
    @Override
    public boolean equals(Object obj) { //= p
//        this.name    参数.name
//        this.age      参数.age

        //    如果  obj 是null 就直接返回 false  就不用去判断是否有本类创建对象了
        if(obj == null){
            return false;
        }
        
        // 如果 地址相同的话  就不需要挨个比较属性   直接返回true
        if(obj == this){
            return true;
        }
        
        if(obj instanceof Person){
            Person paramter = (Person)obj;
            if(this.name.equals(paramter.name) && this.age == paramter.age){
                return true;
            }
        }
        
        return false;
    }
}
import java.util.HashSet;

public class Test11 {
    public static void main(String[] args) {
        HashSet<Person> hashSet = new HashSet<>();
        hashSet.add(new Person("张三", 12));
        hashSet.add(new Person("张三", 12));
        hashSet.add(new Person("张三", 14));
        hashSet.add(new Person("李四", 12));
        System.out.println(hashSet);
    }
}

  执行结果:

[Person [name=张三, age=12], Person [name=张三, age=14], Person [name=李四, age=12]]

 

三、TreeSet 集合类

  --TreeSet使用红黑树结构对加入的元素进行排序存放,输出时也会按排序后的顺序, 所以放入TreeSet中元素必须是”可排序的

  --加入TreeSet集合中的javabean类本身要实现Comparable ['kɑmpərəbl]接口

  --自定义一个实现Comparator['kɑmpə,retɚ]接口的比较器实现类,在创建TreeSet对象时,将自定义比较器传入构造方法

  --如果加入的类”不可比较”,则add()方法在运行时会报错

 

  所有"可排序"的类都必须实现java.lang.Comparable接口

  实现该接口中的唯一方法: public int compareTo(Object obj); 该方法如果

       (this:新加入对象;obj:集合中已经存在的对象)

    --返回 0,表示 this == obj,不加入集合

    --返回正数,表示 this > obj,this较大放后面

    --返回负数,表示 this < obj,this较小放前面

 

  实现Comparable接口例子

package chapter.three;

import java.text.CollationKey;
import java.text.Collator;

public class Person implements Comparable<Person>{
    private String name;
    private int age;
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

    @Override
    public int compareTo(Person o) {
        //先年龄升序,再名字排序
        if (this.age > o.age) {
            return 1;
        }else if (this.age < o.age) {
            return -1;
        }else {
            //即可排序汉字,也可以其他,防止汉字排序出错
            CollationKey key1 = Collator.getInstance().getCollationKey(this.name);
            CollationKey key2 = Collator.getInstance().getCollationKey(o.name);
            int num = key1.compareTo(key2);
            if (num > 0) {
                return 1;
            }else if (num < 0) {
                return -1;
            }else {
                return 0;//返回0则不加入集合
            }

       //如果这里是最后比较,可以只写这一句语句就可以return o1.getName().compareTo(o2.getName()); } } }
import java.util.HashSet;
import java.util.TreeSet;

public class Test11 {
    public static void main(String[] args) {
        TreeSet<Person> treeSet = new TreeSet<>();
        treeSet.add(new Person("张三", 14));
        treeSet.add(new Person("李四", 12));
        treeSet.add(new Person("赵六", 12));
        treeSet.add(new Person("王五", 19));
        for (Person person : treeSet) {
            System.out.println(person);
        }
    }
}

  执行结果:

Person [name=李四, age=12]
Person [name=赵六, age=12]
Person [name=张三, age=14]
Person [name=王五, age=19]

 

  自定义一个实现Comparator接口的比较器实现类

import java.text.CollationKey;
import java.text.Collator;

public class Person/* implements Comparable<Person>*/{
    private String name;
    private int age;
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
//自定义比较类
import java.text.CollationKey;
import java.text.Collator;
import java.util.Comparator;

public class MyComparator implements Comparator<Person>{

    @Override
    public int compare(Person o1, Person o2) {
        //先年龄升序,再名字排序
        if (o1.getAge() > o2.getAge()) {
            return 1;
        }else if (o1.getAge() < o2.getAge()) {
            return -1;
        }else {
            //即可排序汉字,也可以其他,防止汉字排序出错
            CollationKey key1 = Collator.getInstance().getCollationKey(o1.getName());
            CollationKey key2 = Collator.getInstance().getCollationKey(o2.getName());
            int num = key1.compareTo(key2);
            if (num > 0) {
                return 1;
            }else if (num < 0) {
                return -1;
            }else {
                return 0;//返回0则不加入集合
            }
        }
    }
}
import java.util.TreeSet;

public class Test11 {
    public static void main(String[] args) {
        TreeSet<Person> treeSet = new TreeSet<>(new MyComparator());
        treeSet.add(new Person("张三", 14));
        treeSet.add(new Person("李四", 12));
        treeSet.add(new Person("赵六", 12));
        treeSet.add(new Person("王五", 19));
        for (Person person : treeSet) {
            System.out.println(person);
        }
    }
}

  执行结果:

Person [name=李四, age=12]
Person [name=赵六, age=12]
Person [name=张三, age=14]
Person [name=王五, age=19]

 

posted @ 2017-05-15 20:25  Java_皮卡丘漏电  阅读(411)  评论(0编辑  收藏  举报