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());
由于某些原因,我正在尝试 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());