特点:
无序,不可复制,没有下标
HashSet的剔重原理
原理:
1,给HashSet中存储对象时,会默认调用对象的hashcode方法,获取其值,如果该值与集合中其他对象的值相同,那么就认为重复,不相同认为不重复
2,不重复直接存储,如果存储的对象的hashcode值与已经在集合中的对象hashcode值重复,调用对象的equals方法与重复的对象进行比较
3,如果equals也相同,认为重复,此时不在给集合中存储.如果不相同,那么存储到集合中
使用场景:
如:图书管理系统录入图书信息
将书籍信息存入到集合中,如果属性值都相同认为重复,不在存储
如果相同提示已经录入
书籍信息:
书名
作者
出版社
价格
编号
出版时间
/*
* 1,如:图书管理系统录入图书信息
将书籍信息存入到集合中,如果属性值都相同认为重复,不在存储
如果相同提示已经录入
书籍信息:
书名
作者
出版社
价格
编号
出版时间
*/
public class Book {
private String bookName;
private String writerName;
private double money;
public Book() {
super();
}
public Book(String bookName, String writerName, double money) {
super();
this.bookName = bookName;
this.writerName = writerName;
this.money = money;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getWriterName() {
return writerName;
}
public void setWriterName(String writerName) {
this.writerName = writerName;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
@Override
public String toString() {
return "Student [bookName=" + bookName + ", writerName=" + writerName + ", money=" + money + "]";
}
@Override
public int hashCode() { //需要重写hashCode方法
int num01 = bookName.hashCode();
int num02 = writerName.hashCode();
//return num01+num02+(int)money;
return (int)money;
}
@Override
public boolean equals(Object obj) { //需要重写equals方法
if (this == obj) {
return true;
}
if (obj instanceof Book) {
Book student = (Book) obj;
if (this.bookName.equals(student.bookName) &&
this.writerName.equals(student.writerName) &&
this.money == student.money) {
return true;
}
}
return false;
}
}
import java.util.HashSet;
import java.util.LinkedHashSet;
/*
* 1,如:图书管理系统录入图书信息
将书籍信息存入到集合中,如果属性值都相同认为重复,不在存储
如果相同提示已经录入
书籍信息:
书名
作者
出版社
价格
编号
出版时间
*/
public class Demo01 {
public static void main(String[] args) {
LinkedHashSet<Book> list = new LinkedHashSet<Book>();
Book student01 = new Book("Java基础", "张三", 1000);
Book student02 = new Book("Java初级", "李四", 10000);
Book student03 = new Book("Java中级", "王五", 100000);
Book student04 = new Book("Java高级", "小明", 1000000);
Book student05 = new Book("Java初级", "李四", 10000);
if (!list.add(student01)) {
System.out.println("输入书籍重复");
}
if (!list.add(student02)) {
System.out.println("输入书籍重复");
}
if (!list.add(student03)) {
System.out.println("输入书籍重复");
}
if (!list.add(student04)) {
System.out.println("输入书籍重复");
}
if (!list.add(student05)) {
System.out.println("输入书籍重复");
}
for (Book s : list) {
System.out.println(s);
}
}
}
LinkedHashSet
LinkedHashSet是HashSet的子类,所在存储原理一致
注意:LinkedHashSet的数据结构比HashSet多了一个链表,该连接是用于记录存储数据的顺序,所以LinkedHashSet是有序的
TreeSet
数据结构:红黑树+自定义
存储的要求:
方案1,指定比较器
方案2,存储的数据拥有比较性
如果以上两个方案都没有使用,那么给TreeSet中存值会报错
方案1:
创建TreeSet对象时,指定比较器
重写compare方法
原理:
每次存入对象时,使用对于集合中原有的对象进行比较(使用的是compare方法)
如果集合中没有值,那么自己与自己比,比完后存入
如果集合中已经存在数据,那么使用本次存入的数据与集合中已有的数据一一比较
如果有相同就证明重复,剔重,并结束比较
如果没有相同的数据,那么将本次存入的数据存储到集合中
/*
* 使用TreeSet存入以下信息
张三 男 18 220901
李四 女 21 220905
王五 男 28 220903
小花 女 19 220902
老王 男 25 220908
要求:使用比较器与比较性两种方式
*/
public class Person implements Comparable<Person>{//实现Comparable接口
private String name;
private String sex;
private int age;
private int birthday;
public Person() {
super();
}
public Person(String name, String sex, int age, int birthday) {
super();
this.name = name;
this.sex = sex;
this.age = age;
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getBirthday() {
return birthday;
}
public void setBirthday(int birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Person [name=" + name + ", sex=" + sex + ", age=" + age + ", birthday=" + birthday + "]";
}
@Override
public int compareTo(Person o) {//重写compareTo方法
if (this.name == null || this.sex == null ) {
return 0;
}
int nameNum = this.getName().compareTo(o.getName());
int sexNum = this.getSex().compareTo(o.getSex());
int ageNum = this.getAge() - o.getAge();
int birthdayNum = this.getBirthday() - o.getBirthday();
//return nameNum+sexNum+ageNum+birthdayNum;
return ageNum;
}
}
import java.util.TreeSet;
/*
* 使用TreeSet存入以下信息
张三 男 18 220901
李四 女 21 220905
王五 男 28 220903
小花 女 19 220902
老王 男 25 220908
要求:使用比较器与比较性两种方式
*/
public class Demo05 {
public static void main(String[] args) {
TreeSet<Person> list = new TreeSet<Person>();
Person person01 = new Person("张三", "男", 18, 220901);
Person person02 = new Person("李四", "女", 21, 220905);
Person person03 = new Person("王五", "男", 28, 220903);
Person person04 = new Person("小花", "女", 19, 220902);
Person person05 = new Person("老王", "男", 25, 220908);
list.add(person01);
list.add(person02);
list.add(person03);
list.add(person04);
list.add(person05);
for (Person person : list) {
System.out.println(person);
}
}
}
方案2:
创建TreeSet存储的对象所属的类要拥有比较性
让存储的对象所属的类实现实现Comparable接口
/*
* 使用TreeSet存入以下信息
张三 男 18 220901
李四 女 21 220905
王五 男 28 220903
小花 女 19 220902
老王 男 25 220908
要求:使用比较器与比较性两种方式
*/
public class Person02 {
private String name;
private String sex;
private int age;
private int birthday;
public Person02() {
super();
}
public Person02(String name, String sex, int age, int birthday) {
super();
this.name = name;
this.sex = sex;
this.age = age;
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getBirthday() {
return birthday;
}
public void setBirthday(int birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Person [name=" + name + ", sex=" + sex + ", age=" + age + ", birthday=" + birthday + "]";
}
}
import java.util.Comparator;
import java.util.TreeSet;
import com.qf.demo05.Person;
public class Demo06 {
public static <T> void main(String[] args) {
TreeSet<Person02> list = new TreeSet<Person02>(new Comparator<Person02>() {
@Override
public int compare(Person02 o1, Person02 o2) {
int nameNum = o1.getName().compareTo(o2.getName());
int sexNum = o1.getSex().compareTo(o2.getSex());
int ageNum = o1.getAge() - o2.getAge();
int birthdayNum = o1.getBirthday() - o2.getBirthday();
return nameNum + sexNum + ageNum + birthdayNum;
}
});
Person02 person01 = new Person02("张三", "男", 18, 220901);
Person02 person02 = new Person02("李四", "女", 21, 220905);
Person02 person03 = new Person02("王五", "男", 28, 220903);
Person02 person04 = new Person02("小花", "女", 19, 220902);
Person02 person05 = new Person02("老王", "男", 25, 220908);
list.add(person01);
list.add(person02);
list.add(person03);
list.add(person04);
list.add(person05);
for (Person02 person022 : list) {
System.out.println(person022);
}
}
}