次のような複雑な HashMap に xml ファイルを解析しています。
Map<String, Map<String, EcmObject>
Ecmオブジェクト:
public class EcmObject implements Comparable, Serializable {
private final EcmObjectType type;
private final String name;
private final List<EcmField> fields;
private final boolean pages;
// getter, equals, hashCode
}
EcmObjectType:
public enum EcmObjectType implements Serializable {
FOLDER, REGISTER, DOCUMENT
}
Ecmフィールド
public class EcmField implements Comparable, Serializable {
private final EcmFieldDataType dataType;
private final EcmFieldControlType controlType;
private final String name;
private final String dbname;
private final String internalname;
private final Integer length;
// getter, equals, hashCode
}
EcmFieldDataType
public enum EcmFieldDataType implements Serializable {
TEXT, DATE, NUMBER, GROUP, DEC;
}
および EcmFieldControlType
public enum EcmFieldControlType implements Serializable{
DEFAULT, CHECKBOX, LIST, DBLIST, TEXTAREA, HIERARCHY, TREE, GRID, RADIO, PAGECONTROL, STATIC;
}
すべての hashCode および equal メソッドを、commons lang の EqualsBuilder および HashCodeBuilder を使用して上書きしました。この方法で A HashMap をコピーすると、次のようになります。
Map<String, Map<String, EcmObject>> m = EcmUtil.convertXmlObjectDefsToEcmEntries(new File("e:\\objdef.xml"));
Map<String, Map<String, EcmObject>> m2;
System.out.println(m.hashCode());
ByteArrayOutputStream baos = new ByteArrayOutputStream(8 * 4096);
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(m);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
m2 = (Map<String, Map<String, EcmObject>>) ois.readObject();
System.out.println(m.hashCode());
System.out.println(m2.hashCode());
m.hashCode() が m2.hashCode() と等しくない
ここに私の出力があります:
-1639352210
-2071553208
1679930154
もう1つの奇妙なことは、たとえば。10 回 m は同じハッシュコードを持ち、11 回目に突然ハッシュコードが異なります...
これが何であるかについてのアイデアはありますか?