Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 为什么字符串在java中被称为不可变的?_String_Immutability - Fatal编程技术网

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:不客气!我知道您的意思。”