为什么HashMap似乎使用引用变量而不是真值?

时间:2016-07-25 04:35:37

标签: java android hashmap

我有一段代码(如下所示),在运行时,(理想情况下)将填充app数组看起来像这样:

标题1:

App 1

App 2

标题2:

App 3

App 4

然而,当我在我的模拟器中运行它时,它产生了这个:

标题1:

App 1

App 2

App 3

App 4

...

标题2:

App 1

...

我不确定为什么会发生这种情况,因为我查看了默认设置并且在我看的每个地方,人们都说Java默认是通过值传递,而不是通过引用传递。如果这是真的,为什么它会将每个应用程序添加到每个类别?

前提条件:

商店被定义为“App”类的列表,每个元素包含标题和标题等。

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

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


}

提前致谢!

1 个答案:

答案 0 :(得分:1)

是的,你是对的,java确实通过值但是有一些棘手的情况:

  1. 如果您使用原始数据类型:按值传递可以正常工作。

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

  3. 看看这个link