【问题标题】:Understanding Java References in Java collections了解 Java 集合中的 Java 引用
【发布时间】:2012-06-06 22:11:07
【问题描述】:

我无法理解一些与列表和地图相关的简单代码。以下面的代码为例:

public class test {

private Map<Integer, List<String>> myMap ;

public test(){
    myMap = new HashMap<Integer, List<String>>();
}

public void addToMap(String ss){

    List<String> myTemp = myMap.get(ss);
    Random  r = new Random();
    if(myTemp == null){

        myTemp = new ArrayList<String>();
        myMap.put(r.nextInt(100), myTemp);
    }

    myTemp.add(ss);

}

public Map<Integer, List<String>> getMap1(){
    return myMap;
}


public  static void main(String args[]){

    test myTest = new test();
    myTest.addToMap("abdc");
    myTest.addToMap("eeer");
    System.out.println(myTest.getMap1());

}

}

addToMap() 究竟是如何向 mylist 地图添加新元素的。更具体地说,当myTemp 是一个局部变量并在执行完成后被删除时,myTemp.add(ss) 如何向myMap 添加一个新元素。而且,从addToMap()方法中去掉myTemp.add(ss)会在main方法中打印出一个空的HashMap,这是为什么呢? put 方法在 add 方法之前执行时如何将元素插入到 map 中?谢谢。

编辑:我编辑了代码以使其更有意义。

【问题讨论】:

  • 此代码可用于重构和代码审查...

标签: java list hashmap


【解决方案1】:

与 C++ 不同,在 Java 中,所有变量都是对真实对象的引用。所以,当你这样做时

myTemp = new Object();

您在堆中创建一个对象,该对象的引用被复制到堆栈变量 myTemp。如果将引用添加到列表(或其他变量)中,则会在此处添加引用的副本。

一旦 myTemp 被销毁,对象将继续存在。例外情况是对对象的所有引用都消失了;然后代码无法访问该对象,垃圾收集可以(但不是强制)将其从内存中删除。

【讨论】:

    【解决方案2】:

    myTemp 不是事物——列表——而是对事物的引用。但这不是您要放入地图的特定参考;它是它所指的事物。地图对事物有自己的引用,因此删除 myTemp 引用不会影响地图。

    【讨论】:

      【解决方案3】:

      myTemp 是列表的reference。该列表分配在堆内存中,而 myTemp 实际上是存储在堆栈上的指针。每当您退出该函数时,它都会被删除,但在堆内存中分配的内存不会被删除。当垃圾收集器没有引用堆内存中分配的内存时,会释放它们。

      你是对的。当您离开 addToMap() 方法时,myTemp 将被释放(实际上它会从堆栈中弹出),但在堆内存空间中分配的列表将保留。使用 new 关键字创建的所有内容都将放置在堆内存空间中。

      阅读此链接Java Reference Objects

      【讨论】:

        【解决方案4】:

        从最佳实践的角度来看,将 HashMap 称为“mylist”在很多方面存在问题。它不是正交的,“mylist”并没有告诉你很多关于它的用法。

        在回答您的问题时,这是一个简单的情况,如果该项目存在于地图中,则检索它并将字符串添加到其中,否则创建列表并将其添加到地图中。只要地图在范围内,对添加到其中的任何列表的引用(即使它们是在函数范围内创建的)都保留在范围内。

        但是,这根本不是一个有用的示例,因为它混合了名称并且没有提供真实世界的用例。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-19
          • 2013-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-20
          相关资源
          最近更新 更多