diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 3e46129d2..2913cb0bd 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -151,3 +151,4 @@ BUG FIXES IN 3.0 [LANG-710] StringIndexOutOfBoundsException when calling unescapeHtml4("") [LANG-714] StringUtils doc/comment spelling fixes. [LANG-715] CharSetUtils.squeeze() speedup. + [LANG-716] swapCase and *capitalize speedups. diff --git a/src/main/java/org/apache/commons/lang3/StringUtils.java b/src/main/java/org/apache/commons/lang3/StringUtils.java index f2ddf764d..0af9bc96b 100644 --- a/src/main/java/org/apache/commons/lang3/StringUtils.java +++ b/src/main/java/org/apache/commons/lang3/StringUtils.java @@ -5094,25 +5094,23 @@ public static String uncapitalize(String str) { * @return the changed String, {@code null} if null String input */ public static String swapCase(String str) { - int strLen; - if (str == null || (strLen = str.length()) == 0) { + if (str == null || str.length() == 0) { return str; } - StringBuilder buffer = new StringBuilder(strLen); - char ch = 0; - for (int i = 0; i < strLen; i++) { - ch = str.charAt(i); + char[] buffer = str.toCharArray(); + + for (int i = 0; i < buffer.length; i++) { + char ch = buffer[i]; if (Character.isUpperCase(ch)) { - ch = Character.toLowerCase(ch); + buffer[i] = Character.toLowerCase(ch); } else if (Character.isTitleCase(ch)) { - ch = Character.toLowerCase(ch); + buffer[i] = Character.toLowerCase(ch); } else if (Character.isLowerCase(ch)) { - ch = Character.toUpperCase(ch); + buffer[i] = Character.toUpperCase(ch); } - buffer.append(ch); } - return buffer.toString(); + return new String(buffer); } // Count matches diff --git a/src/main/java/org/apache/commons/lang3/text/WordUtils.java b/src/main/java/org/apache/commons/lang3/text/WordUtils.java index d21cd43b4..9b282d172 100644 --- a/src/main/java/org/apache/commons/lang3/text/WordUtils.java +++ b/src/main/java/org/apache/commons/lang3/text/WordUtils.java @@ -201,23 +201,18 @@ public static String capitalize(String str, char... delimiters) { if (str == null || str.length() == 0 || delimLen == 0) { return str; } - int strLen = str.length(); - StringBuilder buffer = new StringBuilder(strLen); + char[] buffer = str.toCharArray(); boolean capitalizeNext = true; - for (int i = 0; i < strLen; i++) { - char ch = str.charAt(i); - + for (int i = 0; i < buffer.length; i++) { + char ch = buffer[i]; if (isDelimiter(ch, delimiters)) { - buffer.append(ch); capitalizeNext = true; } else if (capitalizeNext) { - buffer.append(Character.toTitleCase(ch)); + buffer[i] = Character.toTitleCase(ch); capitalizeNext = false; - } else { - buffer.append(ch); } } - return buffer.toString(); + return new String(buffer); } //----------------------------------------------------------------------- @@ -331,23 +326,18 @@ public static String uncapitalize(String str, char... delimiters) { if (str == null || str.length() == 0 || delimLen == 0) { return str; } - int strLen = str.length(); - StringBuilder buffer = new StringBuilder(strLen); + char[] buffer = str.toCharArray(); boolean uncapitalizeNext = true; - for (int i = 0; i < strLen; i++) { - char ch = str.charAt(i); - + for (int i = 0; i < buffer.length; i++) { + char ch = buffer[i]; if (isDelimiter(ch, delimiters)) { - buffer.append(ch); uncapitalizeNext = true; } else if (uncapitalizeNext) { - buffer.append(Character.toLowerCase(ch)); + buffer[i] = Character.toLowerCase(ch); uncapitalizeNext = false; - } else { - buffer.append(ch); } } - return buffer.toString(); + return new String(buffer); } //----------------------------------------------------------------------- @@ -374,35 +364,33 @@ public static String uncapitalize(String str, char... delimiters) { * @return the changed String, null if null String input */ public static String swapCase(String str) { - int strLen; - if (str == null || (strLen = str.length()) == 0) { + if (str == null || str.length() == 0) { return str; } - StringBuilder buffer = new StringBuilder(strLen); + char[] buffer = str.toCharArray(); boolean whitespace = true; - char ch = 0; - char tmp = 0; - for (int i = 0; i < strLen; i++) { - ch = str.charAt(i); + for (int i = 0; i < buffer.length; i++) { + char ch = buffer[i]; if (Character.isUpperCase(ch)) { - tmp = Character.toLowerCase(ch); + buffer[i] = Character.toLowerCase(ch); + whitespace = false; } else if (Character.isTitleCase(ch)) { - tmp = Character.toLowerCase(ch); + buffer[i] = Character.toLowerCase(ch); + whitespace = false; } else if (Character.isLowerCase(ch)) { if (whitespace) { - tmp = Character.toTitleCase(ch); + buffer[i] = Character.toTitleCase(ch); + whitespace = false; } else { - tmp = Character.toUpperCase(ch); + buffer[i] = Character.toUpperCase(ch); } } else { - tmp = ch; + whitespace = Character.isWhitespace(ch); } - buffer.append(tmp); - whitespace = Character.isWhitespace(ch); } - return buffer.toString(); + return new String(buffer); } //----------------------------------------------------------------------- diff --git a/src/site/changes/changes.xml b/src/site/changes/changes.xml index e3c03ab2d..f261b1395 100644 --- a/src/site/changes/changes.xml +++ b/src/site/changes/changes.xml @@ -22,9 +22,10 @@ - Increase test coverage of FieldUtils read methods and tweak javadoc + swapCase and *capitalize speedups. CharSetUtils.squeeze() speedup. StringUtils doc/comment spelling fixes. + Increase test coverage of FieldUtils read methods and tweak javadoc Add includeantruntime=false to javac targets to quell warnings in ant 1.8.1 and better (and modest performance gain). StringIndexOutOfBoundsException when calling unescapeHtml4("&#03") StringUtils.join throws NPE when toString returns null for one of objects in collection