Java零基础学习(Set集合)

Java零基础学习(Set集合)

  • Set集合概述及特点

    概述及特点
    	一个不包含重复元素的Collection。更确切地讲,set不包含满足eq.equals(e2)的元素e1和e2,并且最包含一个null元素
    
    • HashSet存储字符串并遍历
    import java.util.HashSet;
    public class MyTest2 {
        public static void main(String[] args) {
            HashSet<Integer> integers = new HashSet<>();
            integers.add(10);
            integers.add(12);
            integers.add(15);
            integers.add(null);
            integers.add(14);
            integers.add(10);
            integers.add(20);
            for (Integer integer : integers) {
                System.out.println(integer);
            }
        }
    }
    因为Set集合有唯一性,所以就只存储了一个10,遍历的时候也只有一个10
    而且它是无序的存储的顺序和遍历的顺序并不一致
    
    • HashSet保证元素唯一性

      HashSet底层数据结构是哈希表。HashSet不是线程安全的,集合元素可以是null

      哈希表:是一个元素为链表的数组,综合了数组和链表的优点

    当向HashSet集合中存入一个元素是,HashSet会调用对象的hashCode()方法来得到该对象的hashCode值
    然后根据hashCode值决定对象在HashSet中的存储位置
    HashSet集合判断两个元素相等的标准:
    两个对象是通过hashCode()方法比较相等,并且两个对象的equals()方法的返回值也相等。
    结论:HashSet保证元素唯一性是靠元素重写hashCode()和equals()方法来保证的,如果不重写则无法保证。
    @Override
     public int hashCode() {
     // return 0;
     // 因为成员变量值影响了哈希值,所以我们把成员变量值相加即可
    	 // return this.name.hashCode() + this.age;
    	// 看下面
    	 //s1:name.hashCode()=40,age=30
    	 //s2:name.hashCode()=20,age=50
    	//尽可能的区分,我们可以把它们随变乘以一些整数
    	 return this.name.hashCode() + this.age * 15;
     }
     // @Override
    // public boolean equals(Object obj) {
    // // System.out.println(this + "---" + obj);
    // if (this == obj) {
    // return true;
    // }
    //
    // if (!(obj instanceof Student)) {
    // return false;
    // }
    //
    // Student s = (Student) obj;
    // return this.name.equals(s.name) && this.age == s.age;
    // }
    //
    // @Override
    // public String toString() {
    // return "Student [name=" + name + ", age=" + age + "]";
    // }
    
    • HashSet存储自定义对象保证元素的唯一性
    1.存储自定义对象并保证元素的唯一性
    	如果两个对象的成员变量都相同就认为是同一个对象
    	
    自定义类:
    import java.util.Objects;
    public class Student {
        int age;
        String name;
        public Student(){
    
        }
        public Student(int age,String name){
            this.age=age;
            this.name=name;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "age=" + age +
                    ", name='" + name + '\'' +
                    '}';
        }
    
        @Override
        public 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(age, name);
        }
    }
    
    测试类:
    import java.util.HashSet;
    
    public class MyTest {
        public static void main(String[] args) {
            HashSet<Student> students = new HashSet<>();
            students.add(new Student(15,"张三"));
            students.add(new Student(15,"李四"));
            students.add(new Student(16,"张三"));
            students.add(new Student(15,"张三"));
            students.add(new Student(15,"王五"));
            students.add(new Student(15,"赵六"));
            for (Student student : students) {
                System.out.println(student);
            }
        }
    }
    
    • HashSet存储自定义对象保证元素唯一性图解及代码优化

    Java零基础学习(Set集合)

  • LinkedHashSet的概述和使用

1.概述
	元素有序且唯一
	数据结构有两个 链表和哈希表
	链表保证元素有序,哈希表保证元素唯一
