为什么Java中"00" == "0".repeat(2)的返回结果为false?
问题原因分析
这个问题是Java字符串比较的典型误区,核心是混淆了==运算符和equals()方法的作用:
- 对于引用类型(比如String类对象),
==比较的是两个对象在JVM内存中的引用地址是否相同,并不会判断对象存储的内容是否一致 - 要对比两个字符串的实际内容,必须调用
equals()方法,也就是"00".equals("0".repeat(2))才会返回你预期的true。
为什么内容相同的字符串引用地址不同?
JVM有字符串常量池机制:直接写在代码里的字符串字面量(比如你示例中的"00"、"0")会被存储在常量池中,相同内容的字面量会被复用,节省内存空间。但运行时动态生成的字符串(包括拼接、方法逻辑生成的字符串)默认是在堆内存中新建的独立对象,不会自动加入常量池,因此和常量池中的"00"引用地址不同,==对比自然返回false。
你自定义的repeat方法中,+=拼接字符串的底层是通过StringBuilder完成拼接,最后调用toString()返回的是堆中新创建的字符串对象,和常量池中的"00"不是同一个对象,因此==对比结果也是false。
正确写法示例
public static void main(String[] args) { // 对比字符串内容统一使用equals方法,这是Java字符串对比的标准写法 System.out.println("00".equals(repeat("0",2))); // 输出true } public static String repeat(String str, int n) { String output = ""; for (int i = 0; i < n; i++) { output += str; } return output; }
内容的提问来源于stack exchange,提问作者Instinct
相关产品推荐
相关产品推荐

