2016-07-25 65 views
0

我的代码(下面)一个代码段中运行时,将(理想地)填充一个应用程序阵列看起来像这样:为什么HashMap似乎使用引用变量而不是真值?

部首1:

应用1

应用2

标题2:

应用3

应用4

然而,当我在仿真器运行它,它会产生这样的:

部首1:

应用1

应用2

应用3

App 4

...

标题2:

应用1

...

我不知道为什么会这样,因为我已经看过了默认值,并到处看,人说Java默认为按值传递,而不是通过引用。如果这是真的,它如何将每个应用程序添加到每个类别?

前提条件:

存储被定义为级“应用程序”,包含标题和标题,除其他事项外的每个元素的列表。

ListDataChild是一个空的散列映射,其类型>将由循环填充,然后通过可展开列表视图输出。我会发布视图的代码,但它非常庞大而且很长,所以我只在最后添加一个简单的测试算法。

的emptyList就是这样,类型的列表里面没有什么(至少与开始难道会改变?)

代码:

listDataChild = new HashMap<String, List<App>>(); 

    List<App> emptylist = new ArrayList<>(); 
    List<App> Store = synced.getAppStore(); 

    Boolean juststarted = true; 

    for (App el : Store) 
    { 
     if (juststarted) 
     { 
      juststarted = false; 
      listDataChild.put(el.getHeader(), emptylist); 
      listDataChild.get(el.getHeader()).add(el); 
     } else { 
      if (listDataChild.containsKey(el.getHeader())) { 
       listDataChild.get(el.getHeader()).add(el); 
      } else { 
       listDataChild.put(el.getHeader(), emptylist); 
       listDataChild.get(el.getHeader()).add(el); 
      } 
     } 
    } 
    //TESTING 
    for (String header : listDataChild.keySet()) 
    { 
     for (int j = 0; j < listDataChild.get(header).size(); j++) 
     { 
      System.out.println("HashMap at " + header + ", " + j + ": " + listDataChild.get(header).get(j).getTitle()); 
     } 
    } 

App.Java:

public class App { 
    public String header,title,link,url,redirect,icon; 
    public Double order; 
    public Boolean selected; 

    public App() { 
     header = ""; 
     title = ""; 
     link = ""; 
     url = ""; 
     redirect = ""; 
     icon = ""; 
     order = 0.0; 
     selected = false; 
    } 

    public int compareTo(App another) { 
     if (this.getOrder()<another.getOrder()){ 
      return -1; 
     }else{ 
      return 1; 
     } 
    } 

    public void setHeader(String h) { 
     header = h; 
     return; 
    } 

    public void setTitle(String t) { 
     title = t; 
     return; 
    } 

    public void setLink(String l) { 
     link = l; 
     return; 
    } 

    public void setUrl(String u) { 
     url = u; 
     return; 
    } 

    public void setRedirect(String r) { 
     redirect = r; 
     return; 
    } 

    public void setIcon(String i) { 
     icon = i; 
     return; 
    } 

    public void setOrder(Double o) { 
     order = o; 
     return; 
    } 

    public void setSelected(Boolean s) { 
     selected = s; 
     return; 
    }  




    public String getTitle() 
    { 
     return title; 
    } 

    public String getHeader() 
    { 
     return header; 
    } 

    public Double getOrder() 
    { 
     return order; 
    } 


} 

在此先感谢!

+0

*“如果你有修改建议,请只是否决之前发表评论。” *是不是建设性的,并可能有预期的效果相反。 –

+0

你没有引用足够多的代码,也没有告诉我们什么是'listDataChild',或者它与你指定的输出有什么关系。请参阅:[mcve] –

+1

*“我在任何地方看,人们都说Java默认通过值传递,而不是通过引用。如果这是真的,它如何将每个应用程序添加到每个类别?”* Java不会“默认”通过价值传递,这是**所有它**。请注意,当您处理对象时,传递的值是对对象的引用,而不是对象的副本。这可能与你遇到的问题有关,不可能从你引用的内容中知道。更多:http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value?rq=1 –

回答

1

是的,你是对的,Java没有路过值但也有棘手的情况:

  1. ,如果你使用的是原始数据类型:按值传递工作正常。

  2. 如果使用对象而不是原始数据类型:按值传递作品,但传递对象的地址为。所以它看起来像传递参考。 我知道概念几乎看起来一样,但从技术上讲,它是通过价值。

看一看这个link

+0

好的,那么我怎么确定这个值以后不会改变呢? –

+0

创建一个新对象并分配给hashmap。 – chandil03

相关问题