문자열 연결 성능을 크게 향상시킬 것으로 예상되는 Oracle Bug Database에 RFE (개선 요청)를 제출할 것을 고려 중입니다. 그러나 그것을하기 전에 전문가의 의견을 듣고 싶습니다. 기존 String.concat (문자열)의 StringBuilder보다 2 개 문자열에 두 배 빠르게 작동java.lang.String.concat를 개선 할 수 있습니까?
아이디어는 사실에 근거한다. 문제는 3 개 이상의 문자열을 연결할 방법이 없다는 것입니다. String.concat가 문자 배열을 복사하지 않고 직접 사용하는 패키지 개인 생성자 String(int offset, int count, char[] value)
을 사용하기 때문에 외부 메서드에서이 작업을 수행 할 수 없습니다. 이것은 높은 String.concat 성능을 보장합니다. StringBuilder는 문자열의 char 배열이 수정 될 수 있기 때문에 여전히이 생성자를 사용할 수 없습니다.
내가 문자열
public static String concat(String s1, String s2)
public static String concat(String s1, String s2, String s3)
public static String concat(String s1, String s2, String s3, String s4)
public static String concat(String s1, String s2, String s3, String s4, String s5)
public static String concat(String s1, String... array)
주
에 다음과 같은 방법을 추가하는 것이 좋습니다 : 오버로드 이런 종류의 효율성을 위해, EnumSet.of에 사용됩니다.String s = s1 + s2 + s3;
은 수있을 것입니다 이러한 방법은 문자열, 자바 컴파일러에 추가 된 후에
이 방법 중 하나의 구현이고, 다른 사람은,
public final class String {
private final char value[];
private final int count;
private final int offset;
String(int offset, int count, char value[]) {
this.value = value;
this.offset = offset;
this.count = count;
}
public static String concat(String s1, String s2, String s3) {
char buf[] = new char[s1.count + s2.count + s3.count];
System.arraycopy(s1.value, s1.offset, buf, 0, s1.count);
System.arraycopy(s2.value, s2.offset, buf, s1.count, s2.count);
System.arraycopy(s3.value, s3.offset, buf, s1.count + s2.count, s3.count);
return new String(0, buf.length, buf);
}
또한 같은 방법을 작동 효율적인 빌드
String s = String.concat(s1, s2, s3);
대신 현재 비효율적 인
String s = (new StringBuilder(String.valueOf(s1))).append(s2).append(s3).toString();
업데이트 성능 테스트. 내 노트북 인텔 셀러론 925, 3 문자열의 연결에서 그것을 실행, 내 String2 클래스는 정확히 어떻게 진짜 java.lang.String에있을 것이라고 에뮬레이트합니다. 문자열 길이는 StringBuilder를 가장 불리한 조건, 즉 각 추가시 내부 버퍼 용량을 확장해야하는 경우에 선택되며, concat은 항상 char [] 만 한 번만 생성합니다.
public class String2 {
private final char value[];
private final int count;
private final int offset;
String2(String s) {
value = s.toCharArray();
offset = 0;
count = value.length;
}
String2(int offset, int count, char value[]) {
this.value = value;
this.offset = offset;
this.count = count;
}
public static String2 concat(String2 s1, String2 s2, String2 s3) {
char buf[] = new char[s1.count + s2.count + s3.count];
System.arraycopy(s1.value, s1.offset, buf, 0, s1.count);
System.arraycopy(s2.value, s2.offset, buf, s1.count, s2.count);
System.arraycopy(s3.value, s3.offset, buf, s1.count + s2.count, s3.count);
return new String2(0, buf.length, buf);
}
public static void main(String[] args) {
String s1 = "1";
String s2 = "11111111111111111";
String s3 = "11111111111111111111111111111111111111111";
String2 s21 = new String2(s1);
String2 s22 = new String2(s2);
String2 s23 = new String2(s3);
long t0 = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
String2 s = String2.concat(s21, s22, s23);
// String s = new StringBuilder(s1).append(s2).append(s3).toString();
}
System.out.println(System.currentTimeMillis() - t0);
}
}
1,000,000에 반복 결과는 다음과 같습니다
version 1 = ~200 ms
version 2 = ~400 ms
문자열 버퍼가 더 빨리 수행 될 수 있습니다. –