Java中Scanner输入字符串用==判断失效的原因咨询
问题原因与解决方法
问题本质
核心问题是Java字符串比较的逻辑误区:==运算符对字符串的比较是对象引用地址的对比,而非内容对比。
- 直接赋值
String Weekday = "Monday"时,字符串会存入JVM的字符串常量池,此时判断条件中的"Monday"和变量指向的是同一个常量池对象,==返回true,判断生效。 - 通过
scanner.nextLine()获取的输入字符串,是堆内存中新创建的对象,和常量池里的字符串对象地址不同,所有==判断都会失败,程序直接走到else分支输出默认的Sunday结果。
另外代码里存在拼写错误:Satuarday应为Saturday,即便输入正确的周六名称,也会因==的问题无法匹配。
解决方法
1. 使用equals()方法比较字符串内容(推荐)
将所有Weekday == "XXX"的判断替换为Weekday.equals("XXX"),equals()方法专门用于对比字符串内容。如果需要忽略输入大小写(比如用户输入monday也能匹配),可以用Weekday.equalsIgnoreCase("XXX")。
修改后的核心代码片段:
if(Weekday.equals("Monday")){ System.out.println("Uff" + " " + Weekday + " " + "working day"); } else if(Weekday.equals("Tuesday")) { System.out.println("Uff" + " " + Weekday + " " + "working day"); } else if(Weekday.equals("Wednesday")) { System.out.println("Uff" + " " + Weekday + " " + "working day"); } else if(Weekday.equals("Thursday")) { System.out.println("Uff" + " " + Weekday + " " + "working day"); } else if(Weekday.equals("Friday")) { System.out.println("Uff" + " " + Weekday + " " + "working day"); } else if(Weekday.equals("Saturday")) { // 修正拼写错误 System.out.println("Yay" + " " + Weekday + " " + "Holiday"); } else { System.out.println("Yay" + " " + "Sunday" + " " + "Holiday"); }
2. 可选:优化代码结构
使用Java 7及以上支持的字符串switch-case语法,让代码更简洁,还能处理无效输入:
String weekday = scanner.nextLine(); switch(weekday) { case "Monday": case "Tuesday": case "Wednesday": case "Thursday": case "Friday": System.out.printf("Uff %s working day%n", weekday); break; case "Saturday": case "Sunday": System.out.printf("Yay %s Holiday%n", weekday); break; default: System.out.println("Invalid weekday input"); }
3. 不推荐:使用intern()方法入池
将输入字符串手动放入常量池:String Weekday = scanner.nextLine().intern();,这样==就能生效,但intern()会带来额外性能开销,且代码可读性差,日常开发不建议使用。
内容的提问来源于stack exchange,提问作者Goutham N
相关产品推荐
相关产品推荐

