System.identityHashCode 在 String 实例上相等

System.identityHashCode is equal on String instances

由于某些原因,我正在尝试 copy/clone 个对象实例。在字符串的情况下,我尝试了这样的事情:

我确实有一个像

这样的对象
class Foo{
    private String test;
    //Getters && Setters are generated
}

和像这样的复制方法:

private static Object copyMemberData(Object originalMemberData) {
    if (originalMemberData == null) {
        return null;
    }

    ...
    if (originalMemberData instanceof String) {
        return String.valueOf(originalMemberData);
    } 
    ...
}

一样使用
PropertyDescriptor propDesc = new PropertyDescriptor("test", Foo.class);
//Get Data from original object
final Object originalMemberData = propDesc.getReadMethod().invoke(originalFoo);
final Object copiedMemberData = copyMemberData(originalMemberData);

然后我尝试将结果与 System.identityHashCode 进行比较,以确保我没有在参考。

if (System.identityHashCode(copiedMemberData) == System.identityHashCode(originalMemberData)) {
     throw new RuntimeException("Cloning is buggy!");
}

我很惊讶这实际上匹配并抛出一个错误。也许有人可以向我解释原因。

我发现了:-)

即使我将它与 == 而不是等于进行比较,该字符串也是相同的。之所以如此,是因为 String.java class 的 toString() 方法在 String.valueOf(Object obj) 中的实现方式如下:

public String toString() {
    return this;
}

要成功复制字符串,请使用:

return new String(((String)originalMemberData).toCharArray());