0

我了解不可变对象是无法修改的对象。但是当我们使用函数时,可以修改字符串。那么我们如何说字符串是不可变的呢?这是一个提问的采访。需要尽快答复

4

4 回答 4

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"调用修改;相反,我们用 just 取回了一个字符串。substring"testing"

String对象在 Java 中是不可变的,因为它们不提供修改现有String对象状态的方法。它们仅提供基于现有对象的内容创建新对象的方法。 String

(当然,除非您确实在反射中玩非常顽皮的游戏,否则以上是当然的。)

于 2013-03-04T10:00:25.533 回答
1

还有一件事是,当你创建一个字符串时,会在堆中为其分配一块内存,当你更改它的值时,会为该字符串创建一个新的内存块,而旧的内存块将有资格进行垃圾回收, 例如

String first = "xyz";    
String second = "xyz";    
second = "abc";

现在,当第一个被创建时,在堆中为“第一个”保留一块内存,而“第二个”没有分配新空间,因为它们指向同一个东西,因此第二个指向堆中的相同空间,最后是当第二个值被改变它指向一个新的内存位置。因此字符串是不可变的,因为它的内容永远不会改变..它们被删除并分配新的内容...使用调试器并查看内存是如何被占用的..并注意原始数据类型的相同情况...内容不会改变他们的记忆位置..

希望能帮助到你!

于 2013-05-09T19:43:10.347 回答
0

原因1.String是java中的对象。所以你不能随时改变..作为一个例子

String s= new String ("Md Omar Faroque");                                                                 
s.concat("anik");   
System.out.println(s);   

输出将是:“Md Omar Faroque”。

这是为什么?当您添加“Anik”和“Md Omar Faroque”时,它变成了一个名为“Md Omar Faroque Anik”的新字符串。此新字符串未引用任何新变量。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 变成了一个新的字符串“spring winter”。它忘记了之前的值“spring”。由于 s1 现在提到“春冬”,所以它已经打印出来了。
在第 2 行中,s2 引用了“春夏”。所以它已经打印在第 2 行,它再次与 s1 连接,并创建了新字符串“spring summer spring”。但是没有新变量引用这个值“spring summer spring”,仍然s2指向“spring summer”。

于 2014-02-09T01:58:54.690 回答
-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
        }

    }

}
于 2015-06-14T18:24:21.533 回答