最新看啦一篇文章,深有感觸,因此又吧treeMap細節從新學習啦一下!html
treeMap自己就是默認排序的!他是添加內容的時候進行排序的;java
return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2) : comparator.compare((K)k1, (K)k2);
Comparable<? super K> k = (Comparable<? super K>) key;
comparator表示傳遞是否傳遞 排序對象;學習
默認按照的是asc碼值進行排序的!若是傳遞自定義的Comparator,則按照自定義進行排序;code
一 treeMap是二叉樹排序的 詳情看:http://www.cnblogs.com/chenssy/p/3746600.htmlorm
二 treeMap 排序的時候能夠 捨去 大小寫,按照正常的排序:htm
Map<String, String> map = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER); map.put("a", "abstract1"); map.put("b", "abstract2"); map.put("a", "abstract4"); map.put("A", "abstract3"); //key:a= value:abstract3 //key:b= value:abstract2
出現這個狀況的緣由是源碼中的[每次若是他的key比較爲0的時候都會把value進行替換,由於忽律啦大小寫,因此會出現這個結果]:對象
Comparable<? super K> k = (Comparable<? super K>) key; do { parent = t; cmp = k.compareTo(t.key); if (cmp < 0) t = t.left; else if (cmp > 0) t = t.right; else return t.setValue(value); } while (t != null);
日期例子:blog
Map<String, Integer> map = new TreeMap<String, Integer>(new Comparator<String>() { public int compare(String o1, String o2) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { return sdf.parse(o1).compareTo(sdf.parse(o2)); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } return 0; } }); map.put("2016-7-3", 100); map.put("2016-7-10", 120); map.put("2016-8-1", 90); //注:此處的返回值不能用 return (int)(sdf.parse(o1).getTime() - sdf.parse(o2).getTime()) //由於 sdf.parse(o1).getTime返回的是long類型,long類型轉換int會出現截取!致使數值不正確,正確方式能夠參考 //Date.java中的compareTo方法