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
相关产品推荐
相关产品推荐

