小议map排序问题
map有序無序?如果說有序, 這個順序是怎么定義的? 安裝put的先后順序嗎? 還是被put元素的內(nèi)容呢?
?
經(jīng)觀察,應該是后者,跟put先后順序無關, 跟內(nèi)部實現(xiàn)有關(可能是hash排序的, 非大小排序)
public static void main(String[] args) {// asfd(); // TODO Auto-generated method stub Map<String, String> map = new ConcurrentHashMap<String, String>(); // map.put("10.167.240.78", "aa"); // map.put("10.167.240.61", "bb"); // map.put("10.167.240.46", "dd"); // map.put("10.167.240.54", "cc");map.put("205", "b"); map.put("101", "b"); map.put("201", "b");for (int i = 10; i > 0; i--) { // map.put(i+"", Math.random()+""); }System.out.println(map);}
?
打印 :{201=b, 101=b, 205=b}
如果是
map.put("205", "b");
map.put("101", "b");
map.put("201", "b");
(把205改成25)
則打印:
{201=b, 101=b, 25=b}
?
?
而且發(fā)現(xiàn)ConcurrentHashMap和HashMap的表現(xiàn)也不同 —— 內(nèi)部的hash算法還有細節(jié)上的區(qū)別嗎?
?
?
===============
?
參照http://kenkao.iteye.com/blog/1812283
?
List按對象進入的順序保存對象,不做排序或編輯操作。Set對每個對象只接受一次,并使用自己內(nèi)部的排序方法(通常,你只關心某個元素是否屬于Set,而不關心它的順序--否則應該使用List)。Map同樣對每個元素保存一份,但這是基于"鍵"的,Map也有內(nèi)置的排序,因而不關心元素添加的順序。如果添加元素的順序?qū)δ愫苤匾?#xff0c;應該使用 LinkedHashSet或者LinkedHashMap.
?
?小結(jié):
1 List按對象進入的順序保存對象, Set、 Map不是它們各有內(nèi)部排序算法
2 List容許有重復值, Set不容許; Map不容許有重復key值。
3 List、Set、 Map各自的不同實現(xiàn),效率有所不同,側(cè)重不同
4對于存儲于Set內(nèi)的元素x,我們需要對x重寫其hashCode方法——我們在重寫對象的equals方法時,必須重寫hashCode——就是說,equals不等,則hashCode不同,反之亦然
?
—— 這個Set 或者 HashSet好像用的很少吧,我工作這么久都沒用過一樣。。。
一般就是ArrayList、HashMap。。。?
?
posted on 2014-02-15 12:16 CanntBelieve 閱讀(...) 評論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/FlyAway2013/p/3550431.html
總結(jié)
- 上一篇: 面试题之发散思维能力:如何用非常规方法求
- 下一篇: UIImage常用的分类