什么是Java中的strcpy?什么是Java中的strcpy?
String s1, s2;
s1 = new String("hello");
s2 = s1; // This only copies s1 to s2.
什么是Java中的strcpy?什么是Java中的strcpy?
String s1, s2;
s1 = new String("hello");
s2 = s1; // This only copies s1 to s2.
本声明:中s1
s2 = s1;
值复制到s2
。该值只是一个参考,所以现在s1
和s2
指的是同一个对象。所以,如果这是一个可变类型(例如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);
然而,这很少一个好主意。
我想知道:有没有人遇到真正需要原始副本的真实生活实例? – amit
@amit:不适用于不可变的字符串,但因为复制可变的StringBuffer有显而易见的理由 –
@amit:是的,我做过。当从字典文件中读取很多*非常短的*行时,标准库*使用*来分配一个至少有80个字符的支持数组的字符串。在执行'line = new String(line)'之间的内存使用情况差异很大。我相信事情现在好转了。 –
没有s2
将引用新创建的字符串对象与s1
一起。
字符串是不可改变的,所以你永远不会需要复制它。 (除了在罕见的情况下)
例如
s1 = new String("hello");
是基本相同
s1 = "hello";
和
s2 = s1;
基本上是一样的
s2 = "hello";
谢谢你的简单例子。 – user1301568
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打印字符串不是相同的字符串... 但同时这样做的对象对一个对象作出的更改会影响另一个......需要克隆对象..有没有问题的字符串
对于任何其他的对象来说,这是不会有任何不同的,不可变的或不可变的。对s1的第二个赋值是为引用(指针)设置一个新值,而不是修改该对象。修改对象就像's1.someField = xyz;'。 –
雅的字符串是正确的...条件像这样Object 0 = new Object();对象o2 = o;需要克隆...这就是我所说的 – Aravind
只有当对象将来可能被修改时才需要“克隆”,并且您不希望从副本中“看到”该修改。没有什么关于不可变对象的“魔法” - 他们根本没有任何修改它们的方法。 –
String构造做这项工作很容易,因为在Java中,字符串对象是不可改变的
String st="hello";
String st1=new String(st);
输出将ST1的是你好
与不变性无关。这只是一个问题,你是否得到单独的对象或对同一对象的重复引用。不变性仅仅意味着,如果您只是复制引用,那么您保证以后的操作不会更改对象的值。 –
@ sp00m:不,那是不真实的。它复制一个参考。在这方面没有什么关于String的神奇功能 - 只是它是不可变的。你也可以编写你自己的不可变类。 (如果您的评论是一个答案,我会downvoted它 - 这是不正确的,误导性的。) –
@JonSkeet好了,知道了。 – sp00m
我的意思是s2 = s1只复制参考。我编辑过。 – user1301568