먼저 创建对象의 구체적인 의미를 명확히 하자면, 제가 이해한 바에 따르면 문자열이 字符常量이면 문자열 개체는 컴파일 타임에 결정되어 상수 풀에 저장되므로 String b = new String("abc") 같은 연산이 있으면 문자열 객체가 생성되어 b 변수와 연결된다고 볼 수 있습니다.
위 정의에 따르면 "a", "b", "abc", "567"은 모두 상수이며 상수 풀에 배치되므로 객체로 생성되지 않습니다.
그런 다음 코드를 살펴보세요.
소스 코드:
으아악
편의상 각 줄에 수동으로 번호를 매겼습니다.
해당 바이트코드를 살펴보겠습니다.
으아악
바이트코드에서 볼 수 있듯이 소스 코드의 네 번째 줄
은 다음 코드로 번역됩니다. a = a+b
으아악
여기에 새 객체
가 생성되고 new StringBuilder() 메서드가 호출됩니다. builder.toString()
으아악
그래서
메소드는 String 객체를 생성하므로 이제 builder.toString()을 생성했습니다.两个对象
그러면 다섯 번째 줄
은 의심할 여지없이 StringBuffer d = new StringBuffer("abc") 객체를 생성하므로 StringBuffer이 있습니다. 한 가지 주목할 점은 三个对象이 처음부터 끝까지 StringBuffer d 메서드를 호출하지 않는다는 것입니다. 중복된 문자열이 생성됩니다.toString
제가 이해한 바를 말씀해 주시고 제안해 주시기 바랍니다
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
또 다른 점은 StringBuffer와 StringBuilder가 AbstractStringBuilder를 상속하므로 상위 클래스가 생성될 수 있다는 것입니다.
디컴파일된 코드는 다음과 같습니다.
으아악먼저 답을 말씀드리자면 3인 것 같아요.
먼저
위 정의에 따르면 "a", "b", "abc", "567"은 모두 상수이며 상수 풀에 배치되므로 객체로 생성되지 않습니다.创建对象
의 구체적인 의미를 명확히 하자면, 제가 이해한 바에 따르면 문자열이字符常量
이면 문자열 개체는 컴파일 타임에 결정되어 상수 풀에 저장되므로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")
답변 감사드립니다. 안타깝게도 지금은 디컴파일된 코드를 이해할 수 없습니다.