簡體   English   中英

我可以在對HashTable進行迭代時更改其內部結構嗎?

[英]Can I change the inner structure of objects in a HashTable while iterating over it?

喜歡,標題說。 我可以在遍歷HashTable的鍵時更改其內部結構嗎? 我知道我無法更改地圖本身,或者至少這樣做是有風險的,但是盡管進行了Google搜索,但我還沒有找到任何明確或簡單的答案來確定是否可以更改對象本身的屬性在哈希圖中。 我的直覺說不,因為這可能會更改哈希,但是一定要知道。 我也有興趣在遍歷鍵時替換鍵的值。 這可能嗎?

抱歉,如果以前已經回答了很多次。

簡而言之,這兩種方法會按預期工作嗎?

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());
   }
}

在任何情況下,不僅在迭代容器時,都不允許對基於哈希的容器的鍵進行突變。 這樣做的原因是,當哈希鍵位於與鍵的哈希值不對應的哈希桶中時,任何更改哈希函數值的突變都會使您的容器處於無效狀態。

這就是強烈建議僅在基於哈希的容器中使用不可變類作為鍵的原因。

我也有興趣在遍歷鍵時替換鍵的值。 這可能嗎?

不,這是不可能的。 為了用另一個密鑰替換容器中的密鑰,您需要先刪除該項目,然后再用新密鑰將其重新插入。 但是,這將觸發並發修改異常。

如果需要替換大量的密鑰,最好的方法是制作一個新的哈希容器,並在迭代原始容器時為其填充密鑰-值對。

如果只需要替換少量鍵,則列出描述更改的對象(舊鍵,新鍵,值),並在迭代原始容器時填充該列表,然后遍歷更改列表以進行更改對原始容器的更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM