我知道不可变对象是无法修改的对象。但是当我们使用函数时可以修改字符串。那么我们怎么说字符串是不可变的?这是一个问题采访。需要回答asap
答案 0 :(得分:5)
但是当我们使用函数时可以修改字符串。
不,你得到的是一个不同的字符串。例如:
String a, b, c;
a = "testing 1 2 3";
b = a.substring(0, 7); // Creates new string for `b`, does NOT modify `a`
c = a.substring(8);
System.out.println(b); // "testing"
System.out.println(c); // "1 2 3", proves that `a` was not modified when we created `b`
正如您所看到的,"testing 1 2 3"
调用字符串substring
不修改了;相反,我们只用"testing"
返回了一个 new 字符串。
String
对象在Java中是不可变的,因为它们不提供修改现有String
对象状态的方法。它们仅提供基于现有内容创建新 String
对象的方法。
(当然,除非你用反射玩非常顽皮的游戏,否则上面就是这样。)
答案 1 :(得分:1)
还有一件事是,当你创建一个字符串时,会在堆中为它分配一块内存,当你更改它的值时,会为该字符串创建一个新的内存块,而旧的内存符合条件。用于垃圾收集,例如
String first = "xyz";
String second = "xyz";
second = "abc";
现在,当第一个被创建时,一个内存块被保留在堆中的“第一个”,并且“第二个”新空间没有被分配,因为它们指向同一个东西,因此第二个指向堆中的相同空间,最后,当第二个值改变时,它指向一个新的内存位置。因此字符串是不可变的,因为它的内容永远不会改变..它们被删除并且新内容被分配...... 使用dubugger并查看内存是如何被占用的..并注意原始数据类型的相同内容...内容不会改变它们的内存位置..
希望它有所帮助!
答案 2 :(得分:0)
原因1. String是java中的一个对象。所以你不能随时改变......作为一个例子
String s= new String ("Md Omar Faroque");
s.concat("anik");
System.out.println(s);
输出将是:“Md Omar Faroque”。
为什么?当你用“Md Omar Faroque”添加“Anik”时,它就变成了一个名为“Md Omar Faroque Anik”的新String。此新String不会引用任何新变量。 S仍然是“Md Omar Faroque”的参考变量。
再举一个例子:
1. String s1 = "spring ";
2. String s2 = s1 + "summer ";
3. s1.concat("fall ");
4. s2.concat(s1);
5. s1 += "winter ";
6. System.out.println(s1 + " " + s2);
输出应该是“春冬春夏”
为什么?在第5行,s1成为一个新的字符串“春天的冬天”。它忘记了以前的价值“春天”。由于现在s1引用了“春天的冬天”,所以它已经打印出来了 在第2行中,s2参考“春夏”。因此它已经打印在第2行,它再次与s1连接,并创建了新的字符串“春夏季春天”。但没有新的变量参考这个值“春夏季春天”,仍然s2指向“春夏”。
答案 3 :(得分:-1)
public class Example{
public static void main(String[] args) {
String s = "hello";
String a = s;
if (a == s) {// it will print if part of statement
System.out.println("same reference");
} else {
System.out.println("not same reference");
}
s = "hi";// now we have change this 's'
if (a == s) { // if we have changed the same s reference the it should
// print same reference
System.out.println("same reference");
} else {
System.out.println("not same reference");// but it will printed
}
}
}