据我所知,Java中的String不是原始的而是对象。 Java还有一些快捷方式,可以更轻松地使用字符串,因此我们不必使用new String()
或使用+
运算符连接两个字符串。
所以我写了以下小测试:
package programming.project.test;
public class JavaStringTests {
public static void main(String[] args) {
String test1 = new String("uno dos ");
MyString test2 = new MyString("uno dos ");
System.out.println(test1);
System.out.println(test2);
extendMe(test1);
extendMe(test2);
//primitive-like behavior?
System.out.println("(String) -> " + test1);
//expected if String is not a primitive
System.out.println("(MyString) -> " + test2);
}
private static void extendMe(MyString blubb) {
blubb.add("tres ");
}
private static void extendMe(String blubb) {
blubb = blubb + "tres ";
}
}
MyString类:
public class MyString {
String str;
public MyString(String str) {
this.str = str;
}
public String toString() {
return str;
}
public void add(String addme) {
str += addme;
}
}
产生以下输出:
uno dos
uno dos
(String) -> uno dos
(MyString) -> uno dos tres
如果String是一个对象,为什么它作为参数传递时会自动创建它的新实例? String是某种类似原始的对象,是原始对象和对象之间的东西吗?
答案 0 :(得分:2)
extendMe不会按照您的想法行事。字符串是不可变的,它们是不可更改的。 String.concat()不会更改字符串,它会返回一个新实例,您可以在代码中放弃该实例。
答案 1 :(得分:0)
private static void extendMe(String blubb) {
blubb.concat("tres ");
}
这里String.concat返回一个带有连接值的新String。
在哪里
private static void extendMe(MyString blubb) {
blubb.concat("tres ");
}
在这里,您将为内部str状态添加连接值。