HashMap中的字符串相等

时间:2012-03-22 05:52:40

标签: java hashmap equality

所以,我创建了一个HashMap(资源是我自己创建的),每个密钥都是每个资源的文件路径。现在,假设我在HashMap中有一个带有文件路径“mat \ 10wdim3.mat”的资源,尝试检索它将失败,因为两个哈希码都不相等。

此密钥的Map中的哈希码为:-347056295 我用来尝试检索该资源的字符串:-2128683668

我在任何一个字符串中都找不到隐藏的字符。是否有其他方式的哈希码不匹配?

修改

包含一些示例代码

在构造函数中初始化。创建和添加资源(事先修剪文件路径)

private Map<String, Resource> m_Files;

public ResourceManager() {
    m_Files = new HashMap<String, Resource>();
}

public Resource createResource(String filepath, byte[] contents) {
    if (filepath != null && contents != null && contents.length > 0) {          
        String extension;
        int lastIndex = filepath.lastIndexOf(".");
        Resource res = null;

        if (lastIndex == -1)
            return null;

        extension = filepath.substring(lastIndex).toLowerCase();

        // TODO: Optimize this by putting the most common at the top
        try {
            if (extension.equals(".pup"))
                res = new Puppet(contents);
            else if (extension.equals(".bm"))
                res = new Bitmap(contents);
            else if (extension.equals(".snd"))
                res = new SoundFile(contents);
            else if (extension.equals(".cmp"))
                res = new ColorMap(contents);
            else if (extension.equals(".mat"))
                res = new Mat(contents);
            else if (extension.equals(".sft"))
                res = new Font(contents);
            /*else if (extension.equals(".ai") // Normal AI
                    || extension.equals(".ai0") // Easy AI
                    || extension.equals(".ai2")) // Hard AI
                res = new AIFile(contents);*/

            if (res != null) {
                addResource(filepath, res);

                return res;
            }
        } catch (RuntimeException e) {
            e.printStackTrace();
        }
    }

    return null;
}

public void addResource(String filepath, Resource res) {
    if (filepath != null && res != null && m_Files.put(filepath, res) != null)
        System.out.println("[!] Replacing " + filepath);
}

public Resource getResource(String filepath) {
    return m_Files.get(filepath);
}

获取所述资源

ResourceManager rManager = new ResourceManager();

rManager.loadGOB("C:/Documents and Settings/Unrealomega/Desktop/JKDF2/GOB/Resource/Res2.gob");

Resource res = rManager.getResource("mat\10wdim3.mat");

6 个答案:

答案 0 :(得分:2)

问题是你没有将'''字母转换为'\\';

“mat \ 10wdim3.mat”.hashCode(); // - 2128683668

但是如果你转义字母'\',你将获得以下输出:

“mat \\ 10wdim3.mat”.hashCode(); // -347056295

因此,当您从HashMap获取资源时,只需转义filePath String。

答案 1 :(得分:0)

因为它们不是同一个对象而您没有覆盖hashCode()equals()

http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode()

答案 2 :(得分:0)

如果您将字符串“mat \ 10wdim3.mat”与表示文件路径“mat \ 10wdim3.mat”的对象进行比较,那么您将无法获得匹配,因为String和对象可能具有不同的hashCode方法。

如果您肯定使用具有相同hashCode方法的字符串或其他两个对象,那么它们就不应该是不相等的

答案 3 :(得分:0)

如果字符串具有相同的内容,则没有其他方法可以使散列不同。使用

验证字符串是否确实相同
mystring.toCharArray()

答案 4 :(得分:0)

您是否完全确定您使用的hashmap键和String是相同的,即string1.equals(string2) == true?如果是这样,他们必须产生相同的哈希码。

答案 5 :(得分:0)

String的哈希值取决于String的长度。因此,我们需要具有相同长度的相同String才能检索该值。没有必要实现hashCode()和equals()作为String类的Object已经实现了这两个方法的键。您需要确保的是,密钥与您以前放入资源的密钥完全相同。