diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java index 09be8aa08..5f283eb5b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java @@ -365,7 +365,11 @@ public class CollUtil { * @return 单差集 */ public static Collection subtract(Collection coll1, Collection coll2) { - final Collection result = ObjectUtil.clone(coll1); + Collection result = ObjectUtil.clone(coll1); + if(null == result){ + result = CollUtil.create(coll1.getClass()); + result.addAll(coll1); + } result.removeAll(coll2); return result; } @@ -995,6 +999,11 @@ public class CollUtil { try { list = (Collection) ReflectUtil.newInstance(collectionType); } catch (Exception e) { + // 无法创建当前类型的对象,尝试创建父类型对象 + final Class superclass = collectionType.getSuperclass(); + if(null != superclass && collectionType != superclass){ + return create(superclass); + } throw new UtilException(e); } } @@ -1141,6 +1150,10 @@ public class CollUtil { } Collection collection2 = ObjectUtil.clone(collection); + if(null == collection2){ + // 不支持clone + collection2 = create(collection.getClass()); + } if (isEmpty(collection2)) { return collection2; } diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java index 4de74a626..1fe606472 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java @@ -332,7 +332,11 @@ public class ListUtil { * @since 4.0.6 */ public static List reverseNew(List list) { - final List list2 = ObjectUtil.clone(list); + List list2 = ObjectUtil.clone(list); + if(null == list2){ + // 不支持clone + list2 = new ArrayList<>(list); + } return reverse(list2); } diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java b/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java index 974bc491d..cd3b5f7db 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java @@ -629,6 +629,10 @@ public class MapUtil { } Map map2 = ObjectUtil.clone(map); + if(null == map2){ + // 不支持clone + map2 = new HashMap<>(map.size(), 1f); + } if (isEmpty(map2)) { return map2; } @@ -636,7 +640,7 @@ public class MapUtil { map2.clear(); } catch (UnsupportedOperationException e) { // 克隆后的对象不支持清空,说明为不可变集合对象,使用默认的ArrayList保存结果 - map2 = new HashMap<>(); + map2 = new HashMap<>(map.size(), 1f); } Entry modified; @@ -687,6 +691,10 @@ public class MapUtil { return map; } Map map2 = ObjectUtil.clone(map); + if(null == map2){ + // 不支持clone + map2 = new HashMap<>(map.size(), 1f); + } if (isEmpty(map2)) { return map2; } diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java index ad60becc3..76b6474b4 100644 --- a/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java @@ -184,6 +184,28 @@ public class CollUtilTest { Assert.assertEquals("x", subtract.iterator().next()); } + @Test + public void subtractSetTest() { + HashMap map1 = MapUtil.newHashMap(); + HashMap map2 = MapUtil.newHashMap(); + map1.put("1", "v1"); + map1.put("2", "v2"); + map2.put("2", "v2"); + Collection r2 = CollUtil.subtract(map1.keySet(), map2.keySet()); + Assert.assertEquals("[1]", r2.toString()); + } + + @Test + public void subtractSetToListTest() { + HashMap map1 = MapUtil.newHashMap(); + HashMap map2 = MapUtil.newHashMap(); + map1.put("1", "v1"); + map1.put("2", "v2"); + map2.put("2", "v2"); + List r2 = CollUtil.subtractToList(map1.keySet(), map2.keySet()); + Assert.assertEquals("[1]", r2.toString()); + } + @Test public void toMapListAndToListMapTest() { HashMap map1 = new HashMap<>(); @@ -709,7 +731,7 @@ public class CollUtilTest { } @Test - public void pageTest(){ + public void pageTest() { List objects = CollUtil.newArrayList(); for (int i = 0; i < 10; i++) { objects.add(Dict.create().set("name", "姓名:" + i)); @@ -719,7 +741,7 @@ public class CollUtilTest { } @Test - public void subtractToListTest(){ + public void subtractToListTest() { List list1 = Arrays.asList(1L, 2L, 3L); List list2 = Arrays.asList(2L, 3L);