2013-03-04 22 views
0

我知道Immutable对象是无法修改的对象。但是当我们使用函数时,字符串可以被修改。那么我们怎么说字符串是不可变的?这是一个接受采访的问题。 Need asap为什么字符串在java中被称为immutable?

+1

相似的文章在这里 - http://stackoverflow.com/questions/1552301/immutability-of-strings-in-java – mtk 2013-03-04 14:05:26

回答

4

但是在使用函数时可以修改字符串。

不,你回来的是不同字符串。例如:

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"

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

(以上内容,当然,除非你与反思玩很调皮的游戏确实。)

+0

谢谢你的信息。 – Nithya 2013-03-05 13:42:46

+0

@Nithya:不客气! – 2013-03-05 13:43:54

+0

我知道你说的是100%正确的,只需要在专家的话中多一点解释,a = a +“something”,现在,System.out.println(a); ,绝对是它的改变,请把你的专家解释到这个 – 2013-11-05 06:33:07

1

一件事是,当你创建一个字符串,内存块在分配给它堆,当你改变它的价值,是该字符串创建一个新的内存块,并且首先是创建一个内存块时,保持旧有资格进行垃圾回收,例如现在

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

对于堆中的“第一”,对于“第二”新的空间不分配,因为它们指向sa因此第二点指向堆中的相同空间,最后当第二个值改变时它指向一个新的内存位置。因此,字符串是不可变的,因为它的内容永远不会改变..他们被删除,并分配新的内容... 使用dubugger,看看如何占用内存..并注意与原始数据类型相同的东西...有内容改变不是他们的记忆位置..

希望它有帮助!

0

原因1.字符串是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成为一个新的字符串“春天的冬天”。它忘记了以前的价值“春天”。由于s1现在引用了“春天的冬天”,所以它已经打印了。
在第2行中,s2引用了“春夏”。所以它已经在第二行打印了,它再次和s1连接在一起,并创建了新的字符串“春夏之春”。但没有新的变量参考这个值“春夏季春”,仍然s2指向“春夏”。

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

    } 

} 
+1

这里主要要注意的是,每当你改变或更新相同的刺新的内存块将被创建(创建一个新的参考)。 – 2015-06-14 18:30:15

相关问题