Java HashMap只返回列表的最后一个元素

时间:2013-05-06 09:17:49

标签: java map hashmap return

我正在开发2D游戏,我正在使用LWJGL和Slick-Util库来提供帮助。它并没有太复杂,我之前编写了更多困难的东西。但是,我遇到了HashMap / Map返回值的一个非常奇怪的问题。这是关于HashMap的代码:

    public Map<String, Texture> textures;

    public void loadTextures()
    {
        textures = new HashMap<String, Texture>();

        textures.put("char_up", main.loadTextureFrom("character/character_up.png"));
        textures.put("char_down", main.loadTextureFrom("character/character_down.png"));
        textures.put("char_right", main.loadTextureFrom("character/character_right.png"));
        textures.put("char_left", main.loadTextureFrom("character/character_left.png"));
    }

但是,无论何时我使用textures.get(frameHere),它总是返回我为HashMap设置的最后一项,所以如果我的最后一项是“char_right”,它将始终返回char_right纹理,即使我调用了某些东西像textures.get(“char_up”)。我尝试通过在每次角色改变方向时加载纹理的另一个实例来设置角色位置,并且它完美地工作。意思是,问题不在于纹理加载器或我将纹理作为值添加到我的HashMap中的方式。

这非常令人沮丧,我在这里搞砸了很多东西。也许有一些令人难以置信的简单,我错过了,因为我之前在Java中完成了这一点没有问题,但即使比较,一切看起来都很好。任何帮助是极大的赞赏。感谢。

编辑:

这是我的loadTextureFrom()方法:

public Texture loadTextureFrom(String path)
{
    try
    {
        return TextureLoader.getTexture("PNG", new FileInputStream(new File("res/textures/" + path)));
    }
    catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }

    return null;
}

2 个答案:

答案 0 :(得分:2)

关于集合(包括HashMap)的常见误解是在添加或放置要放置该元素副本的键/值/元素时。相反,您将放置元素引用的副本。

如果main.loadTextureFrom每次都返回相同的图像,那么您所描述的问题才真正可行。如果您在再次调用此方法之前使用该图像,这将起作用,但如果您想保存图像,则需要保存它的副本。

答案 1 :(得分:1)

您的图像加载器很可能每次调用时都返回相同的对象,而不是创建新对象。 Java Maps仅存储对象的引用,它们不会按值复制它们。

确保为每个新加载创建一个新的Image对象。