System.identityHashCode在String实例上相等

时间:2018-09-05 15:36:58

标签: java reflection cloning

由于某些原因,我试图复制/克隆对象实例。在String的情况下,我尝试了以下操作:

我确实有一个类似

的对象
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!");
}

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

1 个答案:

答案 0 :(得分:0)

我发现了:-)

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

public String toString() {
    return this;
}

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

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