【java笔记】集合Set:HashSet,LinkedHashSet,TreeSet,Comparable,Comparator

3.Set
3.1 set集合概述,遍历


/*
Set集合的特点,没有重复元素,不含索引,不能用普通for循环
hashSet,迭代没有顺序
 */
public class Demo01Set {
    public static void main(String[] args) {
        Set<String> set=new HashSet<>();
        set.add("hello");
        set.add("world");
        set.add("jaja");
        set.add("jaja");

        for(String i:set){
            System.out.println(i);
        }

    }
}

3.2 哈希值

package demo08Set;
/*
哈希值:根据对象的地址,字符串或者数字信息得到的int类型的数值
通过重写可以使不同对象的hash值相同

 */
public class Demo02Hash {
    public static void main(String[] args) {
        Student stu=new Student("周杰伦",41);
        Student stu2=new Student("周杰伦",41);
        System.out.println(stu.hashCode());//764977973
        System.out.println(stu.hashCode());//764977973
        System.out.println(stu2.hashCode());//381259350
        System.out.println("hello".hashCode());//99162322
        System.out.println("world".hashCode());//113318802
        System.out.println("你好".hashCode());//652829
        System.out.println("马云".hashCode());//1245605
    }
}

HashSet概述:

package demo08Set;
/*
hashSet是set的实现类
 */
import java.util.HashSet;

public class Demo03HashSet {
    public static void main(String[] args) {
        HashSet<String> hs=new HashSet<String>();
        hs.add("hello");
        hs.add("world");
        hs.add("java");
        hs.add("world");

        for(String s:hs){
            System.out.println(s);
        }


    }
}
/*
world
java
hello
 */

3.4 HashSet保证元素的唯一性

在这里插入图片描述

3.5 数据结构之哈希表
在这里插入图片描述
注:哈希表的初始长度是16
3.6 HashSet存储学生对象并遍历

package demo08Set;
/*
重复的对象可以被添加进去,所以要重写HashCode和Equals方法
 */
import java.util.HashSet;

public class Demo04HashSet {
    public static void main(String[] args) {
        Student s1=new Student("赵本山",66);
        Student s2=new Student("宋小宝",36);
        Student s3=new Student("小沈阳",33);
        Student s4=new Student("小沈阳",33);

        HashSet<Student> hs=new HashSet<Student>();
        hs.add(s1);
        hs.add(s2);
        hs.add(s3);
        hs.add(s4);

        for(Student s:hs){
            System.out.println(s.getAge()+"的"+s.getName()+"真猛");
        }

    }
}

3.7 LinkedHashSet 概述

package demo08Set;
/*
LinkedHashSet底层数据结构是链表和哈希表,添加内容不重复由哈希表保证,元素
有序由链表保证。
 */
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;

public class Demo05LinkedHashSet {
    public static void main(String[] args) {
        LinkedHashSet<String> lhs=new LinkedHashSet<String>();
        lhs.add("杭电");
        lhs.add("浙工大");
        lhs.add("浙理工");
        lhs.add("杭电");

        for(String s:lhs){
            System.out.println(s);
        }
    }
}
/*
杭电
浙工大
浙理工
 */

3.8 TreeSet概述

package demo08Set;
/*
会按一定的规则对存入的元素排序
 */
import java.util.TreeSet;

public class Demo06TreeSet {
    public static void main(String[] args) {
        TreeSet<Integer> ts=new TreeSet<Integer>();
        ts.add(10);
        ts.add(20);
        ts.add(50);
        ts.add(30);
        ts.add(40);
        ts.add(30);

        for(int i:ts){
            System.out.println(i);
        }
    }
}
/*
10
20
30
40
50
 */

3.9 自然排序Comparable的使用

package demo08Set;

import java.util.TreeSet;

