fix:CollUtil.split优化切割列表参数判断,避免OOM

This commit is contained in:
wulang 2023-03-29 16:30:27 +08:00
parent 7af3344b5e
commit d343051db5
3 changed files with 50 additions and 41 deletions

View File

@ -8,7 +8,7 @@
* 【core 】 SerializeUtil.deserialize增加白名单类避免RCE vulnerabilityissue#3021@Github * 【core 】 SerializeUtil.deserialize增加白名单类避免RCE vulnerabilityissue#3021@Github
### 🐞Bug修复 ### 🐞Bug修复
* 【core 】 CollUtil.split优化切割列表参数判断避免OOM
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------
# 5.8.16 (2023-03-26) # 5.8.16 (2023-03-26)

View File

@ -371,7 +371,7 @@ public class CollUtil {
result.addAll(coll1); result.addAll(coll1);
} }
result.removeAll(coll2); result.removeAll(coll2);
} catch (UnsupportedOperationException e){ } catch (UnsupportedOperationException e) {
// 针对 coll1 为只读集合的补偿 // 针对 coll1 为只读集合的补偿
result = CollUtil.create(AbstractCollection.class); result = CollUtil.create(AbstractCollection.class);
result.addAll(coll1); result.addAll(coll1);
@ -998,7 +998,7 @@ public class CollUtil {
* *
* @param <T> 集合元素类型 * @param <T> 集合元素类型
* @param collectionType 集合类型rawtype ArrayList.class, EnumSet.class ... * @param collectionType 集合类型rawtype ArrayList.class, EnumSet.class ...
* @param elementType 集合元素类型 * @param elementType 集合元素类型
* @return 集合类型对应的实例 * @return 集合类型对应的实例
* @since v5 * @since v5
*/ */
@ -1189,11 +1189,12 @@ public class CollUtil {
return result; return result;
} }
ArrayList<T> subList = new ArrayList<>(size); int initSize = Math.min(collection.size(), size);
List<T> subList = new ArrayList<>(initSize);
for (T t : collection) { for (T t : collection) {
if (subList.size() >= size) { if (subList.size() >= size) {
result.add(subList); result.add(subList);
subList = new ArrayList<>(size); subList = new ArrayList<>(initSize);
} }
subList.add(t); subList.add(t);
} }

View File

@ -255,6 +255,14 @@ public class CollUtilTest {
Assert.assertEquals(3, split.get(0).size()); Assert.assertEquals(3, split.get(0).size());
} }
@Test
public void splitTest2() {
final ArrayList<Integer> list = CollUtil.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9);
final List<List<Integer>> split = CollUtil.split(list, Integer.MAX_VALUE);
Assert.assertEquals(3, split.size());
Assert.assertEquals(3, split.get(0).size());
}
@Test @Test
public void foreachTest() { public void foreachTest() {
final HashMap<String, String> map = MapUtil.newHashMap(); final HashMap<String, String> map = MapUtil.newHashMap();
@ -381,9 +389,9 @@ public class CollUtilTest {
@Test @Test
public void sortByPropertyTest() { public void sortByPropertyTest() {
final List<TestBean> list = CollUtil.newArrayList( final List<TestBean> list = CollUtil.newArrayList(
new TestBean("张三", 12, DateUtil.parse("2018-05-01")), // new TestBean("张三", 12, DateUtil.parse("2018-05-01")), //
new TestBean("李四", 13, DateUtil.parse("2018-03-01")), // new TestBean("李四", 13, DateUtil.parse("2018-03-01")), //
new TestBean("王五", 12, DateUtil.parse("2018-04-01"))// new TestBean("王五", 12, DateUtil.parse("2018-04-01"))//
); );
CollUtil.sortByProperty(list, "createTime"); CollUtil.sortByProperty(list, "createTime");
@ -395,9 +403,9 @@ public class CollUtilTest {
@Test @Test
public void sortByPropertyTest2() { public void sortByPropertyTest2() {
final List<TestBean> list = CollUtil.newArrayList( final List<TestBean> list = CollUtil.newArrayList(
new TestBean("张三", 0, DateUtil.parse("2018-05-01")), // new TestBean("张三", 0, DateUtil.parse("2018-05-01")), //
new TestBean("李四", -12, DateUtil.parse("2018-03-01")), // new TestBean("李四", -12, DateUtil.parse("2018-03-01")), //
new TestBean("王五", 23, DateUtil.parse("2018-04-01"))// new TestBean("王五", 23, DateUtil.parse("2018-04-01"))//
); );
CollUtil.sortByProperty(list, "age"); CollUtil.sortByProperty(list, "age");
@ -409,8 +417,8 @@ public class CollUtilTest {
@Test @Test
public void fieldValueMapTest() { public void fieldValueMapTest() {
final List<TestBean> list = CollUtil.newArrayList(new TestBean("张三", 12, DateUtil.parse("2018-05-01")), // final List<TestBean> list = CollUtil.newArrayList(new TestBean("张三", 12, DateUtil.parse("2018-05-01")), //
new TestBean("李四", 13, DateUtil.parse("2018-03-01")), // new TestBean("李四", 13, DateUtil.parse("2018-03-01")), //
new TestBean("王五", 12, DateUtil.parse("2018-04-01"))// new TestBean("王五", 12, DateUtil.parse("2018-04-01"))//
); );
final Map<String, TestBean> map = CollUtil.fieldValueMap(list, "name"); final Map<String, TestBean> map = CollUtil.fieldValueMap(list, "name");
@ -422,8 +430,8 @@ public class CollUtilTest {
@Test @Test
public void fieldValueAsMapTest() { public void fieldValueAsMapTest() {
final List<TestBean> list = CollUtil.newArrayList(new TestBean("张三", 12, DateUtil.parse("2018-05-01")), // final List<TestBean> list = CollUtil.newArrayList(new TestBean("张三", 12, DateUtil.parse("2018-05-01")), //
new TestBean("李四", 13, DateUtil.parse("2018-03-01")), // new TestBean("李四", 13, DateUtil.parse("2018-03-01")), //
new TestBean("王五", 14, DateUtil.parse("2018-04-01"))// new TestBean("王五", 14, DateUtil.parse("2018-04-01"))//
); );
final Map<String, Integer> map = CollUtil.fieldValueAsMap(list, "name", "age"); final Map<String, Integer> map = CollUtil.fieldValueAsMap(list, "name", "age");
@ -756,14 +764,14 @@ public class CollUtilTest {
Assert.assertFalse(CollUtil.addIfAbsent(null, "123")); Assert.assertFalse(CollUtil.addIfAbsent(null, "123"));
Assert.assertFalse(CollUtil.addIfAbsent(CollUtil.newArrayList("123"), "123")); Assert.assertFalse(CollUtil.addIfAbsent(CollUtil.newArrayList("123"), "123"));
Assert.assertFalse(CollUtil.addIfAbsent(CollUtil.newArrayList(new Animal("jack", 20)), Assert.assertFalse(CollUtil.addIfAbsent(CollUtil.newArrayList(new Animal("jack", 20)),
new Animal("jack", 20))); new Animal("jack", 20)));
// 正常情况 // 正常情况
Assert.assertTrue(CollUtil.addIfAbsent(CollUtil.newArrayList("456"), "123")); Assert.assertTrue(CollUtil.addIfAbsent(CollUtil.newArrayList("456"), "123"));
Assert.assertTrue(CollUtil.addIfAbsent(CollUtil.newArrayList(new Animal("jack", 20)), Assert.assertTrue(CollUtil.addIfAbsent(CollUtil.newArrayList(new Animal("jack", 20)),
new Dog("jack", 20))); new Dog("jack", 20)));
Assert.assertTrue(CollUtil.addIfAbsent(CollUtil.newArrayList(new Animal("jack", 20)), Assert.assertTrue(CollUtil.addIfAbsent(CollUtil.newArrayList(new Animal("jack", 20)),
new Animal("tom", 20))); new Animal("tom", 20)));
} }
@Test @Test
@ -774,9 +782,9 @@ public class CollUtilTest {
oldMap.put("c", "134"); oldMap.put("c", "134");
final Map<String, Long> map = CollUtil.toMap(oldMap.entrySet(), final Map<String, Long> map = CollUtil.toMap(oldMap.entrySet(),
new HashMap<>(), new HashMap<>(),
Map.Entry::getKey, Map.Entry::getKey,
entry -> Long.parseLong(entry.getValue())); entry -> Long.parseLong(entry.getValue()));
Assert.assertEquals(1L, (long) map.get("a")); Assert.assertEquals(1L, (long) map.get("a"));
Assert.assertEquals(12L, (long) map.get("b")); Assert.assertEquals(12L, (long) map.get("b"));
@ -848,12 +856,12 @@ public class CollUtilTest {
public void setValueByMapTest() { public void setValueByMapTest() {
// https://gitee.com/dromara/hutool/pulls/482 // https://gitee.com/dromara/hutool/pulls/482
final List<Person> people = Arrays.asList( final List<Person> people = Arrays.asList(
new Person("aa", 12, "man", 1), new Person("aa", 12, "man", 1),
new Person("bb", 13, "woman", 2), new Person("bb", 13, "woman", 2),
new Person("cc", 14, "man", 3), new Person("cc", 14, "man", 3),
new Person("dd", 15, "woman", 4), new Person("dd", 15, "woman", 4),
new Person("ee", 16, "woman", 5), new Person("ee", 16, "woman", 5),
new Person("ff", 17, "man", 6) new Person("ff", 17, "man", 6)
); );
final Map<Integer, String> genderMap = new HashMap<>(); final Map<Integer, String> genderMap = new HashMap<>();
@ -894,12 +902,12 @@ public class CollUtilTest {
@Test @Test
public void distinctByFunctionTest() { public void distinctByFunctionTest() {
final List<Person> people = Arrays.asList( final List<Person> people = Arrays.asList(
new Person("aa", 12, "man", 1), new Person("aa", 12, "man", 1),
new Person("bb", 13, "woman", 2), new Person("bb", 13, "woman", 2),
new Person("cc", 14, "man", 3), new Person("cc", 14, "man", 3),
new Person("dd", 15, "woman", 4), new Person("dd", 15, "woman", 4),
new Person("ee", 16, "woman", 5), new Person("ee", 16, "woman", 5),
new Person("ff", 17, "man", 6) new Person("ff", 17, "man", 6)
); );
// 覆盖模式下ff覆盖了aaee覆盖了bb // 覆盖模式下ff覆盖了aaee覆盖了bb
@ -953,8 +961,8 @@ public class CollUtilTest {
final List<Integer> list = CollUtil.unionAll(list1, list2, list3); final List<Integer> list = CollUtil.unionAll(list1, list2, list3);
Assert.assertNotNull(list); Assert.assertNotNull(list);
Assert.assertArrayEquals( Assert.assertArrayEquals(
CollectionUtil.newArrayList(1, 2, 2, 3, 3, 1, 2, 3, 4, 5, 6).toArray(), CollectionUtil.newArrayList(1, 2, 2, 3, 3, 1, 2, 3, 4, 5, 6).toArray(),
list.toArray()); list.toArray());
} }
@Test @Test
@ -964,8 +972,8 @@ public class CollUtilTest {
final List<Integer> list = CollUtil.unionAll(list1, list2); final List<Integer> list = CollUtil.unionAll(list1, list2);
Assert.assertNotNull(list); Assert.assertNotNull(list);
Assert.assertArrayEquals( Assert.assertArrayEquals(
CollectionUtil.newArrayList(1, 2, 2, 3, 3, 1, 2, 3).toArray(), CollectionUtil.newArrayList(1, 2, 2, 3, 3, 1, 2, 3).toArray(),
list.toArray()); list.toArray());
} }
@Test @Test
@ -975,8 +983,8 @@ public class CollUtilTest {
@SuppressWarnings("ConfusingArgumentToVarargsMethod") final List<Integer> list = CollUtil.unionAll(list1, list2, null); @SuppressWarnings("ConfusingArgumentToVarargsMethod") final List<Integer> list = CollUtil.unionAll(list1, list2, null);
Assert.assertNotNull(list); Assert.assertNotNull(list);
Assert.assertArrayEquals( Assert.assertArrayEquals(
CollectionUtil.newArrayList(1, 2, 2, 3, 3, 1, 2, 3).toArray(), CollectionUtil.newArrayList(1, 2, 2, 3, 3, 1, 2, 3).toArray(),
list.toArray()); list.toArray());
} }
@Test @Test
@ -986,8 +994,8 @@ public class CollUtilTest {
final List<Integer> list = CollUtil.unionAll(list1, list2, null, null); final List<Integer> list = CollUtil.unionAll(list1, list2, null, null);
Assert.assertNotNull(list); Assert.assertNotNull(list);
Assert.assertArrayEquals( Assert.assertArrayEquals(
CollectionUtil.newArrayList(1, 2, 2, 3, 3, 1, 2, 3).toArray(), CollectionUtil.newArrayList(1, 2, 2, 3, 3, 1, 2, 3).toArray(),
list.toArray()); list.toArray());
} }
@Test @Test