简体   繁体   中英

Java: local Hashtable overwriting global Hashtable

While performing actions on a locally defined Hashtable, the global Hashtable of another class that was assigned to the local Hashtable also has these actions performed on it. I'm not sure if this is some simple problem that should be obvious, but I could not find any questions about it.

public void redraw(String[] sNewEntity,Hashtable<String,Entity> h){
    Hashtable<String,Entity> htEntities=h;

    htEntities.remove(sNewEntity[0]);
    //many lines of code that ensures that the removal doesn't invalidate anything
    if(validation==true){
        m_HomeFrame.graph=new mxGraph();
        m_HomeFrame.myGraphComponent = new mxGraphComponent(m_HomeFrame.graph);        
        m_HomeFrame.setScroll(m_HomeFrame.myGraphComponent);
        m_HomeFrame.m_Tree.h_entityTable=htEntities;
    }
}

This is the function. All variables with "m_"- are globals. This method takes a string array and hashtable and removes the item of the hashtable that has a key of the string array's first item. The problem is that the global hashtable (m_HomeFrame.m_Tree.h_entityTable) updates as soon as it hits (htEntities.remove(sNewEntity[0]);). Is there a way to disassociate htEntities from the global variable? Also, apologies for not using Generics. I saw that quite often when searching for hashtable stuff.

When you pass in h , you're not passing in the actual HashTable object. You're passing in a reference to the HashTable object. This means that when you make a change to h , you're making a change to the same Object.

The way to get around this is to use the new keyword. This will force the Java runtime to create a new HashTable object.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM