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

Java中Scanner输入字符串与"y"用==比较返回false问题排查

为什么Java中用==比较输入的字符串"y"总是返回false?

嘿,这个问题我刚入门Java的时候也踩过一模一样的坑!让我给你拆解一下问题所在:

核心原因:==比较的是对象引用,不是内容

在Java里,String是引用类型,而非int、boolean这类基本数据类型。当你用==比较两个字符串时,它实际检查的是这两个字符串对象在内存中的引用地址是否相同,而非它们的内容是否一致。

你通过Scanner.nextLine()获取的输入字符串,是在堆内存中新创建的一个String对象;而代码里的字面量"y"是存在字符串常量池里的对象。这两个对象的内存地址完全不一样,所以response == "y"自然会返回false。

正确的解决方案:用equals()方法比较内容

要比较两个字符串的内容是否相等,你需要使用String类自带的equals()方法,它就是专门用来判断字符串内容一致性的。

修改后的代码如下:

import java.util.Scanner;
class Main {
    public static void main(String[] args) {
        Scanner UserInput = new Scanner(System.in);
        System.out.println("\nResponse:");
        String response = UserInput.nextLine();
        // 用equals()比较字符串内容
        System.out.println(response.equals("y"));
        // 如果需要忽略大小写(比如输入Y也能匹配),可以用equalsIgnoreCase()
        // System.out.println(response.equalsIgnoreCase("y"));
    }
}

补充小知识点:字符串常量池的特例

如果是两个字符串字面量直接赋值,比如:

String a = "y";
String b = "y";
System.out.println(a == b); // 这里会返回true

这是因为Java的字符串常量池会复用相同的字面量对象,所以a和b指向的是同一个内存地址,==就会返回true。但这种情况只适用于字面量直接赋值的场景,通过输入、new String()等方式创建的字符串对象,不会进入常量池复用,所以还是得用equals()。

内容的提问来源于stack exchange,提问作者Liliacfury

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:07:46