Java-Set集合

set集合

特点:元素唯一,元素无序,具体表现为取出和存入的顺序不同。
方法:HashSet LinkedHashSet TreeSet

HashSet

HashSet特点:
顶层数据结构是哈希表(数组+链表 JDK1.7 数组+链表+二叉树 JDK1.8)
元素唯一,且无序(存取顺序不一致)
唯一性是靠 元素重写hashCode()和equals方法来保证的。
如果元素不重写hashCode() 和 equals方法,则无法保证唯一性。
底层用HashMap 来存的

public class MyTest3 {
    public static void main(String[] args) {
        //HashSet 底层数据结构是哈希表,元素无序,且唯一,元素的唯一性是靠 元素重写
        //hashCode()和equals方法来保证的。如果元素不重写hashCode() 和 equals方法,则无法保证唯一性。
        //HashSet 集合 底层用HashMap 来存的
        HashSet<Student> set = new HashSet<>();
        set.add(new Student("杨超越",20));
        set.add(new Student("杨幂", 22));
        set.add(new Student("杨紫", 20));
        set.add(new Student("杨洋洋", 20));
        set.add(new Student("杨超越", 20));
        set.add(new Student("杨幂", 22));
        set.add(new Student("杨紫", 20));
        set.add(new Student("杨洋洋", 20));
        for (Student student : set) {
            System.out.println(student.getName()+"==="+student.getAge());
        }
    }
public class Student {
    private String name;
    private int age;
    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.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;
    }
 boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
/*杨紫===20
杨幂===22
杨洋洋===20
杨超越===20
*/

LinkedHashSet

LinkedHashSet:
底层数据结构是链表和哈希表
元素唯一,且有序(存~~ 取顺序一致)
链表保证了有效,哈希表保证了唯一

public class MyTest {
    public static void main(String[] args) {
       // LinkedHashSet 底层数据结构是链表和哈希表,元素唯一,且有序(存取顺序一致)链表保证了有效,哈希表保证了唯一
        LinkedHashSet<String> set = new LinkedHashSet<>();
        set.add("张曼玉");
        set.add("王祖贤");
        set.add("钟楚红");
        set.add("林青霞");
        set.add("杨超越");
        set.add("张曼玉");
        set.add("王祖贤");
        set.add("钟楚红");
        set.add("林青霞");
        set.add("杨超越");
        for (String s : set) {
            System.out.println(s);
        }
        ArrayList<String> strings = new ArrayList<>();
        strings.add("aaa");
        strings.add("bbb");
        strings.add("ccc");
        strings.add("ddd");
        strings.add("aaa");
        strings.add("bbb");
        strings.add("ccc");
        strings.add("ddd");
        //使用有参构造,对List 集合去重
        LinkedHashSet<String> strings1 = new LinkedHashSet<>(strings);
        System.out.println(strings1);
    }
}
public class Student {
        private String name;
        private int age;
        public Student(){}
        public Student(String name, int age){
            this.name = name;
            this.age = age;
        }
        public void show () {
            System.out.println(name +"..."+age);
        }
        public String getName(){
            return name;
        }
        public int getAge(){
            return age;
        }
    }
    /*张曼玉
王祖贤
钟楚红
林青霞
杨超越
[aaa, bbb, ccc, ddd]*/

TreeSet

特点:
元素唯一,并且可以对元素进行排序
排序:
//一种是自然排序:自然排序,你使~~ 用得是无参构造,自然排序,对排序得元素有要求,要求,元素必须实现一个
Comparable 接口,重写该接口中得 compareTo()方法,根据此方法 返回得正负 0 来决定元素在二叉树中的左右位置,返回0 就不往里面方法
//一种是比较器排序

自然排序

 public class Demo {
    public static void main(String[] args) {
        TreeSet<Student> set = new TreeSet<>();
        set.add(new Student("杨超越asdfasfd", 20));
        set.add(new Student("杨超越2", 20));
        set.add(new Student("杨超越sdfsdf", 20));
        set.add(new Student("杨子涵", 22));
        set.add(new Student("王祖贤", 22));
        set.add(new Student("王祖贤", 23));
        set.add(new Student("杨树林sss", 25));
        set.add(new Student("杨康sss", 29));
        set.add(new Student("杨过ssssssssss", 23));
        set.add(new Student("杨梅sssssssssssssssssssssssssssssss", 18));
        set.add(new Student("杨紫dfdfdfdfdf", 16));
        set.add(new Student("杨洋洋", 17));
        set.add(new Student("杨洋洋asddfassd", 17));
        for (Student student : set) {
            System.out.println(student);
        }
    }
}
class  Student implements Comparable<Student>{
    private String name;
    private int age;
    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.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;
    }
    @Override
    public int compareTo(Student o) {
      int num1=this.name.length()-o.name.length();
        int num2=num1==0?this.name.compareTo(o.name):num1;
        int num3=num2==0?this.age-o.age:num2;
        return num3;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

比较器排序

public class Demo {
    public static void main(String[] args) {
                TreeSet<Student> set = new TreeSet<>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                int num=s1.getAge()-s2.getAge();
                int num2=num==0?s1.getName().compareTo(s2.getName()):num;
                return num2;
            }
        });
        set.add(new Student("杨超越asdfasfd", 20));
        set.add(new Student("杨超越2", 20));
        set.add(new Student("杨超越sdfsdf", 20));
        set.add(new Student("杨子涵", 22));
        set.add(new Student("王祖贤", 22));
        set.add(new Student("王祖贤", 23));
        set.add(new Student("杨树林sss", 25));
        set.add(new Student("杨康sss", 29));
        set.add(new Student("杨过ssssssssss", 23));
        set.add(new Student("杨梅sssssssssssssssssssssssssssssss", 18));
        set.add(new Student("杨紫dfdfdfdfdf", 16));
        set.add(new Student("杨洋洋", 17));
        set.add(new Student("杨洋洋asddfassd", 17));
        for (Student student : set) {
            System.out.println(student);
        }
    }
}
class  Student {
    private String name;
    private int age;
    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.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;
    }
      @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
class MyCompareTor implements Comparator<Student>{
    @Override
    public int compare(Student s1, Student s2) {
               int num=s1.getAge()-s2.getAge();
        int num2=num==0?s1.getName().compareTo(s2.getName()):num;
        return num2;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值