>  기사  >  Java  >  JAVA에서 StringBuffer와 String의 차이점 분석

JAVA에서 StringBuffer와 String의 차이점 분석

高洛峰
高洛峰원래의
2017-01-22 09:36:141462검색

이 설명이 좋은 것 같아서 옮겨봤습니다

자바에는 문자 연산을 담당하는 클래스가 3개 있습니다.

1.Character는 단일 문자에 대해 작동합니다.

2.String은 문자열에 대해 작동하며 불변 클래스입니다.

3.StringBuffer는 문자열에서도 작동하며 변수 클래스입니다.

String:
은 기본 유형이 아닌 객체입니다.
은 일단 생성되면 해당 값을 수정할 수 없습니다.
기존 String 객체에 대한 수정은 모두 새로운 것입니다. 새 개체를 만들고 새 값을 저장합니다.
String은 최종 클래스입니다. 즉,

StringBuffer:
는 수정될 때 변경 가능한 개체입니다. 객체는 String처럼 다시 생성되지 않습니다
생성자를 통해서만 생성할 수 있습니다.
StringBuffer sb = new StringBuffer();
참고: 할당 기호
sb를 통해서는 지불할 수 없습니다. = "welcome to here!"; //error
객체가 생성된 후 메모리 공간이 할당되고 처음에는 StringBuffer에 값을 할당할 때 해당 Append()를 사용할 수 있습니다.
sb.append("hello");

StringBuffer는 문자열 연결 작업에서 String보다 더 효율적입니다.

String str = new String("welcome to ");
str += "here";
의 처리 단계는 실제로 StringBuffer를 생성한 다음 Append()를 호출하고 마지막으로
StringBuffer를 Sting()으로 변환합니다.
이런 방식으로 문자열 연결은 Operation은 StringBuffer보다 몇 가지 추가 연산이 있지만 당연히 효율성이 떨어집니다.

그리고 String 객체는 불변 객체이기 때문에 Sting이 연산될 때마다 새로운 객체가 다시 생성되어 저장됩니다.
이렇게 하면 원본 개체가 쓸모가 없고 가비지 수집됩니다.

다음 코드를 살펴보세요.
영문자 26자를 5000번 반복해서 추가합니다. 🎜>

        String tempstr = "abcdefghijklmnopqrstuvwxyz";
        int times = 5000;
        long lstart1 = System.currentTimeMillis();
        String str = "";
        for (int i = 0; i < times; i++) {
            str += tempstr;
        }
        long lend1 = System.currentTimeMillis();
        long time = (lend1 - lstart1);
        System.out.println(time);
안타깝게도 제 컴퓨터는 슈퍼컴퓨터가 아니기 때문에 얻은 ​​결과가 매번 동일하지 않을 수 있습니다(보통 46687 정도). 46초입니다.

다음 코드를 다시 살펴보겠습니다

        String tempstr = "abcdefghijklmnopqrstuvwxyz";
        int times = 5000;
        long lstart2 = System.currentTimeMillis();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < times; i++) {
            sb.append(tempstr);
        }
        long lend2 = System.currentTimeMillis();
        long time2 = (lend2 - lstart2);
        System.out.println(time2);

결과는 16이고 때로는 0입니다

결론은 분명합니다. StringBuffer는 String보다 거의 수만 배 빠릅니다. 물론 이 데이터는 그다지 정확하지 않습니다. 왜냐하면 사이클 수가 100,000번이 되면 그 차이는 더욱 커지기 때문입니다. 믿을 수 없다면


아직도 이해가 되지 않는다면 시도해 보세요.

1) String의 Union + 메소드와 StringBuff의 Append의 차이점 메서드:

String의 + 연산자가 문자열 작업을 수행할 때 먼저 현재 문자열 개체를 StringBuff 유형으로 변환하고, 추가 메서드를 호출한 다음, 마지막으로 toString 메서드를 통해 생성된 StringBuff 개체를 String 유형 문자열로 변환합니다. 그래서 효율성이 더 낮습니다.

하지만 가독성 측면에서는 여전히 String의 연결 연산자가 더 좋습니다.

2) StringBuff는 스레드로부터 안전합니다

String은 스레드로부터 안전하지 않습니다

3) String은 수정할 수 없는 문자열 개체이지만 StringBuff는 수정할 수 있습니다.

public static boolean fileCopy(String srcStr, String destStr) {
File srcFile = null;
File destFile = null;
Reader reader = null;
Writer writer = null;
boolean flag = false;
try {
srcFile = new File(srcStr);
if (!srcFile.exists()) {
System.out.println(“源文件不存在”);
System.exit(0);
} else {
reader = new FileReader(srcFile);
}
destFile = new File(destStr);
writer = new FileWriter(destFile);
char[] buff = new char[1024];
int len;
String str = “”;
StringBuffer sbuff = new StringBuffer();
while ((len = reader.read(buff)) != -1) {
//        str += new String(buff, 0, len);
sbuff.append(new String(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());
}
return flag;
}

JAVA에서 StringBuffer와 String의 차이점 분석과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.