java - 以下创建了几个对象
PHP中文网
PHP中文网 2017-04-18 10:23:06
0
3
833

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.

PHP中文网
PHP中文网

认证0级讲师

모든 응답(3)
小葫芦

제가 이해한 바를 말씀해 주시고 제안해 주시기 바랍니다

  • 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인 것 같아요.


먼저 创建对象의 구체적인 의미를 명확히 하자면, 제가 이해한 바에 따르면 문자열이 字符常量이면 문자열 개체는 컴파일 타임에 결정되어 상수 풀에 저장되므로 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": 문자열 상수, 생성된 개체로 계산되지 않음

  • "b": 문자열 상수, 생성된 개체로 계산되지 않음

  • 빌더 객체:

    실행 시 생성됩니다.a = a+b

  • "ab": 작성자:

    .StringBuilder.toString()

  • "abc": 문자열 상수, 생성된 개체로 계산되지 않음

  • "567": 문자열 상수, 생성된 개체로 계산되지 않음

  • d: 작성자:

    .new StringBuffer("abc")

드디어 세 개의 객체가 생성되었습니다.

阿神

답변 감사드립니다. 안타깝게도 지금은 디컴파일된 코드를 이해할 수 없습니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