Java中if(value=="")判断空字符串为何返回false?
为什么
if(value=="")的判断结果为false? 这是Java里一个非常常见的新手误区,核心原因是你混淆了引用相等和值相等的判断逻辑!
先看你给出的代码:
public static void main(String[] args) { String value="abc"; value=""; if(value==""){ System.out.println("blank "+value); } }
先澄清一个小细节:你的这段代码其实会输出结果?
按照Java的字符串常量池机制,value=""和判断里的""是同一个字符串常量池中的对象,==判断应该返回true才对。不过你说结果是false,大概率是实际场景中value的赋值方式不是直接用字面量"",而是通过其他方式得到的空字符串(比如new String("")、从IO流读取、或者字符串拼接生成的空字符串)——这些情况下,value的引用和字面量""的引用就不一样了。
为什么会出现这个问题?
==在Java中对于引用类型(比如String),判断的是两个变量是否指向内存中的同一个对象(也就是引用地址是否相等)。- 字符串字面量(比如
""、"abc")会被JVM存入字符串常量池,当你再次使用相同的字面量时,JVM会直接返回常量池中的已有对象引用,所以直接赋值字面量的话,==会成立。 - 但如果
value是通过new String("")创建的,或者是通过动态生成的(比如someStr.substring(0,0)),这个字符串对象会被创建在堆内存中,而不是常量池里,这时候它的引用和常量池中的""就不是同一个,==判断就会返回false。
正确的判断方式是什么?
如果你要判断字符串的值是否为空,应该使用equals()方法,或者更严谨的Objects.equals()(避免空指针异常):
// 方式1:直接用equals,注意先判断value不为null,否则会抛NullPointerException if (value != null && value.equals("")) { System.out.println("blank " + value); } // 方式2:用Objects.equals,自动处理null情况,更安全 import java.util.Objects; if (Objects.equals(value, "")) { System.out.println("blank " + value); } // 方式3:判断字符串长度为0,也是常用方法 if (value != null && value.length() == 0) { System.out.println("blank " + value); } // 方式4:Java 6+ 可以用isEmpty(),同样要先判断null if (value != null && value.isEmpty()) { System.out.println("blank " + value); }
额外补充:字符串常量池的小技巧
如果确实想让动态生成的字符串也能在常量池中匹配,可以使用intern()方法,它会将当前字符串对象的引用指向常量池中的对应对象(如果存在的话):
String value = new String(""); value = value.intern(); if (value == "") { // 现在会返回true了 System.out.println("blank " + value); }
不过一般不推荐这么做,因为intern()会占用常量池空间,而且代码可读性远不如直接用equals()。
内容的提问来源于stack exchange,提问作者kiranB
相关产品推荐
相关产品推荐

