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 @@