今天遇到一個有趣的現象,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);
// 存入map
dicMap.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