2.演示
public class MyTest {
    public static void main(String[] args) {
        LinkedHashSet<Student> students = new LinkedHashSet<>();
        students.add(new Student(15,"张三"));
        students.add(new Student(15,"李四"));
        students.add(new Student(16,"张三"));
        students.add(new Student(15,"张三"));
        students.add(new Student(15,"王五"));
        students.add(new Student(15,"赵六"));
        for (Student student : students) {
            System.out.println(student);
        }
    }
}
输出的结果是去重之后按顺序打印
  • TreeSet存储Integer类型的元素并遍历

    1.TreeSet集合的特点
    	元素唯一,并且可以对元素进行排序
    	排序:
    		a.自然排序
    		b.使用比较器排序
    	到底使用哪一种构造方法取决于构造方法
    2.演示
    	TreeSet存储Integer类型的元素并遍历
    	存储下列元素:
    		20 , 18 , 23 , 22 , 17 , 24, 19 , 18 , 24
    public class MyTest3 {
        public static void main(String[] args) {
            TreeSet<Integer> integers = new TreeSet<>();
            integers.add(20);
            integers.add(18);
            integers.add(23);
            integers.add(22);
            integers.add(17);
            integers.add(24);
            integers.add(19);
            integers.add(18);
            integers.add(24);
            for (Integer integer : integers) {
                System.out.println(integer);
            }
        }
    }
    对元素进行了去重并且进行了排序
    
    • TreeSet保证元素唯一和自然排序的原理和图解
    原理:
    	TreeSet保证元素唯一和自然排序的原理和图解
    		是按照二叉树的数据结构,先存入一个树根,分两个叉
    		存储元素是,跟树根比较,小的放左边,大的放右边
    		如果相等就不存储
    		取得时候按照左中右的顺序来取
    

    图解:

    Java零基础学习(Set集合)

    • TreeSet存储自定义对象并遍历练习
    创建学生类
    	让他们按照年龄排序
    	次要就是按照名字
    	
    自定义类:
    import java.util.Objects;
    public class Student implements Comparable<Student>{
        int age;
        String name;
        public Student(){
    
        }
        public Student(int age,String name){
            this.age=age;
            this.name=name;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "age=" + age +
                    ", name='" + name + '\'' +
                    '}';
        }
    
        @Override
        public 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(age, name);
        }
    
        @Override
        public int compareTo(Student student) {
            int a=this.age-student.age;
            int b=(a==0)?this.name.compareTo(student.name):a;
            return b;
        }
    }
    	
    	
    测试类:
    import java.util.TreeSet;
    public class MyTest {
        public static void main(String[] args) {
            TreeSet<Student> students = new TreeSet<>();
            students.add(new Student(15,"张三"));
            students.add(new Student(15,"李四"));
            students.add(new Student(16,"张三"));
            students.add(new Student(15,"张三"));
            students.add(new Student(18,"王五"));
            students.add(new Student(15,"赵六"));
            for (Student student : students) {
                System.out.println(student);
            }
        }
    }
    
    • TreeSet保证元素唯一和比较其排序的原理
    import java.util.Comparator;
    import java.util.TreeSet;
    
    public class MyTest {
        public static void main(String[] args) {
            TreeSet<Student> students = new TreeSet<>(new Comparator<Student>() {
                @Override
                public int compare(Student o1, Student o2) {
                    int a=o1.age-o2.age;
                    int b=(a==0)?o1.name.compareTo(o2.name):a;
                    return b;
                }
            });
            students.add(new Student(15,"张三"));
            students.add(new Student(15,"李四"));
            students.add(new Student(16,"张三"));
            students.add(new Student(15,"张三"));
            students.add(new Student(18,"王五"));
            students.add(new Student(15,"赵六"));
            for (Student student : students) {
                System.out.println(student);
            }
        }
    }
    
  • 产生10个1-20之间的随机数要求随机数不能重复

编写一个程序,获取10个1至20的随机数,要求随机数不能重复。
		  并把最终的随机数输出到控制台。
		  import java.util.HashSet;
import java.util.Random;

public class MyTest4 {
    public static void main(String[] args) {
        HashSet<Integer> integers = new HashSet<>();
        Random random = new Random();
        while (integers.size()<=10){
            integers.add(random.nextInt(20)+1);
        }
        for (Integer integer : integers) {
            System.out.println(integer);
        }
    }
}
  • 键盘录入学生信息按照总分排序后输出在控制台

	需求:键盘录入3个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台。
	
自定义类
public class Student implements Comparable<Student> {
    String name;
    int chinese;
    int math;
    int english;
    int add;
    public Student(){

    }

    @Override
    public String toString() {
        return name+"\t"+chinese+"\t"+math+"\t"+english+"\t"+add;

    }

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

    @Override
    public int compareTo(Student o) {
        int i=this.add-o.add;
        int a=(i==0)?(this.chinese-o.chinese):i;
        int b=(a==0)?(this.math-o.math):a;
        int c=(b==0)?(this.english-o.english):b;
        int d=(c==0)?(this.name.compareTo(o.name)):c;
        return d;
    }
}

测试类
import java.util.Scanner;
import java.util.TreeSet;

public class MyTest1 {
    public static void main(String[] args) {
        TreeSet<Student> students = new TreeSet<>();
        for (int i=0;i<5;i++){
            Scanner sc = new Scanner(System.in);
            System.out.println("请依次输入学生的姓名,语文成绩,数学成绩,英语成绩");
            String name=sc.nextLine();
            int chinese=sc.nextInt();
            int math=sc.nextInt();
            int english=sc.nextInt();
            Student student = new Student(name, chinese, math, english);
            students.add(student);
        }
        for (Student student : students) {
            System.out.println(student);
        }
    }
}

总结

Set集合也是很重要的集合,它的存储是无序而且唯一的,它也有多个子类,每一个子类都有自己独特的属性

上一篇:聊一聊编程


下一篇:MySQL常用操作