Java - 静态变量的副本也是静态的吗?

标签 java static hashmap

我有一个静态 HashMap A。我正在复制它 B,用于计算。当我从 B 中删除元素并打印 A 时,这些元素也从 A 中消失了。这是预期的吗?

    Static Map<String, ArrayList<String>> A;

    private void calculate(String id) {

    Map<String, ArrayList<String>> B= A;
    String maxKey = getMaxKey(B);

    int neighbour_matrix_length = B.size();

    for(int i=0 ; i< neighbour_matrix_length; i++){ 

    // remove all the visited nodes 
    ArrayList<String> visited = copy_neighbours_reachability_map.get(maxKey);

    for(int j = 0; j< visited.size() ; j++)
    {
    String temp = visited.get(i);
    Iterator<Entry<String, ArrayList<String>>> iter = B.entrySet().iterator();
    // iterate through the hashmap to remove elements
    while (iter.hasNext()) {
        Entry<String, ArrayList<String>> entry = iter.next();
        if(entry.getValue().contains(temp)){
        entry.getValue().remove(temp);
        }
    }
    }
    }
   // Elements from A are also getting deleted..
   System.out.println("neighbours_reachability_map is ");
   for (String key : A.keySet())
   {
    System.out.println( "Key : " + key + " - " + A.get(key).toString());
   }
   }

我错过了什么吗?我不想删除 A 中的元素。

最佳答案

您所做的只是共享对同一对象的引用,因此更改一个对象将更改另一个对象。这样做:

Map<String, ArrayList<String>> B = new HashMap<>(A);

将复制 map ,但是... map 中的值是列表,并且两个 map 都将保留对相同列表的引用(即使新 map 和旧 map 是不同的对象)。所以你还需要复制列表:

Map<String, ArrayList<String>> B = new HashMap<>();

for (Map.Entry<String, ArrayList<String>> e : A.entrySet()) {
    B.put(e.getKey(), new ArrayList<String>(e.getValue()));
}

我们在这里所做的是创建对象的深拷贝,因此没有任何引用是共享的。

关于Java - 静态变量的副本也是静态的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34123176/

相关文章:

java - 尝试用随机值填充 boolean 矩阵

java - 找到句子中元音最多的单词(可以是几个彼此等价且位于相邻位置的最大单词)

java - 我们需要链表中的前一个元素吗?

java - 如何对 Android 应用程序的 HashMap 中的数据进行排序?

java - 无法将 keyListener 添加到按钮

java - OpenGL绘制三角形不显示+ glClearColor不设置屏幕颜色

java - 为什么我的代码绕过了 else if 语句?

c++ - 迭代 C++ 中的对列表?

c++ - 在cpp文件中初始化一个私有(private)静态成员变量。错误 : member is private

java - c :forEach doesn't print map contents in JSP