sourcecode

String 클래스는 + 연산자를 어떻게 덮어쓰나요?

copyscript 2022. 9. 18. 10:10
반응형

String 클래스는 + 연산자를 어떻게 덮어쓰나요?

왜 자바 섬에 있을 때 String클래스+연산자와 천을 추가할 수 있을까요?사용하여 String을수 있습니까 추가할 Java에서 String이 왜+연산자를 클래스인데?the에서에서String.java코드 나는 이 운영자에 대한 구현을 찾지 않았습니다.코드 이 오퍼레이터를 위한 구현을 찾을 수 없습니다.이 개념 객체 지향을 어기는 것인가요?이 개념은 방향을 위반합니까 객체?

Java에서 다음과 같은 간단한 표현을 살펴보겠습니다.

int x=15;
String temp="x = "+x;

컴파일러컴파일러가 변환하다로 변환합니다"x = "+x;한 에에StringBuilder내부적으로 사용내부 및 용도.append(int)활에 정수"추가".정수를 문자열에"추가"합니다.

5.1.11. 문자열 변환

모든 유형을 문자열 변환에 의해 String 유형으로 변환할 수 있습니다.

우선 적절한 클래스 인스턴스 작성식(θ15.9)에 인수로서 부여한 것처럼 원시형 T의 값 x를 기준값으로 변환한다.

  • T가 부울일 경우 새로운 부울(x)을 사용합니다.
  • T가 char이면 새로운 Character(x)를 사용합니다.
  • T가 바이트, 쇼트 또는 int인 경우 새로운 Integer(x)를 사용합니다.
  • T가 길면 새로운 Long(x)을 사용합니다.
  • T가 Float이면 새 Float(x)를 사용하십시오.
  • T가 이중이면 새 Double(x)을 사용합니다.

이 기준값은 String by string 변환으로 변환됩니다.

이제 기준 값만 고려하면 됩니다.

  • 참조가 null인 경우 문자열 "null"(4개의 ASCII 문자 n, u, l, l)로 변환됩니다.
  • 그 이외의 경우 변환은 인수 없이 참조된 객체의 toString 메서드를 호출한 경우와 동일하게 실행됩니다.단, toString 메서드를 호출한 결과가 늘일 경우 문자열 "null"이 대신 사용됩니다.

