찾다

 >  Q&A  >  본문

java - 以下创建了几个对象

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中文网2803일 전840

모든 응답(3)나는 대답할 것이다

  • 高洛峰

    高洛峰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를 상속하므로 상위 클래스가 생성될 수 있다는 것입니다.

    디컴파일된 코드는 다음과 같습니다.

    으아악

    회신하다
    0
  • 迷茫

    迷茫2017-04-18 10:25:06

    먼저 답을 말씀드리자면 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")

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

    회신하다
    0
  • 阿神

    阿神2017-04-18 10:25:06

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

    회신하다
    0
  • 취소회신하다