String 为什么字符串在java中被称为不可变的?
我知道不可变对象是不能修改的对象。但当我们使用函数时,字符串是可以修改的。那么我们怎么说字符串是不可变的呢?这是一个采访提问。需要尽快答复吗 但当我们使用函数时,字符串是可以修改的 不,您得到的是一个不同的字符串。例如:String 为什么字符串在java中被称为不可变的?,string,immutability,String,Immutability,我知道不可变对象是不能修改的对象。但当我们使用函数时,字符串是可以修改的。那么我们怎么说字符串是不可变的呢?这是一个采访提问。需要尽快答复吗 但当我们使用函数时,字符串是可以修改的 不,您得到的是一个不同的字符串。例如: 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); Syste
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”
未被子字符串
调用修改;相反,我们得到了一个新字符串,其中只包含“testing”
String
对象在Java中是不可变的,因为它们不提供修改现有String
对象状态的方法。它们只提供基于现有对象内容创建新字符串对象的方法
(当然,除非你真的玩了非常顽皮的反省游戏。)
但当我们使用函数时,字符串是可以修改的
不,您得到的是一个不同的字符串。例如:
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”
未被子字符串
调用修改;相反,我们得到了一个新字符串,其中只包含“testing”
String
对象在Java中是不可变的,因为它们不提供修改现有String
对象状态的方法。它们只提供基于现有对象内容创建新字符串对象的方法
(当然,上面是,除非你真的玩了非常顽皮的反射游戏。)还有一件事是,当你创建一个字符串时,会在堆中为它分配一个内存块,当你更改它的值时,会为该字符串创建一个新的内存块,例如,旧的内存块可以进行垃圾收集
String first = "xyz";
String second = "xyz";
second = "abc";
现在,当创建第一个时,在堆中为“第一个”保留一块内存,而为“第二个”不分配新空间,因为它们指向同一个对象,因此第二个指向堆中的同一个空间,最后当第二个值更改时,它指向一个新的内存位置。因此字符串是不可变的,因为它的内容永远不会更改。。它们将被删除并分配新内容。。。
使用dubugger,查看内存是如何被占用的。。注意,对于原始数据类型也是一样的。。。这些内容不会更改其内存位置
希望有帮助 还有一件事是,当您创建一个字符串时,会在堆中为其分配一个内存块,当您更改其值时,会为该字符串创建一个新的内存块,例如,旧的内存块可以进行垃圾收集
String first = "xyz";
String second = "xyz";
second = "abc";
现在,当创建第一个时,在堆中为“第一个”保留一块内存,而为“第二个”不分配新空间,因为它们指向同一个对象,因此第二个指向堆中的同一个空间,最后当第二个值更改时,它指向一个新的内存位置。因此字符串是不可变的,因为它的内容永远不会更改。。它们将被删除并分配新内容。。。
使用dubugger,查看内存是如何被占用的。。注意,对于原始数据类型也是一样的。。。这些内容不会更改其内存位置
希望有帮助 原因一。字符串是java中的一个对象。所以你不能在任何时候改变..举个例子
String s= new String ("Md Omar Faroque");
s.concat("anik");
System.out.println(s);
输出为:“Md Omar Faroquie”
为什么呢?当您将“Anik”与“Md-Omar-faroquie”一起添加时,它将成为一个名为“Md-Omar-faroquie-Anik”的新字符串。此新字符串未引用到任何新变量。S仍然是“Md Omar Faroquie”的参考变量
再举一个例子:
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变成了一个新字符串“spring winter”。它忘记了前面的值“spring”。由于s1现在引用了“春冬”,所以它已经打印出来了。
在第2行中,s2指的是“春夏”。所以它在第2行中打印出来,它再次与s1连接,并创建了新字符串“spring-summer-spring”。但没有新变量引用该值“spring-summer-spring”,s2仍然指向“spring-summer”。原因1。字符串是java中的一个对象。所以你不能在任何时候改变..举个例子
String s= new String ("Md Omar Faroque");
s.concat("anik");
System.out.println(s);
输出为:“Md Omar Faroquie”
为什么呢?当您将“Anik”与“Md-Omar-faroquie”一起添加时,它将成为一个名为“Md-Omar-faroquie-Anik”的新字符串。此新字符串未引用到任何新变量。S仍然是“Md Omar Faroquie”的参考变量
再举一个例子:
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变成了一个新字符串“spring winter”。它忘记了前面的值“spring”。由于s1现在引用了“春冬”,所以它已经打印出来了。
在第2行中,s2指的是“春夏”。所以它在第2行中打印出来,它再次与s1连接,并创建了新字符串“spring-summer-spring”。但是没有新的变量引用这个值“spring-summer-spring”,s2仍然指向“spring-summer”。这里有类似的帖子-这里有类似的帖子-谢谢你提供的信息。@Nithya:不客气!我知道你解释的是100%正确的,只需要用专家的话再解释一下,a=a+“某物”,现在,System.out.println(a),最肯定的是它被修改了,请把你的专家解释给我this@HussainAkhtarWahid:在a=a+“某物”中
,用于指向的字符串a
不变,但会创建一个新字符串,并更新a
以指向新字符串。任何引用旧字符串的内容都不受影响。尝试字符串a、b;a=“一”;b=a;a=a+“二”;系统输出打印ln(b);“
您会看到前面的字符串没有更改,并且b
仍然指向它。谢谢您提供的信息。@Nithya:不客气!我知道您的意思。”