toString 메서드는 초기 클래스 오브젝트('4.3.2)에 의해 정의됩니다.부울, 문자, 정수, 긴, 부동, 이중 및 문자열 등 많은 클래스가 이 값을 재정의합니다.

문자열 변환 컨텍스트의 상세한 것에 대하여는, 「」5.4 를 참조해 주세요.

15.18.1.

String Connection 최적화 : 중간 String 객체의 작성 및 폐기를 피하기 위해 구현에서는 변환과 연결을 한 번에 실행하도록 선택할 수 있습니다.반복 문자열 연결의 성능을 높이기 위해 Java 컴파일러는 StringBuffer 클래스 또는 이와 유사한 기술을 사용하여 식을 평가하여 생성되는 중간 문자열 개체의 수를 줄일 수 있습니다.

원시 타입의 경우 구현은 원시 타입에서 문자열로 직접 변환함으로써 래퍼 오브젝트의 생성을 최적화할 수도 있습니다.

최적화된 버전은 실제로 처음에 완전 랩된 String 변환을 수행하지 않습니다.

이것은 컴파일러가 백그라운드에서 String Builder로 변경하는 것을 볼 수 있는 프리미티브 변환은 없지만 컴파일러에 의해 사용되는 최적화된 버전의 좋은 예입니다.

http://caprazzi.net/posts/java-bytecode-string-concatenation-and-stringbuilder/


다음 자바 코드:

public static void main(String[] args) {
    String cip = "cip";
    String ciop = "ciop";
    String plus = cip + ciop;
    String build = new StringBuilder(cip).append(ciop).toString();
}

이를 생성합니다. 두 연결 스타일이 동일한 바이트 코드를 생성하는 방법을 확인하십시오.

 L0
    LINENUMBER 23 L0
    LDC "cip"
    ASTORE 1
   L1
    LINENUMBER 24 L1
    LDC "ciop"
    ASTORE 2

   // cip + ciop

   L2
    LINENUMBER 25 L2

    NEW java/lang/StringBuilder
    DUP
    ALOAD 1
    INVOKESTATIC java/lang/String.valueOf(Ljava/lang/Object;)Ljava/lang/String;
    INVOKESPECIAL java/lang/StringBuilder.<init>(Ljava/lang/String;)V
    ALOAD 2
    INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String;

    ASTORE 3

    // new StringBuilder(cip).append(ciop).toString()

   L3
    LINENUMBER 26 L3

    NEW java/lang/StringBuilder
    DUP
    ALOAD 1
    INVOKESPECIAL java/lang/StringBuilder.<init>(Ljava/lang/String;)V
    ALOAD 2
    INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String;

    ASTORE 4
   L4
    LINENUMBER 27 L4
    RETURN

위의 예와 주어진 예에서 소스 코드에 기반한 바이트 코드가 생성되는 방법을 보면 컴파일러가 내부적으로 다음 문을 변환했음을 알 수 있습니다.

cip+ciop; 

안으로

new StringBuilder(cip).append(ciop).toString();

다른 말로, 연산자 즉, 오퍼레이터는.+문자열에서 더 장황한 문자열에 연속되는 사건들은 효과적으로 속기 연결은보다 장황한효과적인 줄임말이다 나타내는 것을.StringBuilderidiom.사자성어

는피연산자를 체크합니다 기능으로 컴파일러이것은 자바의 피연산자를 확인합니다 그것은 자바 컴파일러 기능입니다.+코드를 합니다.오퍼랜드를 기반으로 바이트 코드를 생성합니다.

  • String의 경우 문자열을 조합하는 코드를 생성합니다.
  • 숫자의 경우 숫자를 추가하는 코드를 생성합니다.

Java 사양에는 다음과 같이 기재되어 있습니다.

+ 및 "+"-가법 연산자라고 합니다.AdditionExpression(추가식):+ AdditionExpression + MultiplativeExpression AdditionExpression - MultiplativeExpression

가법 연산자는 우선순위가 같고 구문적으로 왼쪽 연관성이 있습니다(왼쪽에서 오른쪽으로 그룹화).연산자의 어느 하나의 오퍼랜드 타입이 인 경우 동작은 문자열 연결입니다.

이외의 경우, 「」의 각 .+연산자는 기본 숫자 유형으로 변환할 수 있는 유형이어야 합니다. 그렇지 않으면 컴파일 시간 오류가 발생합니다.

경우든 각 .-연산자는 기본 숫자 유형으로 변환할 수 있는 유형이어야 합니다. 그렇지 않으면 컴파일 시간 오류가 발생합니다.

String 클래스는 + 연산자를 어떻게 덮어쓰나요?

그렇지 않아요.컴파일러가 합니다.엄밀히 말하면, 컴파일러는 String 오퍼랜드의 + 연산자를 오버로드합니다.

우선(+)이 오버로드되어 덮어쓰지 않음

Java 언어는 Java Strings 개체에 대해 오버로드된 문자열 연결 연산자(+)를 특별히 지원합니다.

  1. 왼쪽 피연산자가 String이면 연결로 작동합니다.

  2. 왼쪽 피연산자가 Integer인 경우 추가 연산자로 작동합니다.

Java 언어는 문자열 연결 연산자(+) 및 다른 개체를 문자열로 변환하기 위한 특별한 지원을 제공합니다.문자열 연결은 를 통해 구현됩니다.StringBuilder(또는StringBuffer) 클래스 및 그append방법.

의 의미+연산자(적용되는 경우)String모두 이미 쓰셨듯이 언어에 의해 정의됩니다.이것이 충분히 납득할 수 없다고 생각되므로 다음 사항을 고려하십시오.

ints, floats 및 double은 모두 다른 바이너리 표현을 가지고 있습니다.따라서 2개의 int를 추가하는 것은 2개의 float를 추가하는 것과는 비트 조작에 있어서 다른 연산입니다.int의 경우 비트를 하나씩 추가하여 오버플로우를 확인할 수 있습니다. 플로트의 경우 맨티사와 지수를 별도로 처리해야 합니다.

따라서 원칙적으로 "추가"는 "추가"되는 객체의 특성에 따라 달라집니다.Java는 문자열과 int 및 float(긴 길이, 두 배 등)에 대해 정의합니다.

+연산자는 보통 a로 대체됩니다.StringBuilder컴파일 시.그 문제에 대한 자세한 내용은 이 답변을 참조하십시오.

언급URL : https://stackoverflow.com/questions/11408427/how-does-the-string-class-override-the-operator

반응형