ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java零基础学习(Set集合)

2021-06-15 21:02:15  阅读:143  来源: 互联网

标签:Set Java name students add Student 集合 new public


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存储自定义对象保证元素唯一性图解及代码优化

  • 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保证元素唯一和自然排序的原理和图解
    		是按照二叉树的数据结构,先存入一个树根,分两个叉
    		存储元素是,跟树根比较,小的放左边,大的放右边
    		如果相等就不存储
    		取得时候按照左中右的顺序来取
    

    图解:

    • 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集合也是很重要的集合,它的存储是无序而且唯一的,它也有多个子类,每一个子类都有自己独特的属性

标签:Set,Java,name,students,add,Student,集合,new,public
来源: https://www.cnblogs.com/N-jack/p/14887128.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有