public class Demo07Comparable {
    public static void main(String[] args) {
        //创建学生对象
        Student s1=new Student("cangjingkong",41);
        Student s2=new Student("jizemingbu",36);
        Student s3=new Student("mingrihua",27);
        Student s4=new Student("xidaoaili",27);


        //创建TreeSet集合
        TreeSet<Student> ts=new TreeSet<>();

        //添加学生对象
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);

        //遍历
        for(Student s:ts){
            System.out.println(s.getAge()+"的"+s.getName()+"深受爱戴");
        }
    }
}

package demo08Set;

public 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 s) {
        int num=s.age-this.age;//??this是s2,s是s1

        int num2=num==0?this.name.compareTo(s.name):num;

        return num2;
    }

}

3.10 Comparator比较器的使用(TreeSet带参构造方法)

package demo08Set;

import java.util.Comparator;
import java.util.TreeSet;

public class Demo08Comparator {
    public static void main(String[] args) {
        //创建TreeSet集合
        TreeSet<Student> ts=new TreeSet<Student>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                int num=s1.getAge()-s2.getAge();//s1是this,s2是s
                int num2=num==0?s1.getName().compareTo(s2.getName()):num;
                return num2;
            }
        });

        //创建学生对象
        Student s1=new Student("cangjingkong",41);
        Student s2=new Student("jizemingbu",36);
        Student s3=new Student("mingrihua",27);
        Student s4=new Student("xidaoaili",27);
        Student s5=new Student("xidaoaili",27);


        //添加学生对象
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);

        //遍历
        for(Student s:ts){
            System.out.println(s.getAge()+"的"+s.getName()+"深受爱戴");
        }
    }
}
/*
27的mingrihua深受爱戴
27的xidaoaili深受爱戴
36的jizemingbu深受爱戴
41的cangjingkong深受爱戴

 */
package demo08Set;

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;
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Student student = (Student) o;

        if (age != student.age) return false;
        return name != null ? name.equals(student.name) : student.name == null;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }
}

3.11 Comparable实现成绩排序

package demo09TreeSet;

import java.util.TreeSet;

public class Demo01TreeSet {
    public static void main(String[] args) {
        TreeSet<Student> ts=new TreeSet<>();
        Student s1=new Student("杨幂",97,88);
        Student s2=new Student("佟丽娅",99,87);
        Student s3=new Student("刘亦菲",98,95);
        Student s4=new Student("张天爱",99,94);
        Student s5=new Student("西瓜妹",99,94);
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);

        for(Student s:ts){
            System.out.println(s.getName()+"这次考试语文"+s.getChinese()+"数学"+s.getMath()+"总分"+s.getSum());
        }

    }
}

package demo09TreeSet;

public class Student implements Comparable<Student>{
    private String name;
    private int chinese;
    private int math;

    public Student() {
    }

    public Student(String name, int chinese, int math) {
        this.name = name;
        this.chinese = chinese;
        this.math = math;
    }

    public String getName() {
        return name;
    }

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

    public int getChinese() {
        return chinese;
    }

    public void setChinese(int chinese) {
        this.chinese = chinese;
    }

    public int getMath() {
        return math;
    }

    public void setMath(int math) {
        this.math = math;
    }
    public int getSum(){
        int sum=chinese+math;
        return sum;
    }

    @Override
    public int compareTo(Student s) {
        int sum=s.getSum()-this.getSum();
        int sum2=sum==0?s.chinese-this.chinese:sum;
        int sum3=sum2==0?s.name.compareTo(this.name):sum2;
        return sum3;
    }
}

练习
1.不重复的随机数

package demo09TreeSet;

import java.util.*;

/*
产生10个不重复的随机数
1.建立Set集合
2.产生随机数存到集合里
3.遍历
 */
public class Demo02Random {
    public static void main(String[] args) {
        //Set<Integer> se=new HashSet<Integer>();//无序
        Set<Integer> se=new TreeSet<>();
        Random ra=new Random();

        for (int i = 0; se.size()< 10; i++) {
            int sum=ra.nextInt(20)+1;
            se.add(sum);
        }

        for(Integer i:se){
            System.out.println(i);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值