From 33d669e94e72ecef348d802bcc02f4349dabb08c Mon Sep 17 00:00:00 2001 From: Xjf <965921784@qq.com> Date: Wed, 5 Feb 2025 11:53:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9flexibleConcat?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/hutool/core/text/StrUtil.java | 17 +++++++++++++---- .../dromara/hutool/core/text/StrUtilTest.java | 16 ++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/text/StrUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/text/StrUtil.java index 1f6eab1fd..99f248efb 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/text/StrUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/text/StrUtil.java @@ -383,8 +383,14 @@ public class StrUtil extends CharSequenceUtil implements StrPool { * @return flexibleConcat */ public static String flexibleConcat(String str, String left, String right, String middle, int middlePos) { + // 预计算最终字符串的长度,避免 StringBuilder 反复扩容 + int estimatedLength = (str != null ? str.length() : 0) + + (left != null ? left.length() : 0) + + (right != null ? right.length() : 0) + + (middle != null ? middle.length() : 0); + // 使用 StringBuilder 来提高拼接性能 - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(estimatedLength); // 如果原始字符串不为 null,添加到 StringBuilder if (str != null) { @@ -394,18 +400,21 @@ public class StrUtil extends CharSequenceUtil implements StrPool { // 左边拼接字符串(如果有 Optional.ofNullable(left) .filter(s -> !s.isEmpty()) - .ifPresent(l -> sb.insert(0, l.toCharArray())); + .ifPresent(l -> sb.insert(0, l)); // 右边拼接字符串(如果有) Optional.ofNullable(right) .filter(s -> !s.isEmpty()) .ifPresent(sb::append); + // 计算 middle 的插入位置 + int adjustedMiddlePos = (left != null ? left.length() : 0) + middlePos; + // 中间拼接字符串(如果有且位置有效) Optional.ofNullable(middle) .filter(s -> !s.isEmpty()) - .filter(s -> middlePos >= 0 && middlePos <= sb.length()) - .ifPresent(m -> sb.insert(middlePos, m.toCharArray())); + .filter(s -> adjustedMiddlePos >= 0 && adjustedMiddlePos <= sb.length()) + .ifPresent(m -> sb.insert(adjustedMiddlePos, m)); return sb.toString(); } diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/text/StrUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/text/StrUtilTest.java index 3ac1499ba..2ee2ef39b 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/text/StrUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/text/StrUtilTest.java @@ -641,4 +641,20 @@ public class StrUtilTest { final String s = StrUtil.indexedFormat("a{0,number,#}", 1234567); Assertions.assertEquals("a1234567", s); } + + @Test + public void flexibleConcat() { + /** + * 往左边填充 + */ + System.out.println(StrUtil.flexibleConcat("hello", ">>>", null, null, -1)); + /** + * 往右边填充 + */ + System.out.println(StrUtil.flexibleConcat("java", null, "!", null, -1)); + /** + * 往左右中间填充 + */ + System.out.println(StrUtil.flexibleConcat("world", "abc", "xyz", "123", 3)); + } }