1. 문자열 클래스
String의 값은 변경할 수 없으므로 String에 대한 각 작업이 새 String 개체를 생성하게 되어 비효율적일 뿐만 아니라 제한된 메모리 공간을 많이 낭비합니다.
String a = "a"; //a가 주소 0x0001을 가리킨다고 가정
a = "b";//재할당 후 a는 주소 0x0002를 가리키지만, 주소 0x0001에 저장된 "a"는 여전히 존재합니다. 하지만 그것은 더 이상 a가 가리키는 것이 아니며, a는 이미 다른 주소를 가리키고 있습니다.
따라서 문자열 연산은 값을 변경하는 것이 아니라 할당 주소를 변경하는 것입니다.
2. StringBuffer는 변경 가능한 클래스이며 스레드로부터 안전한 문자열 작업 클래스입니다. 이 클래스가 가리키는 문자열에 대한 작업은 새 객체를 생성하지 않습니다. 각 StringBuffer 객체에는 특정 버퍼 용량이 있습니다. 문자열 크기가 용량을 초과하지 않으면 새 용량이 할당되지 않습니다. 문자열 크기가 용량을 초과하면 용량이 자동으로 늘어납니다.
StringBuffer buf=new StringBuffer(); //16바이트 문자 버퍼 할당
StringBuffer buf=new StringBuffer(512) //512바이트 문자 버퍼 할당
StringBuffer buf= new StringBuffer("this is a test")//문자열을 버퍼에 저장하고 나중에 16바이트의 빈 버퍼를 예약합니다.
4. 스레드 안전성
StringBuffer 스레드 안전성
StringBuilder 스레드 안전하지 않음
5. 속도
일반적으로 속도는 빠른 것부터 느린 것까지입니다: StringBuilder>StringBuffer> String , 이 비교는 절대적이지 않고 상대적입니다.
6. 요약
(1) 소량의 데이터를 연산하려면 = String
(2)을 사용하세요. = StringBuilder
(3) 대용량 데이터를 연산하기 위한 문자열 버퍼의 멀티스레드 연산 = StringBuffer
코드와 데모 명령어는 다음과 같습니다.
public class TestCharacter { final static int time = 50000; //循环次数 public TestCharacter(){ } public void test(String s){ long begin = System.currentTimeMillis(); for(int i=0; i<time; i++){ s += “add”; } long over = System.currentTimeMillis(); System.out.println(“操作”+s.getClass().getName()+”类型使用的时间为:”+(over-begin)+”毫秒”); } public void test(StringBuffer s){ long begin = System.currentTimeMillis(); for(int i=0; i<time; i++){ s.append(“add”); } long over = System.currentTimeMillis(); System.out.println(“操作”+s.getClass().getCanonicalName()+”类型使用的时间为:”+(over-begin)+”毫秒”); } public void test(StringBuilder s){ long begin = System.currentTimeMillis(); for(int i=0; i<time; i++){ s.append(“add”); } long over = System.currentTimeMillis(); System.out.println(“操作”+s.getClass().getName()+”类型使用的时间为:”+(over-begin)+”毫秒”); } /*对 String 直接进行字符串拼接的测试*/ public void test2(){ String s2 = “abcd”; long begin = System.currentTimeMillis(); for(int i=0; i<time; i++){ String s = s2 + s2 +s2; } long over = System.currentTimeMillis(); System.out.println(“操作字符串对象引用相加类型使用的时间为:”+(over-begin)+”毫秒”); } public void test3(){ long begin = System.currentTimeMillis(); for(int i=0; i<time; i++){ String s =”abcd” + “abcd” + “abcd”; } long over = System.currentTimeMillis(); System.out.println(“操作字符串相加使用的时间为:”+(over-begin)+”毫秒”); } public static void main(String[] args){ String s1 = “abcd”; StringBuffer st1 = new StringBuffer(“abcd”); StringBuilder st2 = new StringBuilder(“abcd”); TestCharacter tc = new TestCharacter(); tc.test(s1); tc.test(st1); tc.test(st2); tc.test2(); tc.test3(); } }
2) myeclipse가 50,000번 순환되는 경우:
3) DOS에서 실행되는 경우:
Java의 StringBuilder, StringBuffer 및 String 클래스에 대한 보다 포괄적인 설명 이들 간의 관계에 대한 기사는 PHP 중국어 웹사이트를 주목하세요!