String a,b,c;
a = "a";
b = "b";
a = a+b;
StringBuffer d = new StringBuffer("abc");
d = d.append("567");
我觉得是6个,"a" "b" "ab" "abc" "567" 还有d.
高洛峰2017-04-18 10:25:06
제가 이해한 바를 말씀해 주시고 제안해 주시기 바랍니다
a = "a"; 컴파일 시 문자열 "a"가 상수 풀에 저장되고 힙에 객체가 생성되지 않습니다.
b = "b"; 마찬가지로
a = a + b; 새로운 StringBuilder 객체, 추가(a), 추가(b) 및 마지막으로 tostring()을 a에 반환합니다.
StringBuffer d = new StringBuffer("abc"); 여기서 객체를 생성해야 하며 "abc"가 상수 풀에 들어갑니다.
d = d.append("567"); StringBuffer는 문자열을 저장하기 위해 char 배열을 사용합니다. 추가하면 배열 용량이 충분하지 않으면 확장됩니다. 기본 크기는 16 + "abc"의 길이 = 19, "abc567"의 길이는 6, 3 + 3 < 19이므로 확장이 발생하지 않습니다.
또 다른 점은 StringBuffer와 StringBuilder가 AbstractStringBuilder를 상속하므로 상위 클래스가 생성될 수 있다는 것입니다.
디컴파일된 코드는 다음과 같습니다.
으아악迷茫2017-04-18 10:25:06
먼저 답을 말씀드리자면 3인 것 같아요.
먼저 创建对象
의 구체적인 의미를 명확히 하자면, 제가 이해한 바에 따르면 문자열이 字符常量
이면 문자열 개체는 컴파일 타임에 결정되어 상수 풀에 저장되므로 String b = new String("abc")
같은 연산이 있으면 문자열 객체가 생성되어 b
변수와 연결된다고 볼 수 있습니다.
그런 다음 코드를 살펴보세요.
소스 코드:
으아악
해당 바이트코드를 살펴보겠습니다.
으아악
은 다음 코드로 번역됩니다. a = a+b
으아악
가 생성되고 new StringBuilder()
메서드가 호출됩니다. builder.toString()
으아악
메소드는 String 객체를 생성하므로 이제 builder.toString()
을 생성했습니다.两个对象
은 의심할 여지없이 StringBuffer d = new StringBuffer("abc")
객체를 생성하므로 StringBuffer
이 있습니다. 한 가지 주목할 점은 三个对象
이 처음부터 끝까지 StringBuffer d
메서드를 호출하지 않는다는 것입니다. 중복된 문자열이 생성됩니다.toString
실행 시 생성됩니다.a = a+b
.StringBuilder.toString()
.new StringBuffer("abc")