我可以在迭代 HashTable 时更改 objects 的内部结构吗?
Can I change the inner structure of objects in a HashTable while iterating over it?
喜欢,标题说的。我可以在迭代其键时更改 HashTable 中 objects 的内部结构吗?我知道我不能更改 Map 本身,或者至少这样做是有风险的,但是尽管 google 搜索我还没有找到关于是否可以更改属性的任何明确或简单的答案objects 本身在 hashmap 中。我的直觉说不,因为这可能会改变散列,但最好能确定。我也有兴趣在迭代时替换键的值。这可能吗?
如果这个问题之前已经回答了很多次,我们深表歉意。
简而言之,这两种方法是否会按预期工作?
public class Manager {
private Hashtable<MyClassA, BufferedImage> ht1;
private Hashtable<MyClassB, JSlider> ht2;
private Image method1() {
for(MyClassB mcb: ht2.keySet()){
mcb.calculateStuff(ht2.get(mcb).getValue());
//CalculateStuff() doesnt change anything, but if it takes long, the JSliders might be
//changed by the user or a timer, resulting in a new hashCode(), and potentially problems.
}
}
private void method2(){
for(MyClassA mca: ht1.keySet()){
mca.changeInnerStructureOfA(); //Changes the fields of the object mca.
ht1.put(mca.calculateNewImage());
}
}
在任何情况下都不允许改变基于散列的容器的键,不仅是在迭代容器时。这样做的原因是,当散列键位于与键的散列值不对应的散列桶中时,任何更改散列函数值的突变都会使您的容器处于无效状态。
这就是强烈建议仅使用不可变 类 作为基于哈希的容器中的键的原因。
I am also interested in replacing the value for the keys while iterating over them. Is this possible?
不,这是不可能的。为了用另一个钥匙替换容器中的钥匙,您需要先移除该物品,然后用新钥匙将其重新插入。但是,这会触发并发修改异常。
如果您需要替换大量键,最好的方法是创建一个新的哈希容器,并在迭代原始容器时用键-值对填充它。
如果您只需要替换少量键,请制作一个描述更改的对象列表(旧键、新键、值),在迭代时填充列表,然后填充原始容器,然后遍历列表对原始容器进行更改的更改。
喜欢,标题说的。我可以在迭代其键时更改 HashTable 中 objects 的内部结构吗?我知道我不能更改 Map 本身,或者至少这样做是有风险的,但是尽管 google 搜索我还没有找到关于是否可以更改属性的任何明确或简单的答案objects 本身在 hashmap 中。我的直觉说不,因为这可能会改变散列,但最好能确定。我也有兴趣在迭代时替换键的值。这可能吗?
如果这个问题之前已经回答了很多次,我们深表歉意。
简而言之,这两种方法是否会按预期工作?
public class Manager {
private Hashtable<MyClassA, BufferedImage> ht1;
private Hashtable<MyClassB, JSlider> ht2;
private Image method1() {
for(MyClassB mcb: ht2.keySet()){
mcb.calculateStuff(ht2.get(mcb).getValue());
//CalculateStuff() doesnt change anything, but if it takes long, the JSliders might be
//changed by the user or a timer, resulting in a new hashCode(), and potentially problems.
}
}
private void method2(){
for(MyClassA mca: ht1.keySet()){
mca.changeInnerStructureOfA(); //Changes the fields of the object mca.
ht1.put(mca.calculateNewImage());
}
}
在任何情况下都不允许改变基于散列的容器的键,不仅是在迭代容器时。这样做的原因是,当散列键位于与键的散列值不对应的散列桶中时,任何更改散列函数值的突变都会使您的容器处于无效状态。
这就是强烈建议仅使用不可变 类 作为基于哈希的容器中的键的原因。
I am also interested in replacing the value for the keys while iterating over them. Is this possible?
不,这是不可能的。为了用另一个钥匙替换容器中的钥匙,您需要先移除该物品,然后用新钥匙将其重新插入。但是,这会触发并发修改异常。
如果您需要替换大量键,最好的方法是创建一个新的哈希容器,并在迭代原始容器时用键-值对填充它。
如果您只需要替换少量键,请制作一个描述更改的对象列表(旧键、新键、值),在迭代时填充列表,然后填充原始容器,然后遍历列表对原始容器进行更改的更改。