讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在Java中正确比较列表中配对对象的字符串字段

浅丽小哥_7885

浅丽小哥_7885

发布时间:2026-04-11 16:42:40

|

658人浏览过

|

来源于php中文网

原创

本文讲解在Java中比较两个列表中对象的字符串属性(如器官名称)时,为何不能使用==而必须用equals(),并通过器官捐献注册系统实例说明修复方法、代码优化与常见陷阱。

本文讲解在java中比较两个列表中对象的字符串属性(如器官名称)时,为何不能使用`==`而必须用`equals()`,并通过器官捐献注册系统实例说明修复方法、代码优化与常见陷阱。

在Java中,字符串是引用类型,== 比较的是两个变量是否指向内存中的同一对象实例,而非内容是否相等。即使两个 String 对象内容完全相同(例如都为 "heart"),若由不同构造方式生成(如字面量 vs new String()),== 仍可能返回 false。因此,比较字符串内容必须使用 .equals() 方法。

回到你的器官捐献系统,问题核心出现在嵌套循环中的这一行:

if(oNeeded.get(k).getOrgan() == oDonated.get(i).getOrgan()) // ❌ 错误!

应修正为:

if("".equals(oNeeded.get(k).getOrgan()) ? 
   "".equals(oDonated.get(i).getOrgan()) : 
   oNeeded.get(k).getOrgan().equals(oDonated.get(i).getOrgan())) // ✅ 安全写法

更简洁且推荐的写法(避免空指针):

立即学习“Java免费学习笔记(深入)”;

Java Maven Common
Java Maven Common

Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。

下载
if(Objects.equals(oNeeded.get(k).getOrgan(), oDonated.get(i).getOrgan()))

✅ 前提:在类顶部添加 import java.util.Objects;

此外,原代码存在多个可优化点:

  • 逻辑位置问题:匹配检测被放在“添加捐赠者”分支内,导致仅在新增捐赠时才尝试匹配,而遗漏了“先有需求后有捐赠”的场景。理想做法是提供独立的“匹配并输出”功能(如菜单选项4),或在每次添加后统一触发匹配。
  • 重复扫描开销:每次添加捐赠者就遍历全部需求列表,时间复杂度 O(n×m),大数据量下效率低;可考虑用 Map<String, List<OrganInfo>> 按器官索引需求方,实现 O(1) 查找。
  • 输入处理缺陷:sc.next() 不读取换行符,后续 nextLine() 可能跳过输入;建议统一用 sc.nextLine() 并注意清理缓冲区。

以下是修复后的关键片段(含健壮性增强):

import java.util.*;
// ... 其他导入

public class OrganDonation {
    // 使用泛型明确类型,避免强制转换
    private static ArrayIndexedList<OrganInfo> oDonated = new ArrayIndexedList<>();
    private static ArrayIndexedList<OrganInfo> oNeeded = new ArrayIndexedList<>();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        boolean running = true;

        System.out.println(menuOfOptions());
        String input = sc.nextLine().trim();

        while (running) {
            switch (input) {
                case "1":
                    System.out.print("For who? "); String need = sc.nextLine().trim();
                    System.out.print("What organ? "); String organ1 = sc.nextLine().trim();
                    oNeeded.add(new OrganInfo(organ1, need));
                    System.out.println("✓ Recipient registered.\n");
                    break;

                case "2":
                    System.out.print("By who? "); String donor = sc.nextLine().trim();
                    System.out.print("What organ? "); String organ2 = sc.nextLine().trim();
                    oDonated.add(new OrganInfo(organ2, donor));
                    System.out.println("✓ Donor registered.");
                    performMatching(); // 独立匹配方法,清晰可复用
                    break;

                case "3":
                    running = false;
                    System.out.println("Goodbye!");
                    break;

                default:
                    System.out.println("Invalid selection. Please try again.\n");
            }

            if (running) {
                System.out.println(menuOfOptions());
                input = sc.nextLine().trim();
            }
        }
        sc.close();
    }

    // ✅ 核心修复:使用 Objects.equals 安全比较字符串
    private static void performMatching() {
        for (int i = 0; i < oDonated.size(); i++) {
            String donatedOrgan = oDonated.get(i).getOrgan();
            for (int k = 0; k < oNeeded.size(); k++) {
                String neededOrgan = oNeeded.get(k).getOrgan();
                if (Objects.equals(donatedOrgan, neededOrgan)) {
                    System.out.printf("%s's %s was matched to %s%n", 
                        oDonated.get(i).getPerson(),
                        donatedOrgan,
                        oNeeded.get(k).getPerson()
                    );
                    // 可选:移除已匹配项防止重复匹配
                    // oNeeded.remove(k--); break;
                }
            }
        }
    }

    // ... OrganInfo 内部类(保持不变,但建议将字段设为 final)
    public static class OrganInfo {
        private final String _organ;
        private final String _person;

        public OrganInfo(String organ, String person) {
            this._organ = organ == null ? "" : organ.trim();
            this._person = person == null ? "" : person.trim();
        }

        public String getOrgan() { return _organ; }
        public String getPerson() { return _person; }
    }

    public static String menuOfOptions() {
        return """
                1.) Register organ needed.
                2.) Register organ donated.
                3.) Exit.
                ----------------------------
                Select 1, 2 or 3: """;
    }
}

注意事项总结:

  • ✅ 永远用 Objects.equals(a, b) 替代 a == b 比较字符串内容(自动处理 null);
  • ✅ 将匹配逻辑抽离为独立方法,提升可读性与可测试性;
  • ✅ 输入后调用 .trim() 防止前后空格导致匹配失败;
  • ⚠️ 若需真实业务系统,应增加器官兼容性校验(如血型、HLA配型),而不仅是名称匹配;
  • ? 后续可升级为使用 HashMap<String, Queue<OrganInfo>> 实现 O(1) 匹配,并支持优先级队列管理等待列表。

掌握字符串比较的本质差异,是写出健壮Java程序的第一道关键门槛——它不只关乎器官匹配,更关乎所有基于内容判断的业务逻辑可靠性。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

10957

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

8082

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

6992

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1184

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

968

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1416

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2889

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

20171

2023.08.03

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn