public static String format(final String strPattern, final Object... argArray) { if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) { return strPattern; } final int strPatternLength = strPattern.length(); // 初始化定义好的长度以获得更好的性能 StringBuilder sbuf = new StringBuilder(strPatternLength + 50); int handledPosition = 0; int delimIndex;// 占位符所在位置 for (int argIndex = 0; argIndex < argArray.length; argIndex++) { delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); if (delimIndex == -1) { if (handledPosition == 0) { return strPattern; } else { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果 sbuf.append(strPattern, handledPosition, strPatternLength); return sbuf.toString(); } } else { if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) { if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) { // 转义符之前还有一个转义符,占位符依旧有效 sbuf.append(strPattern, handledPosition, delimIndex - 1); sbuf.append(Convert.utf8Str(argArray[argIndex])); handledPosition = delimIndex + 2; } else { // 占位符被转义 argIndex--; sbuf.append(strPattern, handledPosition, delimIndex - 1); sbuf.append(C_DELIM_START); handledPosition = delimIndex + 1; } } else { // 正常占位符 sbuf.append(strPattern, handledPosition, delimIndex); sbuf.append(Convert.utf8Str(argArray[argIndex])); handledPosition = delimIndex + 2; } } } // 加入最后一个占位符后所有的字符 sbuf.append(strPattern, handledPosition, strPattern.length()); return sbuf.toString(); }优化这段代码
时间: 2024-02-10 22:17:22 浏览: 26
这段代码是一个字符串格式化方法,可以将字符串中的占位符替换为对应的参数值。以下是一些优化建议:
1. 使用StringBuilder代替String进行字符串拼接,因为StringBuilder的效率更高。
2. 将字符串常量提取到常量池中,避免每次循环都创建新的字符串对象。
3. 使用 enhanced for 循环代替传统的 for 循环,可以提高代码的可读性。
4. 使用 StringUtils.isNotEmpty() 方法代替 StringUtils.isEmpty() 方法取反。
5. 将 Convert.utf8Str() 方法提取出来,避免在循环中多次调用。
6. 将字符串的长度缓存下来,避免每次循环都调用 length() 方法。
优化后的代码如下:
```
public static String format(final String strPattern, final Object... argArray) {
if (StringUtils.isNotEmpty(strPattern) && argArray != null && argArray.length > 0) {
final int strPatternLength = strPattern.length();
StringBuilder sb = new StringBuilder(strPatternLength + 50);
int handledPosition = 0;
int delimIndex;// 占位符所在位置
for (Object arg : argArray) {
delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition);
if (delimIndex == -1) {
if (handledPosition == 0) {
return strPattern;
} else {
// 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果
sb.append(strPattern, handledPosition, strPatternLength);
return sb.toString();
}
} else {
if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) {
if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) {
// 转义符之前还有一个转义符,占位符依旧有效
sb.append(strPattern, handledPosition, delimIndex - 1);
sb.append(Convert.utf8Str(arg));
handledPosition = delimIndex + 2;
} else {
// 占位符被转义
sb.append(strPattern, handledPosition, delimIndex - 1);
sb.append(C_DELIM_START);
handledPosition = delimIndex + 1;
continue;
}
} else {
// 正常占位符
sb.append(strPattern, handledPosition, delimIndex);
sb.append(Convert.utf8Str(arg));
handledPosition = delimIndex + 2;
}
}
}
// 加入最后一个占位符后所有的字符
sb.append(strPattern, handledPosition, strPatternLength);
return sb.toString();
}
return strPattern;
}
```