修改 String/Integer 对象并检查它是不是影响以该对象为参数的类对象

Posted

技术标签:

【中文标题】修改 String/Integer 对象并检查它是不是影响以该对象为参数的类对象【英文标题】:Modifying String/Integer object and check if it affects a class object which has the object as its parameter修改 String/Integer 对象并检查它是否影响以该对象为参数的类对象 【发布时间】:2013-12-25 11:40:02 【问题描述】:
public static void main(String[] args)

    String name = "john";
    StringTest obj = new StringTest(name);
    name = "peter";
    System.out.println(obj.name);

class StringTest
String name;
StringTest(String name)

    this.name = name;

现在,由于字符串名称已从“john”重新分配为“peter”,我希望它会打印 peter,但它会打印 john。字符串是否不可变会导致在重新分配时创建一个新对象,或者对此的正确解释是什么?

此外,当我使用 Integer 对象尝试此操作时,行为是相同的!请任何人解释这种行为的原因

【问题讨论】:

【参考方案1】:

Java 使用 pass-by-value,这意味着您传递 name 的值,而不是引用。 在您创建 StringTest 实例之后更改 name 的值不会以任何方式影响您的 StringTest

【讨论】:

是的,所以对字符串名称的引用的副本将传递给方法..所以一旦我更改字符串名称,它应该会反映在具有引用的对象中,对吧! 不,当您编写name = "peter"; 时,您会创建一个新的String 并将name 指向该String。这不会影响StringTest 实例中的类变量name,它仍将指向"john" 好的,知道了..tq。我只是认为会传递参考而不是实际的字符串 @sarish 引用被传递了,但是当你分配一个新的字符串时,变量会包含一个对那个字符串的new引用,旧的引用不受影响。跨度> 【参考方案2】:

我认为这里让你失望的是你不必使用“new”关键字来创建字符串。代码读起来更像是创建一个原始类型,如 int 或 long,而不是创建对象。这就是实际发生的事情。 创建两个字符串的等效方法是

String name = new String(new char[] 'j','o','h','n');
StringTest obj = new StringTest(name);
name = new String(new char[] 'p','e','t','e','r');

这样写我认为更清楚为什么你没有对 StringTest 中引用的字符串产生副作用。这与字符串确实不可变这一事实无关。

【讨论】:

以上是关于修改 String/Integer 对象并检查它是不是影响以该对象为参数的类对象的主要内容,如果未能解决你的问题,请参考以下文章

Laravel firstOrNew 如何检查它是第一个还是新的?

修改HashMaps的HashMap中的元素

复选标记检查行但不检查对象

获取map集合中的键和值

string integer == equals 转

使用 Java 8 Stream API 合并两个 Map<String, Integer>