diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java
index de59ce0dd..d2fbb372c 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java
@@ -502,14 +502,16 @@ public class CollUtil {
}
/**
- * 集合1中是否包含集合2中所有的元素,即集合2是否为集合1的子集, 不考虑元素的个数
- * 空集是所有集合的子集
+ * 集合1中是否包含集合2中所有的元素。
+ * 当集合1和集合2都为空时,返回{@code true}
+ * 当集合2为空时,返回{@code true}
*
* @param coll1 集合1
* @param coll2 集合2
* @return 集合1中是否包含集合2中所有的元素
* @since 4.5.12
*/
+ @SuppressWarnings("SuspiciousMethodCalls")
public static boolean containsAll(final Collection> coll1, final Collection> coll2) {
if (isEmpty(coll1)) {
return isEmpty(coll2);
@@ -519,12 +521,35 @@ public class CollUtil {
return true;
}
- if (coll1.size() < coll2.size()) {
- return false;
+ // Set直接判定
+ if(coll1 instanceof Set){
+ return coll1.containsAll(coll2);
}
- //noinspection SuspiciousMethodCalls
- return coll1.containsAll(coll2);
+ // 参考Apache commons collection4
+ // 将时间复杂度降低到O(n + m)
+ final Iterator> it = coll1.iterator();
+ final Set