Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在更改原始引用变量后再次引用Java对象_Java_Variables_Object_Memory_Reference - Fatal编程技术网

如何在更改原始引用变量后再次引用Java对象

如何在更改原始引用变量后再次引用Java对象,java,variables,object,memory,reference,Java,Variables,Object,Memory,Reference,我认为这将是一个很好的练习,有助于进一步了解对象 我试图弄清楚在更改对象的原始引用变量后如何再次引用对象 以下面的代码为例: String person = "person a"; //Line 1 person = "person b"; //Line 2 现在,第1行创建了一个新的字符串对象,其引用变量为person。第2行将该引用变量分配给另一个新字符串对象。原始字符串对象现在没有引用变量 我如何返回并引用第1行内存中已经存在的原始字符串对象?比方说,将引用变量person

我认为这将是一个很好的练习,有助于进一步了解对象

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

以下面的代码为例:

String person = "person a"; //Line 1
person = "person b";        //Line 2
现在,第1行创建了一个新的字符串对象,其引用变量为
person
。第2行将该引用变量分配给另一个新字符串对象。原始字符串对象现在没有引用变量

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

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

第3行:
person=“person a”
Java有一个
String
intern缓存。现在,如果它不是一个
字符串
(或其他一些缓存类型),那么答案是您没有。因为referecned对象符合垃圾收集的条件(它不再有引用)。你可以这样验证它

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());

它将显示相同的哈希代码两次;因为它是同一个实例。

在分配新字符串之后

person = "person b";
第一个消失了。。
您将无法使用它,因为您丢失了他的地址。

您不能。将以前的值存储在临时变量中,并通过该变量访问它。
hashCode()
(和
System.identityHashCode()
)不用于检索特定对象;它的值不能解释为内存地址。哈希代码用于确定两个对象是否绝对不相等。@因此,如果两个对象具有相同的
哈希代码
,我们不能说它们具有相同的内存地址?@Shashwat
String a=“hello”;字符串b=新字符串(“你好”);System.out.println(a==b);System.out.println(a.hashCode()==b.hashCode())。我想说,
hashCode
更适合于创建对象的整数表示。例如,用于哈希表,其中哈希代码的唯一性是一个加号,使用内存地址可以提供良好的唯一性级别。因此,如果字符串等于先前创建的字符串对象,它将只使用原始对象,但是,对于大多数其他对象,一旦它们不再有引用变量(或者一开始就没有引用变量),您就无法再次使用它们了。但需要注意的是,
“Aa”
“BB”
具有相同的hashcode;但它们是不同的对象。(当然,
“Aa”
新字符串(“Aa”)
具有相同的hashcode,但它们也是不同的对象)。哈希代码不能用于“定位”特定对象。