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

Java中何时开始可使用==比较字符串?

Java字符串字面量==比较返回true的机制起始版本

你提到的测试代码如下:

String s = "hello";
System.out.println(s == "hello");
System.out.println(s.equals("hello"));

使用JDK 19.0.1运行后两个表达式结果均为true,但这和你初学Java时认为第一个表达式应返回false的认知冲突,你想知道这个机制是从哪个Java版本开始的。

其实这个字符串常量池的机制从Java 1.0版本就存在了,并不是后续版本新增的优化。

  • 当你直接使用字符串字面量(比如"hello")声明变量时,JVM会先检查字符串常量池:如果池子里已经有相同内容的字符串对象,就直接返回该对象的引用;如果没有,就创建新对象放入池中再返回引用。
  • 你的代码里,String s = "hello"会把常量池中"hello"的引用赋值给s;后面的"hello"字面量同样指向常量池里的同一个对象,所以用==比较引用地址会返回true。

你初学的认知偏差大概率是混淆了字面量声明和new String("hello")的情况:如果用new String("hello")创建对象,JVM会在堆内存中新建一个独立的对象,此时它和常量池中的"hello"引用地址不同,用==比较才会返回false。

IDE发出警告是因为==比较字符串存在风险:一旦代码中出现通过new创建、或者通过拼接等方式生成的非常量池字符串,==就会返回错误结果,所以始终推荐用equals()来比较字符串内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:25:23