From 820e0d0c8b2a88326fd3f85eae362ae4fedeb6f4 Mon Sep 17 00:00:00 2001
From: yanzhongxin <747328867@qq.com>
Date: Tue, 25 Nov 2025 21:26:08 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DObjectUtil.contains=E5=A4=84?=
=?UTF-8?q?=E7=90=86=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=B1=BB=E5=9E=8B=E4=B8=8D?=
=?UTF-8?q?=E5=90=88=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/cn/hutool/core/util/ObjectUtil.java | 19 +++++++--
.../cn/hutool/core/util/ObjectUtilTest.java | 42 +++++++++++++++++++
2 files changed, 57 insertions(+), 4 deletions(-)
diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java
index 8f08980aa..9b2bbb14a 100644
--- a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java
@@ -128,7 +128,7 @@ public class ObjectUtil {
* 对象中是否包含元素
* 支持的对象类型包括:
*
- * - String
+ * - CharSequence
* - Collection
* - Map
* - Iterator
@@ -144,11 +144,22 @@ public class ObjectUtil {
if (obj == null) {
return false;
}
- if (obj instanceof String) {
- if (element == null) {
+ if (obj instanceof CharSequence) {
+ if (!(element instanceof CharSequence)) {
return false;
}
- return ((String) obj).contains(element.toString());
+ String elementStr;
+ try {
+ elementStr = element.toString();
+ // 检查 toString() 返回 null 的情况
+ if (elementStr == null) {
+ return false;
+ }
+ } catch (Exception e) {
+ // 如果toString抛异常,认为不包含
+ return false;
+ }
+ return obj.toString().contains(elementStr);
}
if (obj instanceof Collection) {
return ((Collection>) obj).contains(element);
diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ObjectUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ObjectUtilTest.java
index 91a841887..efeb67f29 100644
--- a/hutool-core/src/test/java/cn/hutool/core/util/ObjectUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/util/ObjectUtilTest.java
@@ -135,4 +135,46 @@ public class ObjectUtilTest {
// 枚举已经无法使用
assertFalse(enumeration.hasMoreElements());
}
+
+ @Test
+ public void testContainsElementToStringReturnsNull() {
+ Object problematicElement = new Object() {
+ @Override
+ public String toString() {
+ return null; // 返回 null 的 toString
+ }
+ };
+ assertFalse(ObjectUtil.contains("test", problematicElement)); //不会抛异常
+ }
+
+ @Test
+ public void testContainsElementToStringInvalidSyntax() {
+ //字符串包含自定义User对象不符合语义
+ assertFalse(ObjectUtil.contains("User[id=123]", new User(123)));
+ }
+
+
+ static class User{
+ private int id;
+ public User(int id) {
+ this.id = id;
+ }
+ @Override
+ public String toString() {
+ return "User[" +
+ "id=" + id +
+ ']';
+ }
+ }
+
+ @Test
+ public void testContainsCharSequenceSupported() {
+ //contains方法支持String、StringBuilder、StringBuffer
+ StringBuilder stringBuilder = new StringBuilder("hello world");
+ StringBuffer stringBuffer = new StringBuffer("hello world");
+ String str = "hello world";
+ assertTrue((ObjectUtil.contains(stringBuilder, "world")));
+ assertTrue(ObjectUtil.contains(stringBuffer, "hello"));
+ assertTrue(ObjectUtil.contains(str, "hello"));
+ }
}