所以,我创建了一个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");
答案 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已经实现了这两个方法的键。您需要确保的是,密钥与您以前放入资源的密钥完全相同。