当前位置: 首页 > 知识库问答 >
问题:

比较Java中相互引用的对象

佘茂才
2023-03-14
int i = 0;
int j = i;
System.out.println("initial int: " + j); // 0

Integer ii = new Integer(0);
Integer jj = ii;
System.out.println("initial Integer: " + jj); // 0

String k = new String("s");
String l = k;
System.out.println("initial String: " + l); // "s"

Person person1 = new Person("Furlando"); // from constructor -> publ. instance var. 'name'
Person person2 = person1;
System.out.println("initial Person: " + person2.name); // "Furlando"

/*--------------------*/
System.out.println();
/*--------------------*/

i += 1;
System.out.print("added 1 to int: [" + i);
System.out.println("], and primitive which also \"refers\" to that (has a copy, actually), has a value of: [" + j + "]");

ii += 1;
System.out.print("added 1 to Integer object: [" + ii);
System.out.println("], and object which also refers to that, has a value of: [" + jj + "]");

k += "tring";
System.out.print("added \"s\" to String object: [" + k);
System.out.println("], and object which also refers to that, has a value of: [" + l + "]");

person1.name = "Kitty";
System.out.print("changed instance variable in Person object to: [" + person1.name);
System.out.println("], and object which also refers to that, has a value of: [" + person2.name + "]");

/* [COMPILER OUTPUT]
    initial int: 0
    initial Integer: 0
    initial String: s
    initial Person: Furlando

    A) added 1 to int: [1], and primitive which also "refers" to that (has a copy, actually), has a value of: [0]
    B) added 1 to Integer object: [1], and object which also refers to that, has a value of: [0]
    C) added "s" to String object: [string], and object which also refers to that, has a value of: [s]
    D) changed instance variable in Person object to: [Kitty], and object which also refers to that, has a value of: [Kitty]
*/

我理解A,我们在那里有一个原语;没有引用。by-复制。
我希望B和C的行为与D相同——根据它们被给予的引用而改变。

为什么这个对象引用另一个对象只对用户定义的对象“起作用”,而不是整数、字符串等。?



共有3个答案

钮勇
2023-03-14
匿名用户

这与操作员的工作有关。

您真正在做的是在调用=时重新分配值

Integer i = 1;
Integer j = i;
i = i + 1;

因此,现在i指向另一个等于2的整数,j仍然指向原来的整数。

您的字符串示例也是如此。

对象的情况下,不更改指针,而是更改对象的内部状态。因此,person1和person2都指向同一个人。

如果你做到了

Person person1 = new Person("Alice");
Person person2 = person1;
person1 = new Person("Bob");

那么很明显,person1现在是一个不同的人了。

宗政博
2023-03-14

这种行为与用户定义的对象与内部对象无关,但事实上,“Integer”和“String”(以及所有其他基本包装器)对象的处理非常特殊。整数只是一个围绕原始整数的“包装器”,因此它的行为不是真正的“引用类型”。所有这些包装器对象都实现为不可变的-对整数的相同引用永远不会有其他值。

另一方面,如果需要,这些包装器对象会自动转换为基本类型,因此它们的一般使用速度较慢。它们的好处是,它们可以为null,这有时很好。

曹昊焱
2023-03-14

在Java中,String和Integer对象是不可变的。当您这样做时:ii=1或创建新对象。变量jj和l指向旧对象。这就是为什么你会看到不同的价值观。

 类似资料:
  • 我有一个如下所示的Powershell数组: 我需要找到TSMserver和集群的所有VM都具有相同的值。 我需要一个命令来检索(例如)这两个VM,因为它们共享相同的第一个值。 所以实际上我需要将数组中的每个对象与其他对象进行比较,以找到前两个属性的公共值。 提前非常感谢!

  • 问题内容: 我有上述2个类(POJO),它们都是绝对相同的(除了课程名称),我将它们添加到两个数组列表:aListA和aListB。我需要比较两个对象是否相同。如果它们相同,则需要将它们添加到另一个列表(commonList)中,如果它们恰好是不同的,则需要将它们添加到另一个列表(differentList)中。我写了以下代码: 我的问题是,即使两个不同POJO中的数据(变量,firstId和se

  • 我目前正在尝试制作一个赛车模拟器,以便学习一些Java。我制作了每个车手和他们的车的对象: 每个车手都有许多价值观,这些价值观决定了他在比赛中的表现: 然后,当我进入比赛状态并尝试模拟第一场比赛时,我得到了车手总体的变量(值为50-100),并在总体上添加了一个“运气”因素以获得结果。 控制台输出示例: 我不知道如何在不排序的情况下对“CreateDrivers.drivers[x]”的所有值进行

  • 我已经被覆盖了hashcode和equals以查找具有相同开始日期和关闭日期的值。我得到了重复对象的类似哈希代码。当等同于这些对象时,我得到了布尔值“假”。在我的理解中,对象==对象比较对象的引用,即使引用是相同的;代码返回假。你能帮我理解是什么问题吗?我在下面发布了我的代码: Main.java 输出: 检查客户对象引用:Customer@643 对象引用(位于Map中):[Customer@6

  • 我想从有更多经验的人那里得到一些建议,他们在Java中使用原始的双相等。由于可能的舍入错误,对两个双和使用是不够的。 我的问题是: > 使用相对误差计算某个增量值,是否有一个通用(而不是特定于应用程序)的增量值值得推荐?请参阅下面的示例。 下面是一个通用函数,用于检查考虑相对错误的相等性。您建议的值是多少,以捕获简单操作 ,-,/,* 操作中的大部分舍入错误?

  • 问题内容: 有没有人在编写比较两个REST服务的测试方面有任何技巧?我们这样做是作为回归测试的一种形式。 我希望按照以下方式做一些事情: 向两个服务发送“ / 1”的GET并比较结果 向这两个服务发送POST,然后比较结果 向两个服务发送一个PUT,并比较结果 这个想法是: 每个操作都发送到两个服务 结果应该相同 REST服务是用Java / Jersey编写的,因此使用它是理想的,但是人们发现有