什么是Java中的strcpy?
什么是Java中的strcpy什么是Java中的strcpy?,java,Java,什么是Java中的strcpy String s1, s2; s1 = new String("hello"); s2 = s1; // This only copies s1 to s2. 本声明: s2 = s1; 将s1的值复制到s2中。该值只是一个引用,因此现在s1和s2引用相同的对象。因此,如果这是一种可变类型(例如,StringBuilder,或ArrayList),那么您就应该关注它 但是,String是不可变的。您无法修改对象以更改其文本数据,因此仅复制引用就足够了。更改s
String s1, s2;
s1 = new String("hello");
s2 = s1; // This only copies s1 to s2.
本声明:
s2 = s1;
将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
s2 = new String(s1);
如果确实要创建新的字符串
对象,可以使用已经(不必要地)用于s1
的构造函数:
String s1 = "hello";
String s2 = s1;
s1 = "Something else";
System.out.println(s2); // Prints hello
s2 = new String(s1);
但是,这很少是个好主意。否
s2
将引用新创建的字符串对象以及s1
字符串是不可变的,因此您永远不需要复制它。(罕见情况除外)
e、 g
基本上与
s1 = "hello";
s2 = "hello";
及
基本上与
s1 = "hello";
s2 = "hello";
你是对的s1和s2打印的字符串不是相同的字符串。。。
但是,当对对象执行此操作时,在一个对象中所做的更改会影响另一个对象…需要对对象进行克隆..字符串构造函数没有问题,因为java中的字符串对象是不可变的
String st="hello";
String st1=new String(st);
st1的输出将是hello@sp00m:不,这是不真实的。它复制了一个引用。在这方面,字符串并没有什么神奇之处——只是它是不可变的。您也可以编写自己的不可变类。(如果你的评论是一个答案,我会投反对票——这是不正确和误导的。)我的意思是s2=s1只复制引用。我编辑过。我想知道:有没有人遇到过一个真实的例子,在这个例子中,真的需要一份原件?@amit:不是因为不可变的字符串,而是因为复制可变的字符串有明显的正当理由StringBuffer@amit:是的。当从字典文件中读取大量非常短的行时,标准库用于分配一个具有至少80个字符的支持数组的字符串。执行
line=newstring(line)
和不执行之间的内存使用差异是巨大的。我相信现在情况好多了。@LieRyan:我刚才说的是一个不可变的字符串
。。。我相信复制StringBuffer
或StringBuilder
的原因是显而易见的@琼斯凯:有趣!谢谢分享。@amit——有些情况下,指针比较正在进行,出于某种原因,对于相同的文本字符串值,需要有两个单独的指针/地址。但这是非常罕见的,对于任何其他对象来说都没有什么不同,无论是不变的还是不可变的。s1的第二个赋值是为引用(指针)设置一个新值,而不是修改对象。修改对象类似于s1.someField=xyz
.ya表示正确的字符串…对于类似此对象的条件0=new Object();对象o2=o;需要克隆。这就是我所说的。只有在将来可能修改对象时才需要“克隆”,并且您不希望从副本中“看到”该修改。不可变对象并没有什么“魔力”——它们只是缺少任何修改它们的方法。与不可变性无关。这仅仅是一个问题,您是获得单独的对象还是对同一对象的重复引用。不变性仅仅意味着,如果只是复制引用,就可以保证以后的操作不会更改对象的值。