哈希库代码求助:ArrayList去重功能异常排查
解决ArrayList插入重复书籍数据的问题
嘿,我来帮你搞定这个问题!你说的是想让library ArrayList不插入重复的书籍数据,但现在功能失效对吧?核心问题出在你没有给Card类(对应你的书籍对象)正确重写equals()和hashCode()方法——这俩是Java里判断对象是否“内容重复”的关键,默认的实现根本不关心你要比较的标题和作者。
为什么默认逻辑不行?
Java里所有类默认继承自Object类,Object的equals()是直接比较两个对象的内存地址,hashCode()也是基于内存地址生成的。所以哪怕两本书的标题、作者完全一样,只要是你new出来的不同对象,Java都会认为它们是“不同”的,自然没法阻止重复插入。
修复步骤
1. 给Card类重写equals和hashCode方法
假设你的Card类是用来存储书籍标题和作者的,那我们要基于这两个字段来重写方法,确保内容相同的对象会被判定为重复:
import java.util.Objects; public class Card { // 假设你的字段是书籍标题和作者 private String title; private String author; // 构造方法 public Card(String title, String author) { this.title = title; this.author = author; } // 重写equals:比较标题和作者是否完全一致 @Override public boolean equals(Object o) { // 先判断是不是同一个对象 if (this == o) return true; // 空对象或者类不一样直接返回false if (o == null || getClass() != o.getClass()) return false; // 强转后比较字段 Card book = (Card) o; return Objects.equals(title, book.title) && Objects.equals(author, book.author); } // 重写hashCode:基于标题和作者生成哈希值 @Override public int hashCode() { return Objects.hash(title, author); } // 可选:重写toString方便调试查看内容 @Override public String toString() { return "《" + title + "》 - " + author; } }
2. 在插入时判断是否已存在
现在你在HashTester的main方法里,插入书籍前用contains()方法判断,就能正确识别重复内容了:
import java.util.ArrayList; import java.util.List; @SuppressWarnings("unused") public class HashTester { public static void main(String [] args){ List<Card> library = new ArrayList<>(); // 创建两本内容完全一样的书 Card book1 = new Card("Java编程思想", "Bruce Eckel"); Card book2 = new Card("Java编程思想", "Bruce Eckel"); // 插入第一本 if (!library.contains(book1)) { library.add(book1); System.out.println("成功添加书籍:" + book1); } else { System.out.println("书籍已存在,跳过添加:" + book1); } // 插入第二本(重复) if (!library.contains(book2)) { library.add(book2); System.out.println("成功添加书籍:" + book2); } else { System.out.println("书籍已存在,跳过添加:" + book2); } // 查看最终library的内容,只会有一本书 System.out.println("\n当前图书馆书籍列表:"); library.forEach(System.out::println); } }
额外小贴士
如果你之后想提升去重的效率,推荐用HashSet代替ArrayList——HashSet的查找是基于哈希值的,比ArrayList的遍历查找快得多,而且它本身就不允许重复元素,插入时会自动调用我们重写的hashCode和equals来判断重复。
内容的提问来源于stack exchange,提问作者Mike C.
相关产品推荐
相关产品推荐

