核⼼考点
:TreeSet 定制排序、重写 equals/hashCode、Set 唯⼀校验、对象⾃然排序 题⽬要求:
-
封装 Book 类:ISBN(唯⼀)、书名、作者、价格;
-
ISBN 相同则视为同⼀ 本书,Set ⾃动去重;
-
使⽤ TreeSet 存储,排序规则:价格升序 → 书名字典序;
-
验证重复 ISBN 的图书⽆法添加;
-
输出所有图书。
打印结果:
=====图书列表(去重+排序)=====
Book{ISBN='97803', 书名='Spring实战', 价格=89.0}
Book{ISBN='97802', 书名='深⼊理解JVM', 价格=89.0}
Book{ISBN='97801', 书名='Java编程思想', 价格=108.0}
. 封装 Book 类
- 创建
Book类,包含 4 个成员变量:isbn(唯一标识)书名作者价格
- 生成无参 / 有参构造、getter/setter、toString
2. 实现去重规则:ISBN 相同视为同一本书
TreeSet / HashSet 去重都依赖两个方法:
- equals()
- hashCode()
必须重写这两个方法:
- 比较规则:只比较 isbn
- 如果 isbn 相同 → 返回 true,视为同一个对象 → Set 自动去重
3. TreeSet 定制排序规则
题目要求排序规则: 价格升序 → 价格相同则按书名字典序升序
实现方式:
- 让
Book类 实现 Comparable<Book> 接口 - 重写
compareTo(Book o)方法
排序逻辑:
- 先比较价格:价格小 → 排在前面
- 如果价格相同 ,再比较书名(字典序)
4. TreeSet 去重的关键规则(必考点)
TreeSet 不使用 equals/hashCode 去重 ! TreeSet 完全依靠 compareTo 方法的返回值判断是否重复:
- 返回 0 → 视为重复元素,不添加
- 返回非 0 → 视为不同元素
所以: 必须让 compareTo 在 isbn 相同时返回 0 才能保证 ISBN 重复的书无法添加。
最终 compareTo 逻辑:
- 先判断:如果当前书 isbn 与比较书 isbn 相同 → 直接 return 0(强制去重)
- 否则按照:价格升序 → 书名字典序 排序
5. 测试类逻辑
- 创建
TreeSet<Book>集合 - 添加多本图书(包含 ISBN 重复的书)
- 遍历集合输出
- 验证:ISBN 重复的书不会被添加
- 输出结果按:价格升序 → 书名排序
核心考点总结(纯文字背会就能写对)
- Book 类:4 个属性 + toString
- 去重:重写 equals + hashCode,只比较 ISBN
- 排序:Book 实现 Comparable,重写 compareTo
- TreeSet 去重关键:ISBN 相同 → compareTo 返回 0
- 排序规则:价格升序 → 书名字典序
- 验证:重复 ISBN 无法添加,输出有序且无重复
package com.sy.Task;
import java.util.Objects;
import java.util.TreeSet;
public class Book3 implements Comparable<Book3> {
private String isbn;
private String name;
private String author;
private double price;
public Book3() {
}
public Book3(String isbn, String name, String author, double price) {
this.isbn = isbn;
this.name = name;
this.author = author;
this.price = price;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Book3{" +
"isbn='" + isbn + '\'' +
", name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book3 book3 = (Book3) o;
return Double.compare(price, book3.price) == 0 && Objects.equals(isbn, book3.isbn) && Objects.equals(name, book3.name) && Objects.equals(author, book3.author);
}
@Override
public int hashCode() {
return Objects.hash(isbn, name, author, price);
}
@Override
public int compareTo(Book3 o) {
return 0;
}
}
class BookTest {
public static void main(String[] args) {
TreeSet<Book3> bookSet = new TreeSet<>();
bookSet.add(new Book3("97803", "Spring实战", "作者A", 89.0));
bookSet.add(new Book3("97802", "深入理解JVM", "作者B", 89.0));
bookSet.add(new Book3("97801", "Java编程思想", "作者C", 108.0));
bookSet.add(new Book3("97803", "重复的书", "作者D", 99.0));
for (Book3 book : bookSet) {
System.out.println(book);
}
}
}