2012-08-29 120 views
7

什么是Java中的strcpy?什么是Java中的strcpy?

String s1, s2; 

s1 = new String("hello"); 
s2 = s1; // This only copies s1 to s2. 
+3

@ sp00m:不,那是不真实的。它复制一个参考。在这方面没有什么关于String的神奇功能 - 只是它是不可变的。你也可以编写你自己的不可变类。 (如果您的评论是一个答案,我会downvoted它 - 这是不正确的,误导性的。) –

+0

@JonSkeet好了,知道了。 – sp00m

+0

我的意思是s2 = s1只复制参考。我编辑过。 – user1301568

回答

13

本声明:中s1

s2 = s1; 

值复制到s2。该值只是一个参考,所以现在s1s2指的是同一个对象。所以,如果这是一个可变类型(例如StringBuilder,或ArrayList),那么你是对的去关注。

然而,String是不可改变的。您不能修改对象来更改其文本数据,因此只需复制引用就足够了。改变s2值是指不同的字符串(或使其成为null参考)将变化s1值:

String s1 = "hello"; 
String s2 = s1; 
s1 = "Something else"; 
System.out.println(s2); // Prints hello 

如果你真的要创建一个新的String对象,可以利用你已经构造(不必要的)使用s1

s2 = new String(s1); 

然而,这很少一个好主意。

+0

我想知道:有没有人遇到真正需要原始副本的真实生活实例? – amit

+0

@amit:不适用于不可变的字符串,但因为复制可变的StringBuffer有显而易见的理由 –

+3

@amit:是的,我做过。当从字典文件中读取很多*非常短的*行时,标准库*使用*来分配一个至少有80个字符的支持数组的字符串。在执行'line = new String(line)'之间的内存使用情况差异很大。我相信事情现在好转了。 –

0

没有s2将引用新创建的字符串对象与s1一起。

4

字符串是不可改变的,所以你永远不会需要复制它。 (除了在罕见的情况下)

例如

s1 = new String("hello"); 

是基本相同

s1 = "hello"; 

s2 = s1; 

基本上是一样的

s2 = "hello"; 
+1

谢谢你的简单例子。 – user1301568

0
   String s1, s2; 

    s1 = new String("hello"); 
    s2 = s1; // This only copies s1 to s2. Am I right? 

    s1="adsfsdaf"; 
    System.out.println(s2); 
    System.out.println(s1); 

你是正确的s1和s2打印字符串不是相同的字符串... 但同时这样做的对象对一个对象作出的更改会影响另一个......需要克隆对象..有没有问题的字符串

+0

对于任何其他的对象来说,这是不会有任何不同的,不可变的或不可变的。对s1的第二个赋值是为引用(指针)设置一个新值,而不是修改该对象。修改对象就像's1.someField = xyz;'。 –

+0

雅的字符串是正确的...条件像这样Object 0 = new Object();对象o2 = o;需要克隆...这就是我所说的 – Aravind

+0

只有当对象将来可能被修改时才需要“克隆”,并且您不希望从副本中“看到”该修改。没有什么关于不可变对象的“魔法” - 他们根本没有任何修改它们的方法。 –

0

String构造做这项工作很容易,因为在Java中,字符串对象是不可改变的

String st="hello"; 
String st1=new String(st); 

输出将ST1的是你好

+1

与不变性无关。这只是一个问题,你是否得到单独的对象或对同一对象的重复引用。不变性仅仅意味着,如果您只是复制引用,那么您保证以后的操作不会更改对象的值。 –