이 설명을 보는 것이 좋습니다.
Java에는 캐릭터 작업을 담당하는 3 개의 클래스가 있습니다.
1. 캐릭터는 단일 캐릭터 작업입니다.
2.String은 불변의 클래스 인 일련의 문자열에서 작동합니다.
3.StringBuffer는 또한 일련의 문자열에서 작업하는 것입니다.
끈:
원시 유형이 아닌 물체입니다.
불변의 대상이며 일단 생성되면 그 값을 수정할 수 없습니다.
기존 문자열 객체의 수정은 새 개체를 재현하고 새 값을 저장하는 것입니다.
문자열은 최종 클래스입니다. 즉, 상속받을 수 없습니다.
StringBuffer :
그것은 변이 가능한 객체입니다.
그것은 생성자 만 만들 수 있습니다.
StringBuffer sb = new StringBuffer ();
참고 : 과제 기호로 지불 할 수 없습니다.
SB = "여기에 오신 것을 환영합니다!"; // 오류
객체가 생성되면 메모리 공간이 메모리에 할당되며 널이 StringBuffer에 값을 할당하면 () 메소드를 사용하는 데 사용될 수 있습니다.
sb.append ( "Hello");
StringBuffer의 효율성은 문자열 연결에서 문자열의 효율보다 높습니다.
문자열 str = 새 문자열 ( "환영합니다");
str += "여기";
처리 단계는 실제로 StringBuffer를 작성한 다음 부록을 호출하고 마지막으로
그런 다음 StringBuffer tosting ()을 추가하십시오.
이러한 방식으로 문자열 연결 작업은 StringBuffer보다 약간의 추가 작업을 수행하며 물론 효율성이 줄어 듭니다.
그리고 문자열 객체는 불변의 객체이기 때문에 Sting의 각 작업은 새 값을 저장하기 위해 새로운 객체를 재현 할 것입니다.
이런 식으로 원래의 객체는 쓸모없고 쓰레기가 수집됩니다.
다음 코드를 살펴보십시오.
26 개의 영어 편지를 5,000 번 반복하십시오.
코드 사본은 다음과 같습니다.
문자열 tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart1 = system.currenttimeMillis ();
문자열 str = "";
for (int i = 0; i <times; i ++) {
str += tempstr;
}
Long Lend1 = System.CurrentTimeMillis ();
장기 = (lend1 -lstart1);
System.out.println (시간);
불행히도, 내 컴퓨터는 슈퍼 컴퓨터가 아니며, 내가 얻는 결과는 일반적으로 46687 정도마다 반드시 동일하지는 않습니다.
그것은 46 초입니다.
다음 코드를 살펴 보겠습니다
코드 사본은 다음과 같습니다.
문자열 tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart2 = system.currenttimeMillis ();
StringBuffer sb = new StringBuffer ();
for (int i = 0; i <times; i ++) {
sb.append (tempst);
}
Long Lend2 = System.CurrentTimeMillis ();
긴 시간 2 = (lend2 -lstart2);
System.out.println (Time2);
결과는 16이고 때로는 0입니다
따라서 결론은 분명합니다. StringBuffer의 속도는 String의 거의 수만 배입니다. 물론이 데이터는 그다지 정확하지 않습니다. 사이클 수는 100,000 배이므로 차이는 훨씬 더 큽니다. 당신이 나를 믿지 않는다면, 시도하십시오
여전히 이해할 수 없다면 :
1) 문자열의 관절 + 방법과 StringBuff의 첨부 방법의 차이 :
문자열 + 연산자가 문자열 작동을 수행하면 먼저 현재 문자열 객체를 StringBuff 유형으로 변환하고 Append 메소드를 호출하고 생성 된 StringBuff 객체를 ToString 메소드를 통해 String 유형으로 변환하므로 비효율적입니다.
그러나 가독성 측면에서 문자열의 연결 연산자는 여전히 높습니다.
2) StringBuff는 스레드 안전입니다
문자열은 스레드에 대한 안전하지 않습니다
3) 문자열은 수정할 수없는 문자열 객체이며 StringBuff는 수정됩니다.
코드 사본은 다음과 같습니다.
public static boolean filecopy (String srcstr, String deststr) {
파일 srcfile = null;
파일 destfile = null;
독자 독자 = null;
작가 작가 = null;
부울 플래그 = 거짓;
노력하다 {
srcfile = 새 파일 (srcstr);
if (! srcfile.exists ()) {
System.out.println ( "소스 파일이 존재하지 않음");
System.exit (0);
} 또 다른 {
Reader = New Filereader (srcfile);
}
destfile = 새 파일 (deststr);
작가 = 새로운 filewriter (destfile);
char [] buff = new char [1024];
int len;
문자열 str = "";
StringBuffer sbuff = new StringBuffer ();
while ((len = reader.read (buff))! = -1) {
// str += 새 문자열 (buff, 0, len);
sbuff.append (새 문자열 (buff, 0, len));
}
// writer.write (str.tochararray ());
writer.write (sbuff.tostring (). tochararray ());
flag = true;
Writer.flush ();
reader.close ();
Writer.close ();
} catch (ioexception e) {
System.out.println ( "파일 사본 예외 : =" + e.getMessage ());
}
리턴 플래그;
}