----------已更新-------
我以为不会那么直截了当,但事实证明,它可以无缝地以这种方式工作。
仅适用于汽车String a = "abc" + 'c';
和String a = "abc" + "a";
我研究了String和CharSequence类的源代码,但没有找到启用此方案的确切方法。
而且,我还怀疑是否可能存在对String或char的“ +”加运算符的覆盖,但是我不知道在哪里搜索线索。
我以这种方式表示怀疑,因为我也是Python用户,并且存在覆盖诸如python
__add__
之类的魔术函数的场景,该魔术函数定义了当对象充当“ +”操作数或添加操作。我只想知道在哪里可以找到将String a = "abc" + 'c';
编译为StringBuilder.append()
的java的线索。我只想看看此过程在哪里进行。但是知道了这一点,我想我可以知道当自创建对象是某些基本操作的操作数时如何启用它们。
非常感谢。
我研究了String和CharSequence类的源代码,但没有找到启用此方案的确切方法。
您在寻找错误的位置。
而且,我还怀疑是否可能存在对String或char的“ +”加运算符的覆盖,但是我不知道在哪里搜索线索。
要去的地方是:
javap
命令检查它们。使用-c
选项查看反汇编的字节码。+
的含义,并解释了如何允许Java编译器将+
转换为对String
方法的各种不同调用序列。要读取的部分是JLS 15.18.1javac
或等效的第三方。这将提供编译器在决定如何转换字符串+
运算符时使用的definitive逻辑。实际上,以上内容适用于Java 8及更早版本。在Java 9 / JEP 280中,他们将内容更改为使用invokedynamic
表示连接序列,以便JIT编译器具有更大的自由度来优化实际的调用序列。参见:
在Java 9或更高版本中,您需要查看JIT编译器发出的本机代码,以了解如何实际实现串联。
而且,正如我已经更新的那样,我对方式的怀疑是,因为事实是,诸如python中的
__add__
之类的魔术方法可以在执行添加操作时定义对象的行为。考虑到Java中的字符串连接,这似乎与我相似。
[不要根据您对Python的了解来理解Java实现。语言及其实现是非常不同的。首先,没有等效的__
方法。 Java运算符转换为字节码。应用程序无法使它们过载。
相反,请阅读Java语言和虚拟机规范。
Java编译器透明地转换表达式,如
String str3 = str1 + str2;
to
StringBuilder sb = new StringBuilder();
sb.append(str1).append(str2);
str3 = sb.toString();
由于StringBuilder
具有许多数据类型(包括char
)的匹配方法,因此可以使用+运算符将String和char连接起来。
如果在字符串中添加单个字符,则可以使用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
。