今天遇到一个有趣的现象,HashMap的key居然重复了,2个同样的字符串“全新好”作为map的key值同时出现在map中,他们的hash值是不同的,这让我很费解。
我是将如下数据放入txt中,然后使用BufferReader读取数据插入map中,将每行第一个字符串(比如“全新好”)作为Key,目的是去重复。
全新好 ambi 360
中国宝安 mbi 60
全新好 ambi 360
美丽生态 ambi 360
DeepTech深科技 mi 30
美丽生态 ambi 360
代码如下:
while ((str = br.readLine()) != null){readLine = str.split(" ");if(dicMap.containsKey(String.valueOf(readLine[0]))){continue;}// 词语dm.setWords(readLine[0]);if(readLine.length == 3) {// 权重dm.setWeights(Integer.parseInt(readLine[2]));}// 词性dm.setPartOfSpeech(readLine[1]);// 修改者dm.setModifyUser(userId);// 创建者dm.setCreateUser(userId);// 存入mapdicMap.put(readLine[0], dm);dm = new DictionaryManagement();}
当读到第二个“全新好 ambi 360”字符串时,map将它存了起来(两个“全新好”作为Key值时hash值居然是不同的)。但是“美丽生态”没有出现重复的现象,这让我很是费解。最后请教大佬得出原因以及解决办法
因为txt的编码格式为UTF-8-BOM。
BOM——Byte Order Mark,就是字节序标记。
UTF-8-BOM比UTF-8文件开头多了三个字节前缀:0xEF0xBB0xBF
所以第一行数据“全新好”带有了这个三个字节,导致它和第三行的“全新好”hash值不同。
解决办法是将此txt编码转化为UTF-8