>Java >Java베이스 >Java에서 문자열이 '+'에 대해 무엇을 하는지 알고 있습니까?

Java에서 문자열이 '+'에 대해 무엇을 하는지 알고 있습니까?

coldplay.xixi
coldplay.xixi앞으로
2020-09-14 13:51:322086검색

Java에서 문자열이 '+'에 대해 무엇을 하는지 알고 있습니까?

관련 학습 권장 사항: java 기본 튜토리얼

간단한 코드가 있습니다

public class StringPlusTest{
    public static void main(String[] args) {
        String s1 = "aaa";
        String s2 = "bbb";
        String s = "ccc" +s1 + s2 +"ddd";
    }}

javap -c .StringPlusTest.class를 사용하여 디컴파일하고

Compiled from "StringPlusTest.java"public class com.epoint.codetuning.test.StringPlusTest {
  public com.epoint.codetuning.test.StringPlusTest();
    Code:
       0: aload_0       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: ldc           #2                  // String aaa
       2: astore_1       3: ldc           #3                  // String bbb
       5: astore_2       6: new           #4                  // class java/lang/StringBuilder
       9: dup      10: invokespecial #5                  // Method java/lang/StringBuilder."<init>":()V
      13: ldc           #6                  // String ccc
      15: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      18: aload_1      19: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      22: aload_2      23: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      26: ldc           #8                  // String ddd
      28: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      31: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      34: astore_3      35: return}

를 얻으세요. 그 중

ldc 把常量池中的项压入栈
astore_1 将引用类型或returnAddress类型值存入局部变量1
astore_2 将引用类型或returnAddress类型值存入局部变量2
new 创建一个新对象
dup 复制栈顶部一个字长内容
invokespecial 根据编译时类型来调用实例方法
aload_1 从局部变量1中装载引用类型值
aload_2 从局部变量2中装载引用类型值
astore_3 将引用类型或returnAddress类型值存入局部变量3

자세한 지침은 JVM 사용 설명서를 참조하세요.

Java의 경우 이 코드는 원칙적으로 다음과 같아야 합니다.

public class StringPlusTest{
    public static void main(String[] args) {
        String s1 = "aaa";
        String s2 = "bbb";
        String s = new StringBuilder().append("ccc").append(s1).append(s2).append("ddd").toString();
    }}

Java에서 문자열을 연결하기 위해 "+"를 사용하는 구현 원칙은 임시 StringBuilder 개체를 만들고 추가 및 toString 메서드를 호출하는 것임을 알 수 있습니다.

위 코드를 일부 수정했습니다

public class StringPlusTest{
    public static void main(String[] args) {
        String s1 = "aaa";
        String s2 = null;
        String s = "ccc" +s1 + s2 +"ddd";
        System.out.println(s);
    }}

결과는 무엇인가요?

다음을 실행하여 얻을 수 있습니다.

cccaaanullddd

StringBuilder 소스 코드 보기

@Overridepublic StringBuilder append(String str) {
    super.append(str);
    return this;}

이 메서드는 상위 클래스 AbstractStringBuilder를 상속하는 메서드를 호출한 다음 상위 클래스로 이동하여

 public AbstractStringBuilder append(String str) {
        if (str == null)
            return appendNull();
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len;
        return this;}private AbstractStringBuilder appendNull() {
    int c = count;
    ensureCapacityInternal(c + 4);
    final char[] value = this.value;
    value[c++] = &#39;n&#39;;
    value[c++] = &#39;u&#39;;
    value[c++] = &#39;l&#39;;
    value[c++] = &#39;l&#39;;
    count = c;
    return this;}

appendNull 메서드는 단순히 다음을 의미합니다. 용량 + 4, 널 문자열 추가.

그래서 결과는 "cccaaanullddd"입니다.

프로그래밍 학습에 대해 더 자세히 알고 싶다면 php training 칼럼을 주목해주세요!

위 내용은 Java에서 문자열이 '+'에 대해 무엇을 하는지 알고 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제