考虑下面的例子。
String str = new String();
str = "Hello";
System.out.println(str); //Prints Hello
str = "Help!";
System.out.println(str); //Prints Help!
在Java中,String对象是不可变的。那么为什么对象str可以被赋值为"Help!"呢?这难道不是与Java中字符串的不变性相矛盾吗?有人能给我解释一下不变性的确切概念吗?
编辑:
好的。我现在明白了,但还有一个问题。下面的代码呢:
String str = "Mississippi";
System.out.println(str); // prints Mississippi
str = str.replace("i", "!");
System.out.println(str); // prints M!ss!ss!pp!
这是否意味着将再次创建两个对象(“Mississippi”和“M!ss!ss!pp!”),并且在replace()方法之后引用str指向不同的对象?
我会用一个简单的例子来解释
考虑任何字符数组:例如char[] ={‘h’,‘e’,‘l’,‘l’,”o '};
和一个字符串:
字符串s =“你好”;
在字符数组上,我们可以执行如下操作:使用迭代数组只打印最后三个字母;
但在字符串中,我们必须创建新的字符串对象并复制所需的子字符串,其地址将在新的字符串对象中。
e.g.
***String s="hello";
String s2=s.substrig(0,3);***
s2有“hel”;
我建议你读一读《Cup Size》——一个关于变量和值传递的故事(续《Cup Size》)。这对阅读上面的文章有很大帮助。
你读过吗?是的。好。
String str = new String();
这将创建一个名为“str”的新“远程控制”,并将其设置为值new String()(或“”)。
例如,在内存中创建:
str --- > ""
str = "Hello";
这将更改远程控制“str”,但不会修改原始字符串“”。
例如,在内存中创建:
str -+ ""
+-> "Hello"
str = "Help!";
这将更改远程控件“str”,但不会修改原始字符串“”或远程控件当前指向的对象。
例如,在内存中创建:
str -+ ""
| "Hello"
+-> "Help!"
我会用一个简单的例子来解释
考虑任何字符数组:例如char[] ={‘h’,‘e’,‘l’,‘l’,”o '};
和一个字符串:
字符串s =“你好”;
在字符数组上,我们可以执行如下操作:使用迭代数组只打印最后三个字母;
但在字符串中,我们必须创建新的字符串对象并复制所需的子字符串,其地址将在新的字符串对象中。
e.g.
***String s="hello";
String s2=s.substrig(0,3);***
s2有“hel”;