为什么string在java中被称为immutable?

时间:2013-03-04 09:55:00

标签: string immutability

我知道不可变对象是无法修改的对象。但是当我们使用函数时可以修改字符串。那么我们怎么说字符串是不可变的?这是一个问题采访。需要回答asap

4 个答案:

答案 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
        }

    }

}