[集合Set]HashSet、LinkedHashSet TreeSet

Set

Set是不包含重复元素的集合。更正式地,集合不包含一对元素e1e2,使得e1.equals(e2),并且最多一个空元素

  无索引,不可以重复,无序(存取不一致)

Set接口除了继承自Collection接口的所有构造函数以及add,equalshashCode方法外,增加了其他方法


HashSet

此类实现Set接口,由哈希表(实际为HashMap实例)支持。 对集合的迭代次序不作任何保证; 特别是,它不能保证此顺序在一段时间内保持不变。 这个类允许使用null元素。

 HashSet 保证存储数据唯一的方法:

  • HashCode方法给每个元素计算数值并进行比较
  • 当 HashCode数值一样时,会调用 equals 方法进行比较


LinkedHashSet

底层是链表实现的,是 Set 集合中唯一一个能保证存取顺序一致的集合对象

因为是 HashSet 的子类,所以也能保证元素唯一,与 HashSet 原理一样


TreeSet(重要)

TreeSet 集合是用来对 对象进行排序的,可以指定一个顺序,也可以保证元素的唯一

TreeSet 存储的方法是采用了Tree 二叉树。保证元素唯一的原理是其中用到了 CompareTo()  方法进行比较,小的返回负数,存储在二叉树的左边,大的返回整数,存储在右边,相等返回0,不存储。

 所以当compareTo 方法返回0的时候集合中只有一个元素

           返回正数的时候集合会怎么存怎么取,顺序存取

           返回负数的时候集合会倒序存储

更多TreeSet集合相关知识见这篇博客 : 

JavaSE基础 TreeSet集合(红黑树数据结构)

 

代码示例

学生类

package com.gaoyang.set;

public class Student {
    private String name;
    private int chinese;
    private int math;
    private int english;
    private int sum;
    
    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }
    
    public Student(String name, int chinese, int math, int english) {
        super();
        this.name = name;
        this.chinese = chinese;
        this.math = math;
        this.english = english;
        this.sum = this.chinese + this.math + this.english ; 
    }
    
    public int getSum() {
        return sum;
    }

    @Override
    public String toString() {
        return "Student " + name  +  " : " + "chinese=" + chinese + ", math=" + math + ", english=" 
                + english + ", sum= "+ sum ;
    }

}

 操作代码

package com.gaoyang.set;

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

public class test_TreeSet {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入学生姓名成绩,格式为:姓名,语文成绩,数学成绩,英语成绩");
        TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {

            @Override
            public int compare(Student s1, Student s2) {
                int num = s2.getSum() - s1.getSum();
                return num == 0 ? 1 : num;
            }
        }); 
        
        while(ts.size() < 5) {
            String line = sc.nextLine();
            String[] arr = line.split(",");
            int chinese = Integer.parseInt(arr[1]);
            int  math = Integer.parseInt(arr[2]);
            int english = Integer.parseInt(arr[3]);
            //存入集合中
            ts.add(new Student(arr[0],chinese, math, english));
            
        }
    
        System.out.println("排序后的学生成绩");
        for (Student student : ts) {
            System.out.println(student);
        }
    }
}

 

posted @ 2019-07-17 11:12  gaoyang666  阅读(182)  评论(0编辑  收藏  举报