Rep*_*ien 4 java serialization hashmap
我目前正在创建一个自定义序列化程序作为项目的一部分,在这里我也需要序列化引用,这意味着如果两个字段在序列化之前引用同一个项目,它们也应该在反序列化之后.
为此,我使用HashMap,将每个对象映射到一个ID,我可以将其用作序列化的每个对象的属性,同时跟踪已经序列化的对象.我偶然发现了一些问题.
似乎java HashMap只检查键上的相等性,而不是它们是否是相同的引用.例如,在下面,变量b结束为true:
HashMap<Object, Integer> map = new HashMap<Object, Integer>();
LinkedList<Object> ll1 = new LinkedList<Object>();
LinkedList<Object> ll2 = new LinkedList<Object>();
map.put(ll1, 5);
boolean b = map.containsKey(ll2);
Run Code Online (Sandbox Code Playgroud)
有时候结果根本没有意义.这里,b也是如此:
HashMap<Object, Integer> map = new HashMap<Object, Integer>();
LinkedList<Object> ll1 = new LinkedList<Object>();
Stack<Object> stack = new Stack<Object>();
map.put(ll1, 5);
boolean b = map.containsKey(stack);
Run Code Online (Sandbox Code Playgroud)
我想要的是ContainsKey方法,不仅要调用equals方法,还要使用'==' - 运算符检查引用是否相同.我可以这样做而无需查看整个密钥集吗?
提前致谢
Map接口的一般契约是,如果它们都为null,或者它们不为null,则认为两个键是相等的a.equals(b).它不==用于比较,除非关键类的equals方法实现这样做.
你LinkedList和Stack对象相同的原因是因为它们都实现了List接口,并且定义List.equals是两个列表相等,如果它们具有相同的大小,并且包含相同顺序的相同对象.因为它们都是空的,所以它们是"平等的".
我相信你在找IdentityHashMap.它故意违反Map接口的合同只能使用==,而不是Object.equals()比较对象.同样,对于它使用的哈希码System.identityHashCode而不是任何被覆盖的哈希码Object.hashCode().
| 归档时间: |
|
| 查看次数: |
500 次 |
| 最近记录: |