Alt*_*ber 1 java map pass-by-reference pass-by-value stanford-nlp
我遇到了JAVA地图的问题.我在地图中输入一个对象作为键.然后我修改了键,地图不再将对象视为地图的键.即使对象内部的键已相应修改.
我正在使用CoreLabelStanfordNLP 的对象,但它适用于我猜的一般情况.
Map <CoreLabel, String> myMap = new HashMap...
CoreLabel key = someCreatedCoreLabel
myMap.put(key, someString)
myMap.get(key) != null ----> TRUE
key.setValue("someValue");
myMap.get(key) != null ----> FALSE
Run Code Online (Sandbox Code Playgroud)
我希望我很清楚.问题是为什么最后一个陈述是假的?我不是一个非常有经验的程序员,但我希望它是真的.也许与CoreLabel物体有关?
我检查是否.equals()仍然存在,它确实存在
for(CoreLabel token: myMap.keySet()) {
if(key.equals(token))
System.out.println("OK");
}
Run Code Online (Sandbox Code Playgroud)
这在MapJavadoc中明确记录为危险且不太可行:
注意:如果将可变对象用作映射键,则必须非常小心.如果在对象是地图中的键的情况下以影响等于比较的方式更改对象的值,则不指定映射的行为.这种禁令的一个特例是地图不允许将自己作为关键词包含在内.虽然允许映射将自身包含为值,但建议极其谨慎:equals和hashCode方法不再在这样的映射上很好地定义.
| 归档时间: |
|
| 查看次数: |
487 次 |
| 最近记录: |