diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayWrapper.java b/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayWrapper.java index 20a30f66d..464b4dd0a 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayWrapper.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayWrapper.java @@ -303,11 +303,25 @@ public class ArrayWrapper implements Wrapper, Iterable { * @since 6.0.0 */ public ArrayWrapper setOrPadding(final int index, final E value, final E paddingElement) { + return setOrPadding(index, value, paddingElement, (this.length + 1) * 10); + } + + /** + * 将元素值设置为数组的某个位置,当index小于数组的长度时,替换指定位置的值,否则追加{@code paddingElement}直到到达index后,设置值 + * + * @param index 位置 + * @param value 新元素或新数组 + * @param paddingElement 填充 + * @param indexLimit 索引限制 + * @return this + * @since 6.0.0 + */ + public ArrayWrapper setOrPadding(final int index, final E value, final E paddingElement, final int indexLimit) { if (index < this.length) { Array.set(array, index, value); } else { // issue#3286, 增加安全检查,最多增加10倍 - Validator.checkIndexLimit(index, this.length); + Validator.checkIndexLimit(index, indexLimit); for (int i = length; i < index; i++) { append(paddingElement); diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/collection/ListUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/collection/ListUtil.java index 2ff88141e..66550508b 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/collection/ListUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/collection/ListUtil.java @@ -473,13 +473,31 @@ public class ListUtil { * @since 5.8.4 */ public static List setOrPadding(final List list, final int index, final T element, final T paddingElement) { + return setOrPadding(list, index, element, paddingElement, (list.size() + 1) * 10); + } + + /** + * 在指定位置设置元素。当index小于List的长度时,替换指定位置的值,否则追加{@code paddingElement}直到到达index后,设置值 + * + * @param 元素类型 + * @param list List列表 + * @param index 位置 + * @param element 新元素 + * @param paddingElement 填充的值 + * @param indexLimit 最大索引限制 + * @return 原List + * @since 5.8.28 + */ + public static List setOrPadding(final List list, final int index, final T element, final T paddingElement, final int indexLimit) { Assert.notNull(list, "List must be not null !"); final int size = list.size(); if (index < size) { list.set(index, element); } else { - // issue#3286, 增加安全检查,最多增加10倍 - Validator.checkIndexLimit(index, size); + if(indexLimit > 0){ + // issue#3286, 增加安全检查 + Validator.checkIndexLimit(index, indexLimit); + } for (int i = size; i < index; i++) { list.add(paddingElement); } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/lang/Validator.java b/hutool-core/src/main/java/org/dromara/hutool/core/lang/Validator.java index bb5ed90f8..7dfd4f40c 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/lang/Validator.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/lang/Validator.java @@ -1247,7 +1247,7 @@ public class Validator { } /** - * 检查给定的index是否超出长度限制,默认检查超出倍数(10倍),此方法主要用于内部,检查包括: + * 检查给定的index是否超出长度限制: *
    *
  • 数组调用setOrPadding时,最多允许padding的长度
  • *
  • List调用setOrPadding时,最多允许padding的长度
  • @@ -1255,13 +1255,13 @@ public class Validator { *
* * @param index 索引 - * @param size 数组、列表长度 + * @param limit 限制大小 * @since 6.0.0 */ - public static void checkIndexLimit(final int index, final int size) { + public static void checkIndexLimit(final int index, final int limit) { // issue#3286, 增加安全检查,最多增加10倍 - if (index > (size + 1) * 10) { - throw new ValidateException("Index [{}] is too large for size: [{}]", index, size); + if (index > limit) { + throw new ValidateException("Index [{}] is too large for limit: [{}]", index, limit); } } } diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/JSONArray.java b/hutool-json/src/main/java/org/dromara/hutool/json/JSONArray.java index 704c63406..59541f43f 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/JSONArray.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/JSONArray.java @@ -455,7 +455,7 @@ public class JSONArray implements JSON, JSONGetter, List, Rando // issue#3286, 如果用户指定的index太大,容易造成Java heap space错误。 if (!config.isIgnoreNullValue()) { // issue#3286, 增加安全检查,最多增加10倍 - Validator.checkIndexLimit(index, this.size()); + Validator.checkIndexLimit(index, (this.size() + 1) * 10); while (index != this.size()) { // 非末尾,则填充null this.add(null);