JAVA 문자열 맞 춤 법 집합
1."+"번 호 를 직접 사용
2.String 의 concat 방법 사용
3.StringBuilder 의 append 방법 사용 하기
4.StringBuffer 의 append 방법 사용 하기
String 은 final 형식 이기 때문에 String 대상 은 모두 가 변 적 이지 않 은 대상 에 속 하기 때문에 문자열 을 수정 해 야 할 때(예 를 들 어 문자열 의 연결 이나 교체)String 은 항상 새로운 대상 을 생 성 합 니 다.
1.“+”
다른 것 을 고려 하지 않 고'+'번 호 를 사용 하여 문자열 을 연결 하 는 것 이 가장 편리 하고 빠 른 방법 임 에 틀림없다.그러나 사실상'+'호 를 사용 하여 문자열 을 연결 하 는 효율 은 높 지 않다.
테스트 용 데모 붙 이기
public class Str {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "wolrd";
String str = str1 + str2;
System.out.println(str);
}
}
Str 가 컴 파일 을 통 해 생 성 된 바이트 파일 을 붙 입 니 다.
public class com.fzkj.str.Str {
public com.fzkj.str.Str();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String hello
2: astore_1
3: ldc #3 // String wolrd
5: astore_2
6: new #4 // class java/lang/StringBuilder
9: dup
10: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V
13: aload_1
14: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
17: aload_2
18: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
24: astore_3
25: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
28: aload_3
29: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
32: return
}
위의 바이트 파일 을 통 해 알 수 있 듯 이 String str=str1+str2 를 실행 하고 있 습 니 다.이 문 구 를 사용 할 때 실제 바 텀 은 StringBuilder 의 append 방법 을 사용 하여 이 루어 집 니 다.즉,'+'번 으로 문자열 을 연결 할 때 바 텀 은 new StringBuilder 대상 을 사용 하고 이 대상 의 append 방법 으로 문자열 을 연결 하 며 마지막 으로 toString 방법 을 통 해 연결 후의 값 을 되 돌려 줍 니 다.즉,문자열 str1+str 2 는 다음 코드 와 같 습 니 다.
String str1 = "hello";
String str2 = "wolrd";
StringBuilder sb = new StringBuilder();
sb.append(str1).append(str2);
String s = sb.toString();
데이터 양 이 많 을 때,예 를 들 어 만 번 순환 하면 StringBuilder 대상 만 개 를 만 듭 니 다.그래서'+'호 를 사용 하여 문자열 을 맞 추 는 효율 이 낮다.마지막 으로"+"번 호 를 사용 하여 str1 과 str2 를 연결 하고 100000 번 의 시간 을 소모 하 는 것 을 살 펴 보 겠 습 니 다.
public class Str {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "wolrd";
long startTime = System.currentTimeMillis();
System.out.println(" :"+ startTime);
for (int i = 0; i < 100000; i++) {
String str = str1 + str2;
}
long stopTime = System.currentTimeMillis();
System.out.println(" :"+ stopTime);
System.out.println(" 100000 :"+(stopTime - startTime)+"ms");
}
}
시작 시간:1591326544582종료 실행 시간:1591326544601
100000 번 의 문자열 연결 을 실행 하 는 데 걸 리 는 시간:19ms
2.concat
concat 소스 코드 는 다음 과 같 습 니 다.
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}
concat 방법의 원본 코드 에서 알 수 있 듯 이 concat 는 char 배열 을 신청 하여 연결 해 야 할 문자열 을 이 배열 에 넣 고 마지막 으로 String 으로 되 돌려 줍 니 다.역시 100000 번 을 맞 추 는 데 걸 리 는 시간 을 기록 합 니 다.
public class Str {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "wolrd";
// concat
String concat = str1.concat(str2);
long startTime = System.currentTimeMillis();
System.out.println(" :"+ startTime);
for (int i = 0; i < 100000; i++) {
String str = str1.concat(str2);
}
long stopTime = System.currentTimeMillis();
System.out.println(" :"+ stopTime);
System.out.println(" 100000 :"+(stopTime - startTime)+"ms");
}
}
시작 시간:1591328017552종료 실행 시간:1591328017561
100000 번 의 문자열 연결 을 실행 하 는 데 걸 리 는 시간:9ms
3.StringBuffer/StringBuilder
이 두 종 류 는 모두 같은 추상 류 인 AbstractString Builder 를 계승 했다.이 두 가지 유형의 append 방법 은 모두 호출 된 부모 클래스 의 append 방법 이다.
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
그 두 사람의 차 이 는 StringBuffer 의 append 방법 에 synchronized 키 워드 를 추가 하여 라인 이 안전 하 다 는 것 이다.
public class Str {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "wolrd";
StringBuffer sb = new StringBuffer();
long startTime = System.currentTimeMillis();
System.out.println(" :"+ startTime);
for (int i = 0; i < 100000; i++) {
sb.append(str1);
}
long stopTime = System.currentTimeMillis();
System.out.println(" :"+ stopTime);
System.out.println("StringBuffer 100000 :"+(stopTime - startTime)+"ms");
StringBuilder sb1 = new StringBuilder();
long startTime1 = System.currentTimeMillis();
System.out.println(" :"+ startTime1);
for (int i = 0; i < 100000; i++) {
sb1.append(str1);
}
long stopTime1 = System.currentTimeMillis();
System.out.println(" :"+ stopTime1);
System.out.println("StringBuilder 100000 :"+(stopTime1 - startTime1)+"ms");
}
}
시작 시간:1591328952926종료 실행 시간:159132895293
StringBuffer 에서 100000 번 의 문자열 조합 을 실행 하 는 데 걸 리 는 시간:7ms
시작 시간:1591328952934
종료 실행 시간:1591328952936
StringBuilder 에서 100000 번 의 문자열 조합 을 실행 하 는 데 걸 리 는 시간:2ms
StringBuilder 의 성능 은 StringBuffer 의 성능 보다 좋 습 니 다.
위의 결과 에서 결론 을 얻 을 수 있다.그것 은 바로 이 네 가지 효율 이 빠 르 고 느 린 것 이다.
StringBudiler>StringBuffer>concat>+
사실 맞 춤 형 문자열 이 적은 상황 에서 concat 의 효율 은 StringBuilder 보다 높다.
따라서 실제 사용 과정 에서 자신의 수요 에 따라 선택 하여 사용 해 야 한다.
이상 은 JAVA 문자열 맞 춤 법 에서 흔히 볼 수 있 는 상세 한 내용 입 니 다.JAVA 문자열 맞 춤 법 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 해 주 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 객체 작성 및 제거 방법정적 공장 방법 정적 공장 방법의 장점 를 반환할 수 있습니다. 정적 공장 방법의 단점 류 공유되거나 보호된 구조기를 포함하지 않으면 이불류화할 수 없음 여러 개의 구조기 파라미터를 만났을 때 구축기를 고려해야 한다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.