이 설명이 좋은 것 같아서 옮겨봤습니다
자바에는 문자 연산을 담당하는 클래스가 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);
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);
결론은 분명합니다. StringBuffer는 String보다 거의 수만 배 빠릅니다. 물론 이 데이터는 그다지 정확하지 않습니다. 왜냐하면 사이클 수가 100,000번이 되면 그 차이는 더욱 커지기 때문입니다. 믿을 수 없다면
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; }