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

浅丽小哥_7885

浅丽小哥_7885

2026-04-11

658人浏览

原创

本文讲解在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())) // ✅ 安全写法

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

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

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

Java Maven Common
Java Maven Common

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

下载

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

  • 逻辑位置问题:匹配检测被放在“添加捐赠者”分支内,导致仅在新增捐赠时才尝试匹配,而遗漏了“先有需求后有捐赠”的场景。理想做法是提供独立的“匹配并输出”功能(如菜单选项4),或在每次添加后统一触发匹配。
  • 重复扫描开销:每次添加捐赠者就遍历全部需求列表,时间复杂度 O(n×m),大数据量下效率低;可考虑用 Map> 按器官索引需求方,实现 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 <p><strong>注意事项总结:</strong>  </p>
<ul>
<li>✅ 永远用 Objects.equals(a, b) 替代 a == b 比较字符串内容(自动处理 null);  </li>
<li>✅ 将匹配逻辑抽离为独立方法,提升可读性与可测试性;  </li>
<li>✅ 输入后调用 .trim() 防止前后空格导致匹配失败;  </li>
<li>⚠️ 若需真实业务系统,应增加器官兼容性校验(如血型、HLA配型),而不仅是名称匹配;  </li>
<li>? 后续可升级为使用 HashMap<string queue>> 实现 O(1) 匹配,并支持优先级队列管理等待列表。</string>
</li>
</ul>
<p>掌握字符串比较的本质差异,是写出健壮Java程序的第一道关键门槛——它不只关乎器官匹配,更关乎所有基于内容判断的业务逻辑可靠性。</p></organinfo></organinfo>

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

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

2023.06.15

10957

6

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

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

2023.07.05

8082

9

java自学难吗
java自学难吗

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

2023.07.31

6992

8

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

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

2023.08.01

1184

3

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

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

2023.08.02

968

3

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

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

2023.08.02

1416

5

java有什么用
java有什么用

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

2023.08.02

2889

5

java在线网站
java在线网站

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

2023.08.03

20171

3

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

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1275

8

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习