From e1951a098b6e732a5919e60dcd48375426ab801b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=A6=D1=8B=D0=BF?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Mon, 6 Apr 2020 15:11:05 +0300 Subject: [PATCH] Improve performance of StringUtils.deleteAny() --- .../main/java/org/springframework/util/StringUtils.java | 8 ++++---- .../java/org/springframework/util/StringUtilsTests.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/util/StringUtils.java b/spring-core/src/main/java/org/springframework/util/StringUtils.java index f75cbcdedf..9fe0fcd4af 100644 --- a/spring-core/src/main/java/org/springframework/util/StringUtils.java +++ b/spring-core/src/main/java/org/springframework/util/StringUtils.java @@ -453,17 +453,17 @@ public abstract class StringUtils { return inString; } - StringBuilder sb = new StringBuilder(inString.length()); + int lastCharIndex = 0; + char[] result = new char[inString.length()]; for (int i = 0; i < inString.length(); i++) { char c = inString.charAt(i); if (charsToDelete.indexOf(c) == -1) { - sb.append(c); + result[lastCharIndex++] = c; } } - return sb.toString(); + return new String(result, 0, lastCharIndex); } - //--------------------------------------------------------------------- // Convenience methods for working with formatted Strings //--------------------------------------------------------------------- diff --git a/spring-core/src/test/java/org/springframework/util/StringUtilsTests.java b/spring-core/src/test/java/org/springframework/util/StringUtilsTests.java index a1be518a42..b7eaa7d7b7 100644 --- a/spring-core/src/test/java/org/springframework/util/StringUtilsTests.java +++ b/spring-core/src/test/java/org/springframework/util/StringUtilsTests.java @@ -306,7 +306,7 @@ class StringUtilsTests { void quoteIfString() { assertThat(StringUtils.quoteIfString("myString")).isEqualTo("'myString'"); assertThat(StringUtils.quoteIfString("")).isEqualTo("''"); - assertThat(StringUtils.quoteIfString(5)).isEqualTo(Integer.valueOf(5)); + assertThat(StringUtils.quoteIfString(5)).isEqualTo(5); assertThat(StringUtils.quoteIfString(null)).isNull(); } @@ -498,7 +498,7 @@ class StringUtilsTests { void tokenizeToStringArrayWithNotIgnoreEmptyTokens() { String[] sa = StringUtils.tokenizeToStringArray("a,b , ,c", ",", true, false); assertThat(sa.length).isEqualTo(4); - assertThat(sa[0].equals("a") && sa[1].equals("b") && sa[2].equals("") && sa[3].equals("c")).as("components are correct").isTrue(); + assertThat(sa[0].equals("a") && sa[1].equals("b") && sa[2].isEmpty() && sa[3].equals("c")).as("components are correct").isTrue(); } @Test @@ -539,7 +539,7 @@ class StringUtilsTests { } @Test - void delimitedListToStringArrayWithEmptyString() { + void delimitedListToStringArrayWithEmptyDelimiter() { String[] sa = StringUtils.delimitedListToStringArray("a,b", ""); assertThat(sa.length).isEqualTo(3); assertThat(sa[0]).isEqualTo("a"); @@ -601,7 +601,7 @@ class StringUtilsTests { // Could read these from files String[] sa = StringUtils.commaDelimitedListToStringArray("a,,b"); assertThat(sa.length).as("a,,b produces array length 3").isEqualTo(3); - assertThat(sa[0].equals("a") && sa[1].equals("") && sa[2].equals("b")).as("components are correct").isTrue(); + assertThat(sa[0].equals("a") && sa[1].isEmpty() && sa[2].equals("b")).as("components are correct").isTrue(); sa = new String[] {"", "", "a", ""}; doTestCommaDelimitedListToStringArrayLegalMatch(sa);