【发布时间】:2020-02-06 09:17:24
【问题描述】:
我正在编写一个从文件中读取行的程序。 HashMap<String,Class> 正在使用中。例如,使用的密钥是“inboundtcp”。
当从缓冲读取器读取第一行时,hashmap 的 containsKey(key) 返回 false 并添加一个新条目,这是显而易见的情况。但是,如果另一行的键为“inboundtcp”,则 containskey(key) 将返回 false。
我放置了一个断点,发现 hashCode 有所不同。它被添加为新条目。对于所有其他后续读取,在第二次读取后,从文件中 containsKey(key) 返回 true
BufferedReader br = new BufferedReader(new FileReader(filePath));
String line;
while ((line = br.readLine()) != null) {
String[] fields = line.split(",");
String trafficDirection=fields[0].trim();
String trafficProtocol=fields[1].trim();
String portValue=fields[2];
String ipAddressValue=fields[3].trim();
String key=trafficDirection+trafficProtocol;
if(rulesMap.containsKey(key)){
PortsAndIP result=insertPortAndIPAddress(portValue,ipAddressValue);
ArrayList<PortsAndIP> existingData= (ArrayList<PortsAndIP>) rulesMap.get(trafficDirection+trafficProtocol);
existingData.add(result);
rulesMap.put(new String(trafficDirection+trafficProtocol),existingData);
}
else {
ArrayList<PortsAndIP> data= new ArrayList<PortsAndIP>();
PortsAndIP result=insertPortAndIPAddress(portValue,ipAddressValue);
if(result!=null) {
data.add(result);
rulesMap.put(new String(trafficDirection+trafficProtocol),data);
}
}
}
我参考了所有相关帖子,但找不到解决方案。 String 类已经实现了 hashCode() 和 equals() 方法,但是为什么会这样呢?
【问题讨论】:
-
如果字符串的哈希码不同,那么字符串就不同,即使它们看起来相同。有些字符看起来像其他字符。有些字符是看不见的。您需要更仔细地查看字符串的确切内容。
-
不是说会影响HashMap的行为,但是写
new String(trafficDirection+trafficProtocol)完全没有意义。写trafficDirection+trafficProtocol -
@Eran 我只是在测试以检查键是否匹配。我通常不使用 new() 进行写作。
-
@khelwood 我从 csv 文件中读取了带有确切单词的行。你能告诉我一些方法来检查更强大的平等吗?
-
我告诉你,如果你有两个具有不同哈希码的字符串,那么它们是不同的,但是你得到了它们。