最佳String判断是否为空

本文探讨了在Java中检查字符串是否为空的最佳方法。通过对比`equals`方法与`length`属性,揭示了直接使用`length`进行检查在性能上的优势。同时,深入解析了String类的内部实现。

在查看别人写的代码时,会发现有人会这样来写一个判断字符串是否为空的语句。

public boolean isEmpty(String str){
    return str.equals("");        //感觉如何?
}
你有何感想?我的感想有一点,不太理解String这个类的实现。那么,最佳的使用方法是什么呢?我想,应该这样最好。

public boolean isEmpty(String str){
    return str.length()==0;        //不错吧
}

说原因之前,看看String的源码的实现。

方法length

public int length() {
	return count;
}
方法equals

public boolean equals(Object anObject) {
	if (this == anObject) {
		return true;
	}
	if (anObject instanceof String) {
		String anotherString = (String)anObject;
		int n = count;
		if (n == anotherString.count) {
			char v1[] = value;
			char v2[] = anotherString.value;
			int i = offset;
			int j = anotherString.offset;
			while (n-- != 0) {
				if (v1[i++] != v2[j++])
					return false;
			}
			return true;
		}
	}
	return false;
}

正如你看到的,lengh方法简单地返回对应字符长度的值,而equals则首先判断了是否为String的引用,然后判断了是否是String类型,创建空的数组,遍历循环等。其结果导致,大多数情况下,前者性能表现比后者更好的性能。

在 Java 中判断**多个字符串是否**,常见的“”包括: - `null` - 字符串 `""` - 或者只包含白字符的字符串(如 `" "`) 我们需要一个通用、简洁且安全的方法来检查多个 `String` 是否都为(或任意一个为)。 --- ## ✅ 推荐方法:使用工具类 + 可变参数 ### 🔹 方法一:使用 `Objects.isNull()` 和 `String.isBlank()` / `isEmpty()` #### 场景 1:判断 **所有字符串是否都为或 null** ```java import java.util.Objects; public class StringHelper { public static boolean areAllEmpty(String... strings) { for (String str : strings) { if (str != null && !str.isEmpty()) { return false; // 只要有一个非,就不是全 } } return true; } // 更严格的版本:把白字符串也视为“” public static boolean areAllBlank(String... strings) { for (String str : strings) { if (str != null && !str.trim().isEmpty()) { return false; } } return true; } } ``` #### 使用示例: ```java System.out.println(areAllEmpty(null, "", " ")); // false(注意:" " 不是 empty) System.out.println(areAllBlank(null, "", " ")); // true(全部为 blank) System.out.println(areAllEmpty("hello", "")); // false ``` > 💡 Java 11+ 提供了 `String.isBlank()` 来判断白”,等价于 `str == null || str.trim().isEmpty()` #### 升级版(Java 11+): ```java public static boolean areAllBlank(String... strings) { return Arrays.stream(strings) .allMatch(str -> str == null || str.isBlank()); } ``` ✅ 简洁、函数式风格 --- #### 场景 2:判断 **是否有任何一个为** ```java public static boolean hasAnyEmpty(String... strings) { return Arrays.stream(strings) .anyMatch(str -> str == null || str.isEmpty()); } public static boolean hasAnyBlank(String... strings) { return Arrays.stream(strings) .anyMatch(str -> str == null || str.isBlank()); } ``` #### 示例: ```java System.out.println(hasAnyEmpty("a", "", "c")); // true System.out.println(hasAnyBlank("a", " ", "c")); // true(因为 " " 是 blank) System.out.println(hasAnyEmpty("a", "b", "c")); // false ``` --- ### 🔹 方法二:使用 Apache Commons Lang3(推荐生产环境) 引入依赖: ```xml <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency> ``` 然后使用: ```java import org.apache.commons.lang3.StringUtils; // 所有都为/blank? boolean allEmpty = Arrays.stream(strings).allMatch(StringUtils::isBlank); // 至少有一个为/blank? boolean anyEmpty = Arrays.stream(strings).anyMatch(StringUtils::isBlank); ``` 或者直接调用: ```java StringUtils.isAllBlank("a", "b", ""); // false StringUtils.isAnyBlank("a", "b", ""); // true ``` ✅ `StringUtils.isAnyBlank(...)` 和 `StringUtils.isAllBlank(...)` 是最简洁的方式! --- ## 🧪 测试用例对比 | 字符串输入 | `isBlank()` 判断结果 | |-----------|------------------------| | `null` | `true` | | `""` | `true` | | `" "` | `true` | | `"abc"` | `false` | 所以你可以放心用 `isBlank()` 做全面判。 --- ## ✅ 最佳实践总结 | 需求 | 推荐写法 | |------|----------| | 判断多个字符串是否都为(含 null、""、" ") | `Arrays.stream(strs).allMatch(Objects::isNull)` 或 `StringUtils.isAllBlank(...)` | | 判断是否有任意一个为 | `Arrays.stream(strs).anyMatch(s -> s == null || s.isBlank())` 或 `StringUtils.isAnyBlank(...)` | | 不想引入第三方库 | 自定义方法 + `isBlank()` | | 生产项目建议 | 使用 `Apache Commons Lang3` 的 `StringUtils` | --- ## 💡 示例完整代码(无依赖版本) ```java import java.util.Arrays; import java.util.Objects; public class BlankChecker { public static boolean isBlank(String str) { return str == null || str.trim().isEmpty(); } public static boolean areAllBlank(String... strs) { return Arrays.stream(strs).allMatch(BlankChecker::isBlank); } public static boolean hasAnyBlank(String... strs) { return Arrays.stream(strs).anyMatch(BlankChecker::isBlank); } public static void main(String[] args) { System.out.println(hasAnyBlank("hello", "", "world")); // true System.out.println(areAllBlank("", " ", null)); // true } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值