什么是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

什么是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
是不可变的。您无法修改对象以更改其文本数据,因此仅复制引用就足够了。更改
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;需要克隆。这就是我所说的。只有在将来可能修改对象时才需要“克隆”,并且您不希望从副本中“看到”该修改。不可变对象并没有什么“魔力”——它们只是缺少任何修改它们的方法。与不可变性无关。这仅仅是一个问题,您是获得单独的对象还是对同一对象的重复引用。不变性仅仅意味着,如果只是复制引用,就可以保证以后的操作不会更改对象的值。