You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

哈希库代码求助: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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:43:18