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

Java HashMap仅返回列表的最后一个元素,java,map,hashmap,return,Java,Map,Hashmap,Return,我正在开发一个2D游戏,我正在使用LWJGL和Slick Util库来提供帮助。这没有什么太复杂的,我以前编程过更难的东西。然而,我在HashMap/Map返回值方面遇到了一个非常奇怪的问题。这是我关于HashMap的代码: public Map<String, Texture> textures; public void loadTextures() { textures = new HashMap<String, Texture&g

我正在开发一个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"));
    }

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


只有当
main.loadTextureFrom
每次都返回相同的图像时,才可能出现您描述的问题。如果您在再次调用此方法之前使用了映像,则此操作可行,但如果要保存映像,则需要保存映像的副本。

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


只有当
main.loadTextureFrom
每次都返回相同的图像时,才可能出现您描述的问题。如果您在再次调用此方法之前使用了图像,这将起作用,但如果您要保存图像,则需要保存图像的副本。

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


确保为每次新加载创建一个新的图像对象。

很可能图像加载程序每次调用时都返回相同的对象,而不是创建一个新对象。Java映射只存储对对象的引用,而不按值复制它们


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

main.loadTextureFrom()做什么??你能发布代码吗?可能是loadTextureFrom是罪魁祸首吗?刚刚发布了loadTextureFrom()方法。这应该不是问题,我让它在不使用HashMap时返回不同的纹理,但由于它被请求,我编辑了这篇文章。谢谢main.loadTextureFrom()做什么??你能发布代码吗?可能是loadTextureFrom是罪魁祸首吗?刚刚发布了loadTextureFrom()方法。这应该不是问题,我让它在不使用HashMap时返回不同的纹理,但由于它被请求,我编辑了这篇文章。感谢您的输入!然而,在我的帖子中,我解释说,我尝试在不使用字典的情况下从头开始加载纹理,效果很好。也就是说,问题不在于方法。方法本身很好,我已经很好地改变了角色的方向,并且它返回了正确的纹理。只有当我试图从HashMap中获取它时。另外,我说过它不会返回相同的元素,它总是返回最后一个元素。因此,如果char\u up是最后一个元素,它将返回char\u up。如果最后一个元素是char\u down,它将返回char\u down。尽管如此,您描述的行为只能意味着您每次都在更新相同的值对象。HashMap已经被数百万开发者使用和测试了15年。是的,我知道。像这样我已经用了很多次了,从来没有遇到过问题。我期望得到一个问题,比如,它一次又一次地返回相同的值,但它只返回最后一个值。我以前从来没有听说过这个。我发布了loadTextureFrom()方法,所以你可以看到它实际上和其他方法一样。没有什么特别或不同。我建议您为每个对象打印
系统。标识对象(纹理)
,以检查它们是否都不同。感谢您的输入!然而,在我的帖子中,我解释说,我尝试在不使用字典的情况下从头开始加载纹理,效果很好。也就是说,问题不在于方法。方法本身很好,我已经很好地改变了角色的方向,并且它返回了正确的纹理。只有当我试图从HashMap中获取它时。另外,我说过它不会返回相同的元素,它总是返回最后一个元素。因此,如果char\u up是最后一个元素,它将返回char\u up。如果最后一个元素是char\u down,它将返回char\u down。尽管如此,您描述的行为只能意味着您每次都在更新相同的值对象。HashMap已经被数百万开发者使用和测试了15年。是的,我知道。像这样我已经用了很多次了,从来没有遇到过问题。我期望得到一个问题,比如,它一次又一次地返回相同的值,但它只返回最后一个值。我以前从来没有听说过这个。我发布了loadTextureFrom()方法,所以你可以看到它实际上和其他方法一样。没有什么特别或不同。我建议您为每个对象打印
System.identityObject(纹理)
,以检查它们是否都不同。
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;
}