java如何使用StringAppend编译对Strings的添加操作以及如何定义这样的自创建对象的操作行为

问题描述 投票:-2回答:3

----------已更新-------

我以为不会那么直截了当,但事实证明,它可以无缝地以这种方式工作。

仅适用于汽车String a = "abc" + 'c';String a = "abc" + "a";

我研究了String和CharSequence类的源代码,但没有找到启用此方案的确切方法。

而且,我还怀疑是否可能存在对String或char的“ +”加运算符的覆盖,但是我不知道在哪里搜索线索。

我以这种方式表示怀疑,因为我也是Python用户,并且存在覆盖诸如python __add__之类的魔术函数的场景,该魔术函数定义了当对象充当“ +”操作数或添加操作。我只想知道在哪里可以找到将String a = "abc" + 'c';编译为StringBuilder.append()的java的线索。我只想看看此过程在哪里进行。但是知道了这一点,我想我可以知道当自创建对象是某些基本操作的操作数时如何启用它们。

非常感谢。

java string char
3个回答
0
投票

我研究了String和CharSequence类的源代码,但没有找到启用此方案的确切方法。

您在寻找错误的位置。

而且,我还怀疑是否可能存在对String或char的“ +”加运算符的覆盖,但是我不知道在哪里搜索线索。

要去的地方是:

  • 字节码编译器发出的字节码。您可以使用javap命令检查它们。使用-c选项查看反汇编的字节码。
  • Java语言规范(JLS)准确地说明了+的含义,并解释了如何允许Java编译器将+转换为对String方法的各种不同调用序列。要读取的部分是JLS 15.18.1
  • Java编译器本身的源代码;即javac或等效的第三方。这将提供编译器在决定如何转换字符串+运算符时使用的definitive逻辑。

实际上,以上内容适用于Java 8及更早版本。在Java 9 / JEP 280中,他们将内容更改为使用invokedynamic表示连接序列,以便JIT编译器具有更大的自由度来优化实际的调用序列。参见:

在Java 9或更高版本中,您需要查看JIT编译器发出的本机代码,以了解如何实际实现串联。


而且,正如我已经更新的那样,我对方式的怀疑是,因为事实是,诸如python中的__add__之类的魔术方法可以在执行添加操作时定义对象的行为。考虑到Java中的字符串连接,这似乎与我相似。

[不要根据您对Python的了解来理解Java实现。语言及其实现是非常不同的。首先,没有等效的__方法。 Java运算符转换为字节码。应用程序无法使它们过载。

相反,请阅读Java语言和虚拟机规范。


1
投票

Java编译器透明地转换表达式,如

String str3 = str1 + str2;

to

StringBuilder sb = new StringBuilder();
sb.append(str1).append(str2);
str3 = sb.toString();

由于StringBuilder具有许多数据类型(包括char)的匹配方法,因此可以使用+运算符将String和char连接起来。


-1
投票

如果在字符串中添加单个字符,则可以使用StringBuilder / StringBuffer并将字符串/字符放入其中

关于第二部分:

我想将char [] []转换为Character [] []非常简单:

public Character[][] transform(char[][] array) {
    Character[][] out = new Character[array.length][];
    for (int i = 0; i < array.length; i++) {
        out[i] = transform(array[i]);
    }
    return out;
}

private Character[] transform(char[] chars) {
    Character[] arr = new Character[chars.length];
    for (int i = 0; i < chars.length; i++) {
        arr[i] = chars[i];
    }
    return arr;
}

但是,从Character [] []到char [] []的转换很棘手,因为Character是一个对象,所以需要考虑如何将空Character转换为原始char

© www.soinside.com 2019 - 2024. All rights reserved.