gpt4 book ai didi

java - java中的浅克隆: String and Object showing different behaviours

转载 作者:行者123 更新时间:2023-12-02 05:38:31 25 4
gpt4 key购买 nike

问题基于以下代码:

class Car implements Cloneable
{
//Relevant constructor
String name;
int wheels;
Car another;

public Object clone()
{
/*DEEP
Car n = new Car(this.name,this.wheels);
n.another = new Car(this.another.name,this.another.wheels);
return n;
*/

return super.clone() ;
}
}

main(String[] args)
{
Car c1 = new Car("merc",4);
c1.another = new Car("baby merc",55);
Car c2;
c2 = (Car)c1.clone();

//PART 1
//HERE I TRY TO CHANGE object c2's another's name to "Han"
System.out.println(c1.another.hashCode() == c2.another.hashCode());
/*POINT 1*/ c2.another.name = "Han";
System.out.println(c1.another.hashCode() == c2.another.hashCode());

//PART 2
String s = new String("gG");
System.out.println(s.hashCode());
s ="JAJA";
System.out.println(s.hashCode());
}
  • 在第 1 部分中,我更改了对象 c1 的成员 another 的成员名称变得不同。
  • 在第 2 部分中,我创建一个字符串,检查其哈希码,然后更改其值,然后再次检查其哈希码。

输出:

true
true
3264
2269358
  1. 我不明白当我更改c2.another.namec1.another.name 还指向前一个字符串“baby Merc”所占用的完全相同的旧位置。 POINT1 处的操作是否会导致返回新的引用位置,从而导致 c2.another 指向新位置,而 c1.another > 指向旧的?
  2. 为什么当我让一个字符串指向一个新的字符串时却没有发生同样的情况字符串?堆中分配了一个新区域并引用变量保存新位置的引用。如果是 c1c2即使修改后引用位置也不会改变!为什么?

最佳答案

c2 = (汽车)c1.clone();//c1.another == c2.another (是的,引用是相等的,所以我使用 ==)

我不明白,当我更改 c2.another.name 时,c1.another.name 也会指向前一个字符串“baby Merc”所占用的同一旧位置。 POINT1 处的操作不应该导致返回一个新的引用位置,从而导致 c2.another 指向新位置,而 c1.another 指向旧位置吗?

c1 和 c2 共享相同的另一个对象/引用。他们关心其中的变化。第二行返回 true 因为您正在更改 another 内的某些内容,假设您有一盒硬币并且有 2 个人拿着它。如果您从中取出 2 个硬币,那么对于持有它的两个人来说,剩余的硬币将是相同的。

为什么当我让一个字符串指向一个新字符串时不会发生同样的情况?堆中分配了一个新区域,引用变量保存新位置的引用。对于 c1 和 c2,即使修改后引用位置也不会改变!为什么?

您正在创建 2 个不同的对象,并对其进行相同的引用(一个接一个),因此您有 2 个不同的哈希码。这与克隆无关。

关于java - java中的浅克隆: String and Object showing different behaviours,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24742707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com