更新時(shí)間:2020-05-20 16:03:58 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽5407次
我們都知道,TreeMap是一個(gè)邏輯集合,開(kāi)發(fā)者按照手拉手的方式將元素連接到一起,而且會(huì)按照元素的大小排序.
所以,我們?cè)谑褂玫臅r(shí)候必須,所要存儲(chǔ)的元素的Key必須要有比較的功能(實(shí)現(xiàn)Comparable接口,重寫(xiě)compareTo方法)或者使用一個(gè)第三方的比較器(Comparator接口的子類,重寫(xiě)compare方法).
當(dāng)我們存儲(chǔ)一個(gè)元素的時(shí)候,集合就會(huì)用這個(gè)元素的Key和集合內(nèi)部的元素的Key進(jìn)行比較,如果這個(gè)比較方法返回一個(gè)小于零的數(shù),則會(huì)將存入的元素放到被比較元素的左邊,如果返回一個(gè)大于零的數(shù),則會(huì)方法被比較元素的右邊,返回0則不存入.
背景
有一次開(kāi)發(fā)中,需要根據(jù)老人的年齡排個(gè)序,所以直接就使用TreeMap集合,將老人的年齡當(dāng)作Key存入集合,同時(shí)為了避免將年齡相同的元素過(guò)濾掉,在使用比較器的時(shí)候,如果兩個(gè)元素的年齡相同則返回-1.讓新的元素存到老元素的左邊
但是后來(lái)在通過(guò)key獲取值的時(shí)候發(fā)現(xiàn),如果如何獲取,結(jié)果總會(huì)是null,但是集合中確實(shí)有這個(gè)元素,使用迭代器可以獲取到正確值,測(cè)試了好多次都是這樣的結(jié)果
解決
后來(lái)通過(guò)查看源碼才發(fā)現(xiàn),TreeMap的get(key)方法和HashMap不同,HashMap是通過(guò)比較key計(jì)算出一個(gè)角標(biāo),然后獲取數(shù)組中對(duì)應(yīng)角標(biāo)上的值.
而TreeMap是通過(guò)將方法中參數(shù)key和集合內(nèi)部的key進(jìn)行對(duì)比,如果比較的結(jié)果是0,則表示找到了要找的元素,可是,這個(gè)方法中使用的比較方法和存入時(shí)使用的比較方法是一樣的,都是我們開(kāi)始指定的比較器中的比較方法.
這就導(dǎo)致一個(gè)現(xiàn)象,比較器永遠(yuǎn)無(wú)法返回0,如果相等則會(huì)返回-1,那么集合就認(rèn)為,你要找的元素還在左邊,就會(huì)一直找下去,直到找到null,然后把null返回去
所以我們獲取到的值永遠(yuǎn)都是null
總結(jié)
如果你想在排序的同時(shí)又想保留重復(fù)的元素,絕對(duì)不要使用Tree系列的集合
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java treemap倒序,treemap可以排序?”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743