java字符串判空需区分null、""和" ":null无对象引用,调用方法抛npe;""是长度为0的真实对象;推荐使用stringutils.isblank()或jdk11+的isblank()处理语义空白。

Java 字符串判空看似简单,但面试常考——关键不在“会不会写”,而在“为什么这么写”“不同方法适用什么场景”。核心要分清三组概念:null、""(空字符串)、" "(纯空白),以及它们背后涉及的内存模型、空指针风险和语义差异。
一、null 和 "" 的本质区别必须讲清楚
这是所有判空逻辑的前提:
-
null:不是对象,没分配堆内存,只是栈中一个空引用;调用任何方法(如
.length()、.equals())会直接抛NullPointerException;==可安全比较,.equals()不能以 null 为调用方。 -
"":是真实对象,堆中已分配空间,长度为 0;可安全调用所有 String 方法;
"".equals(str)是防御性写法,把空串放前面,避免 str 为 null 时崩溃。
二、四种主流判空方式的逻辑与风险点
按 JDK 版本和语义严格程度排列:
-
str == null || str.length() == 0:效率高(直接读 length 字段),兼容老版本,但不处理空白字符;注意顺序不能颠倒,否则 null 调用 length() 报错。 -
str == null || str.isEmpty():JDK 1.6+ 引入,语义清晰,底层就是length() == 0,性能几乎等同;仍不识别空格。 -
str == null || str.trim().isEmpty():能过滤前后空格,适合表单校验;但trim()新建字符串对象,有轻微开销,且不处理中间换行、制表符等全类型空白。 -
str == null || str.isBlank():JDK 11+ 新增,真正语义上的“空白判断”——涵盖""、"\t"、"\n"、" "等所有 Unicode 空白;推荐用于现代项目,但需确认 JDK 版本兼容性。
三、为什么推荐 StringUtils 工具类?
Apache Commons Lang 的 StringUtils.isEmpty(str) 和 StringUtils.isBlank(str) 不仅封装了判空逻辑,更重要的是:
- 内部已做
null安全校验,调用者无需再写== null; -
isEmpty()等价于str == null || str.length() == 0; -
isBlank()等价于str == null || str.trim().isEmpty()(JDK 11 前的兼容实现); - 项目中统一使用,减少重复代码,提升可读性和健壮性。
四、面试高频陷阱题怎么答
遇到类似问题,别只列代码,要带判断依据:
-
问:“if (str.equals(\"\") || str == null)” 是否正确?
答:错误。顺序反了,str 为 null 时先执行equals会 NPE;正确写法是str == null || str.equals("")或更优的"".equals(str)。 -
问:“isEmpty() 和 isBlank() 区别?”
答:前者只认长度为 0;后者额外识别所有空白字符,语义更贴近“用户没输有效内容”。 -
问:“String s = new String(); 是 null 还是 \"\"?”
答:是"",不是 null;new String()构造出长度为 0 的对象,已分配内存。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











