【问题标题】:Why does containsKey(String) return false in my program,though the key is present and identical?为什么 containsKey(String) 在我的程序中返回 false,尽管密钥存在且相同?
【发布时间】: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 文件中读取了带有确切单词的行。你能告诉我一些方法来检查更强大的平等吗?
  • 我告诉你,如果你有两个具有不同哈希码的字符串,那么它们是不同的,但是你得到了它们。

标签: java string hashmap


【解决方案1】:

问题是我的 csv 是 utf-8 字节的 .csv 格式。当我在 MS-Excel 中更改为 .csv 格式时,哈希图能够为键返回 true。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2016-03-22
    • 2017-01-03
    • 1970-01-01
    • 2011-05-23
    • 2021-11-18
    • 2023-04-10
    相关资源
    最近更新 更多