Set
特点:无序,无下标,不可重复
没有提供特有方法
HashSet剃重原理
原理:
1,给
HashSet
中存储对象时
,
会默认调用对象的
hashcode
方法
,
获取其值
,
如果该值与集合中其他
对象的值相同,那么就认为重复,不相同认为不重复
2,不重复直接存储
,
如果存储的对象的
hashcode
值与已经在集合中的对象
hashcode
值重复
,
调
用对象的 equals方法与重复的对象进行比较
3,如果
equals
也相同
,
认为重复
,
此时不在给集合中存储
.
如果不相同
,
那么存储到集合中
例:图书馆存储图书信息
属性:书名...
当出现重复时,不存储
package com.qf.homework01;
public class Book {
private String bookname;
private String writer;
private String chubanshe;
private int price;
private String number;
private String time;
public Book() {
super();
}
public Book(String bookname, String writer, String chubanshe, int price, String number, String time) {
super();
this.bookname = bookname;
this.writer = writer;
this.chubanshe = chubanshe;
this.price = price;
this.number = number;
this.time = time;
}
public String getBookname() {
return bookname;
}
public void setBookname(String bookname) {
this.bookname = bookname;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getChubanshe() {
return chubanshe;
}
public void setChubanshe(String chubanshe) {
this.chubanshe = chubanshe;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
@Override
public String toString() {
return "Book [bookname=" + bookname + ", writer=" + writer + ", chubanshe=" + chubanshe + ", price=" + price
+ ", number=" + number + ", time=" + time + "]";
}
//重写方法
@Override
public int hashCode() {
return bookname.hashCode()+writer.hashCode()+chubanshe.hashCode()+number.hashCode()+time.hashCode()+price;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Book) {
Book book = (Book) obj;
if (this.bookname.equals(book.bookname)
&&this.writer.equals(book.writer)
&&this.chubanshe.equals(book.chubanshe)
&&this.price==book.price
&&this.number.equals(book.number)
&&this.time.equals(book.time)) {
return true;
}
}
return false;
}
}
package com.qf.homework01;
import java.util.HashSet;
import java.util.Set;
public class Test {
public static void main(String[] args) {
HashSet<Book> books = new HashSet<Book>();
Book book01 = new Book("四世同堂", "老舍", "北京大学出版社", 54, "10001", "1998.9.3");
Book book02 = new Book("家", "巴金", "北京大学出版社", 30, "10002", "1998.7.15");
Book book03 = new Book("四世同堂", "老舍", "北京大学出版社", 54, "10001", "1998.9.3");
Book book04 = new Book("四世同堂", "老舍", "北京大学出版社", 54, "10001", "1998.9.3");
books.add(book01);
books.add(book02);
books.add(book03);
boolean a04 = books.add(book04);
if (!a04) {
System.out.println("第四本书籍重复");
}
for (Book book : books) {
System.out.println(book);
}
}
}
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
package com.qf.homework04;
//比较器
import java.util.Comparator;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
TreeSet<Person> treeSet = new TreeSet<Person>(new Comparator<Person>() {
public int compare(Person o1, Person o2) {
int nameNum = o1.getName().compareTo(o2.getName());
int sexNum = o1.getSex().compareTo(o2.getSex());
int ageNum = o1.getAge()-o2.getAge();
int numberNum = o1.getNumber()-o2.getNumber();
return numberNum;
}
});
Person person1 = new Person("张三", "男", 18, 220901);
Person person2 = new Person("李四", "女", 21, 220905);
Person person3 = new Person("王五", "男", 28, 220903);
Person person4 = new Person("小花", "女", 19, 220902);
Person person5 = new Person("老王", "男", 25, 220908);
treeSet.add(person1);
treeSet.add(person5);
treeSet.add(person4);
treeSet.add(person2);
treeSet.add(person3);
for (Person person : treeSet) {
System.out.println(person);
}
}
}
package com.qf.homework04;
public class Person {
private String name;
private String sex;
private int age;
private int number;
public Person(String name, String sex, int age, int number) {
super();
this.name = name;
this.sex = sex;
this.age = age;
this.number = number;
}
public Person() {
super();
}
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 getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
@Override
public String toString() {
return "Person [name=" + name + ", sex=" + sex + ", age=" + age + ", number=" + number + "]";
}
}
方案
2:
创建TreeSet
存储的对象所属的类要拥有比较性
让存储的对象所属的类实现实现Comparable
接口
.例:
,
使用
TreeSet
存入以下信息
张三 男 18 220901
李四 女 21 220905
王五 男 28 220903
小花 女 19 220902
老王 男 25 220908
package com.qf.homework05;
import java.util.TreeSet;
//比较法
public class Test05 {
public static void main(String[] args) {
TreeSet<Person> treeSet = new TreeSet<Person>();
Person person1 = new Person("张三", "男", 18, 220901);
Person person2 = new Person("李四", "女", 21, 220905);
Person person3 = new Person("王五", "男", 28, 220903);
Person person4 = new Person("小花", "女", 19, 220902);
Person person5 = new Person("老王", "男", 25, 220908);
treeSet.add(person1);
treeSet.add(person5);
treeSet.add(person4);
treeSet.add(person2);
treeSet.add(person3);
for (Person person : treeSet) {
System.out.println(person);
}
}
}
package com.qf.homework05;
public class Person implements Comparable<Person> {
private String name;
private String sex;
private int age;
private int number;
public Person(String name, String sex, int age, int number) {
super();
this.name = name;
this.sex = sex;
this.age = age;
this.number = number;
}
public Person() {
super();
}
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 getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
@Override
public String toString() {
return "Person [name=" + name + ", sex=" + sex + ", age=" + age + ", number=" + number + "]";
}
@Override
public int compareTo(Person o) {
if (this.name == null||this.sex==null||age==0) {
return 0;
}
int nameNum = this.getName().compareTo(o.getName());
int sexNum = this.getSex().compareTo(o.getSex());
int ageNum = this.getAge()-o.getAge();
int numberNum = this.getNumber()-o.getNumber();
return numberNum;
}
}