【问题标题】:How to reference a Java object again after changing the original reference variable更改原始引用变量后如何再次引用Java对象
【发布时间】:2017-06-12 02:10:31
【问题描述】:

我认为这将是一个很好的练习,可以进一步了解对象。

我试图弄清楚如何在更改对象的原始引用变量后再次引用该对象。

取以下代码:

String person = "person a"; //Line 1
person = "person b";        //Line 2

现在,第 1 行创建了一个新的 String 对象,其引用变量为 person。第 2 行将该引用变量分配给另一个新的 String 对象。原来的 String 对象现在没有引用变量了。

如何返回并引用第 1 行内存中已存在的原始 String 对象?比如说,将引用变量person 分配回原来的 String 对象?作为随后的想法(不是我对垃圾收集了解太多),但是原始对象是否有资格进行垃圾收集,因为它在第 2 行之后不再具有引用变量,因此没有资格再次被引用?

我看到了hashCode() 方法,也看到了System.identityHashCode(),但不知道如何实现它们以便再次引用原始对象。

【问题讨论】:

  • 你不能。将先前的值存储在一个临时变量中并通过它访问它。
  • hashCode()(和System.identityHashCode())不用于检索特定对象;它的值不能被解释为内存地址。哈希码用于确定两个对象是否绝对相等。
  • @AndyTurner 所以如果两个对象有相同的hash code,我们不能说它们有相同的内存地址?
  • @Shashwat String a = "hello"; String b = new String("hello"); System.out.println(a == b); System.out.println(a.hashCode() == b.hashCode());.
  • 我想说hashCode 更多的是用于创建对象的整数表示。例如,它用于哈希表,其中哈希码的唯一性是一个加分项,使用内存地址可以提供良好的唯一性。

标签: java variables object memory reference


【解决方案1】:

第 3 行:person = "person a"; Java 有一个 String 内部缓存。现在,如果它不是String(或其他一些缓存类型),那么答案就是你没有。因为被引用的对象有资格进行垃圾回收(它不再有引用)。您可以像这样进行验证,

String person = "person a"; //Line 1
System.out.println(person.hashCode());
person = "person b";        //Line 2
person = "person a";        //Line 3
System.out.println(person.hashCode());

这将显示相​​同的 hashCode 两次;因为它是同一个实例。

【讨论】:

  • 因此,如果 String 等于先前创建的 String 对象,它将只使用原始对象,但对于大多数其他对象,一旦它们没有引用变量,您就无法再次使用它们不再(或者首先没有参考变量)?
  • 但是需要注意的是"Aa""BB"具有相同的hashcode;但它们是不同的对象。 (当然,"Aa"new String("Aa") 具有相同的哈希码,但它们也是不同的对象)。哈希码不能用于“定位”特定对象。
【解决方案2】:

分配新字符串后

person = "person b";

第一个消失了.. 您将无法使用它,因为您丢失了他的地址。

【讨论】:

    猜你喜欢
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2020-03-25
    • 2017-11-12
    • 2013-04-21
    • 2021-11-23
    相关资源
    最近更新 更多