【问题标题】:Java HashMap only returning last element of listJava HashMap 只返回列表的最后一个元素
【发布时间】:2013-04-30 00:31:16
【问题描述】:

我正在开发一款 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 中做过这件事没有问题,但即使经过比较,一切看起来都 100% 没问题。任何帮助是极大的赞赏。谢谢。

编辑:

这是我的 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;
}

【问题讨论】:

  • main.loadTextureFrom() 是做什么的?可以贴一下代码吗??
  • 难道是loadTextureFrom是罪魁祸首?
  • 刚刚发布了 loadTextureFrom() 方法。这应该不是问题,我让它在不使用 HashMap 时返回不同的纹理,但由于它被要求我编辑了帖子。谢谢

标签: java map hashmap return


【解决方案1】:

关于包括 HashMap 在内的集合的一个常见误解是,在添加或放置键/值/元素时,您正在放置该元素的副本。相反,您正在放置对元素的引用的副本。

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

【讨论】:

  • 感谢您的意见!但是,在我的帖子中,我解释说我尝试在不使用字典的情况下从头开始加载纹理,并且效果很好。意思是,问题不在于方法。方法本身很好,我已经很好地改变了角色的方向并且它返回了正确的纹理。只有当我尝试从 HashMap 中获取它时。另外,我说它不返回 SAME 元素,它总是返回 LAST 元素。因此,如果 char_up 是最后一个元素,则返回 char_up。如果最后一个元素是 char_down,则返回 char_down。
  • 无论如何,您描述的行为只能意味着您每次都在更新相同的值对象。 HashMap 已被数百万开发人员使用和测试了十五年。
  • 是的,我知道。我已经用过很多次了,从来没有遇到过问题。我预计会遇到一个问题,它一遍又一遍地返回相同的值,但它只返回最后一个值。我以前从未听说过。
  • 我发布了 loadTextureFrom() 方法,所以你可以看到它真的和其他方法一样。它没有什么特别或不同的地方。
  • 我建议您为每个对象打印System.identityObject(texture) 以检查它们是否都不同。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-04-29
    • 1970-01-01
    • 2023-04-02
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多