java8 hashMap排序的新認識
public static void main(String[] args) { // 建立map Map<String, Integer> maps = new HashMap<String, Integer>(); maps.put("12", 12); maps.put("11", 11); maps.put("2", 2); // 輸出 初始化後的map maps.forEach((k, v) -> { System.out.println("原始map:" + k + "->" + v); }); maps = maps .entrySet() .stream() .sorted(Map.Entry.<String, Integer> comparingByValue() .reversed()) .collect(Collectors.toMap(c -> c.getKey(), c -> c.getValue())); List<Entry<String, Integer>> listMap = maps .entrySet() .stream() .sorted(Map.Entry.<String, Integer> comparingByValue() .reversed()).collect(Collectors.toList()); // 排序完後返回list listMap.forEach(e -> { System.out.println("排序完後返回List<Entry<String, Integer>>:" + e.getKey() + "->" + e.getValue()); }); // key值排序 List<String> list = maps.keySet().stream() .sorted((c1, c2) -> c2.compareTo(c1)) .collect(Collectors.toList()); maps.forEach((k, v) -> { System.out.println("排序完後返回map:" + k + "->" + v); }); list.forEach(e -> { System.out.println("key值單獨排序返回list<String>:" + e); }); // 排序完後返回Iterator Iterator<Map.Entry<String, Integer>> entryIterator = maps .entrySet() .stream() .filter(e -> StringUtils.isNotBlank(e.getKey())) .sorted(Map.Entry.<String, Integer> comparingByValue() .reversed()).iterator();// 排序 while (entryIterator.hasNext()) { Map.Entry<String, Integer> o = entryIterator.next(); System.out.println("排序完後返回迭代器:" + o.getKey() + "->" + o.getValue()); } }
輸出結果:
原始map:11->11
原始map:12->12
原始map:2->2
排序完後返回List<Entry<String, Integer>>:12->12
排序完後返回List<Entry<String, Integer>>:11->11
排序完後返回List<Entry<String, Integer>>:2->2
排序完後返回map:11->11
排序完後返回map:12->12
排序完後返回map:2->2
key值單獨排序返回list<String>:2
key值單獨排序返回list<String>:12
key值單獨排序返回list<String>:11
排序完後返回迭代器:12->12
排序完後返回迭代器:11->11
排序完後返回迭代器:2->2
抄錄一下:
HashSet 和 HashMap 之間有很多相似之處,對於 HashSet 而言,系統採用 Hash 演算法決定集合元素的儲存位置,這樣可以保證能快速存、取集合元素;對於
HashMap 而言,系統 key-value 當成一個整體進行處理,系統總是根據 Hash 演算法來計算 key-value 的儲存位置,這樣可以保證能快速存、取 Map 的 key-value 對。
當程式執行 map.put("12" , 12); 時,系統將呼叫"12"的 hashCode() 方法得到其 hashCode 值——每個 Java 物件都有
hashCode() 方法,都可通過該方法獲得它的 hashCode 值。得到這個物件的 hashCode 值之後,系統會根據該 hashCode 值來決定該元素的儲存位置。
public V put(K key, V value)
{
// 如果 key 為 null,呼叫 putForNullKey 方法進行處理
if (key == null)
return putForNullKey(value);
// 根據 key 的 keyCode 計算 Hash 值
int hash = hash(key.hashCode());
// 搜尋指定 hash 值在對應 table 中的索引
int i = indexFor(hash, table.length);
// 如果 i 索引處的 Entry 不為 null,通過迴圈不斷遍歷 e 元素的下一個元素
for (Entry<K,V> e = table[i]; e != null; e = e.next)
{
Object k;
// 找到指定 key 與需要放入的 key 相等(hash 值相同
// 通過 equals 比較放回 true)
if (e.hash == hash && ((k = e.key) == key
|| key.equals(k)))
{
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
// 如果 i 索引處的 Entry 為 null,表明此處還沒有 Entry
modCount++;
// 將 key、value 新增到 i 索引處
addEntry(hash, key, value, i);
return null;
}
根據上面
put 方法的原始碼可以看出,當程式試圖將一個 key-value 對放入 HashMap 中時,程式首先根據該 key 的 hashCode() 返回值決定該 Entry 的儲存位置:如果兩個 Entry 的 key 的 hashCode() 返回值相同,那它們的儲存位置相同。如果這兩個 Entry 的 key 通過 equals 比較返回 true,新新增 Entry 的 value 將覆蓋集合中原有 Entry 的 value,但 key 不會覆蓋。如果這兩個 Entry 的 key 通過 equals
比較返回 false,新新增的 Entry 將與集合中原有 Entry 形成 Entry 鏈,而且新新增的 Entry 位於 Entry 鏈的頭部——具體說明繼續看 addEntry() 方法的說明。
所以對hashmap 排序如果還是返回hashMap 毫無意義,因為他們的存放機制是這樣的.
相關推薦
java8 hashMap排序的新認識
public static void main(String[] args) { // 建立map Map<String, Integer> maps = new HashMap&
Java8系列之重新認識HashMap
簡介 Java為資料結構中的對映定義了一個介面java.util.Map,此介面主要有四個常用的實現類,分別是HashMap、Hashtable、LinkedHashMap和TreeMap,類繼承關係如下圖所示: 下面針對各個實現類的特點做一些說明: (1) Has
Java8的重要新特性
array 構造函數 rip 方式 -s 引用 sig ply number 一、Lambda表達式 java8中Lambda表達式的書寫方式: (參數) -> 表達式 (參數) -> 單行語句 (參數) -> { 語句 } 1.Lambda遍歷List
Java8 hashMap
11.2 方法 1.2 default efault tps collect html put http://wiki.jikexueyuan.com/project/java-collection/hashmap.html, http://wiki.jikexueyuan
視圖查詢性能的新認識
count get tle htm identity seda upd 計劃 hot 前兩天做系統調優的時候,想著把一系列的表聯合查詢換成視圖查詢,這樣速度就會快些,但是效果卻不是很理想。下面我把相關實驗過程記錄下來。 原sql語句是一個表聯合查詢,WorkOrder表
java8 HashMap源碼 詳細研讀
check 表現 align 對象 判斷 字符串常量 none equal 線程安全 HashMap原理 目的: 單純分析和學習hashmap的實現,不多說與Hashtable、ConcurrentHashMap等的區別。 基於 jdk1.8 在面試中有些水平的公司
Java8 HashMap ,hashTable,TreeMap 看源代碼看到的一些特性
允許 ble class 空指針 沒有 htable 空指針異常 運行 put HashMap: 默認不初始化hash表,在put時才初始化開辟16個容量的數組,擴展因子3/4。 新容量 和 擴展錨點: newCap = oldCap << 1 newT
typescript 接口的新認識
int bsp sss cti result span wid offset sca interface 用於接收服務器的數據。 eg: interface mmmmm { x: string, y: number, z: number, sel
冒泡排序重新認識
body 排序 OS tdi print 倒序 i++ .cn html 習題:將數組前5個元素順序排序,後5個倒序排序 #include <stdio.h> void main(){ int a[10]={11,2,3,4,5,6,7,8,9,10
jdk1.8排序新特性
pareto public args java 7 AD baidu sort Go add import java.util.Collections;import java.util.List;import java.util.ArrayList;import java.
HashMap原理簡單認識
1. hashMap簡單認識 優點:hashMap的儲存方式是鍵值對(鍵可以包括null),查詢速度,儲存方便,儲存數量最大為十幾億。 缺點:主要是執行緒不安全,容易在hashmap擴容時形成死迴圈; 2.hashMap從原始碼角度簡單認識 jdk1.7 使用的陣列 + 連結串列
實現HashMap排序
自己刷線上程式設計題用到好多次hashmap,刷了三四遍才能記住hashmap表的排序。 我就不生講了,直接用刷的一個題目為例 給出一個01字串(長度不超過100),求其每一個子串出現的次數。 輸入描述: 輸入包含多行,每行一個字串。 輸出描述: 對每個字串,輸出它所有出現次
對HashMap排序
對HashMap排序 建立自定義物件 public class User implements Comparable<User>{ private Integer id; private String name; pri
thinkphp對id進行排序 新排版方式
{volist name
Java8 HashMap原始碼解析
前言 Java7中的HashMap和Java8中的HashMap不太一樣,Java7中的HashMap主要是由陣列+連結串列組成的,而Java8中的 HashMap是由陣列+連結串列+紅黑樹組成的,當連結串列的長度超過8個時,就會轉為紅黑樹,降低查詢時的時間複
嗶哩嗶哩2018.9.21筆試 小A最多會新認識多少人
題目描述 小A參加一個n人的活動,每個人都有一個編號(0<=i<=n-1),其中有m對相互認識,在活動中兩個人可以通過互相都認識都認識的一個人介紹認識。現在問活動結束後,小A最多會新認識多少人? 輸入: 第一行是聚會人數n 第二行是小A的編號a 接下
JAVA8 十大新特性詳解
Java官方庫的新特性 Java 8增加了很多新的工具類(date/time類),並擴充套件了現存的工具類,以支援現代的併發程式設計、函數語言程式設計等。 4.1 Optional Java應用中最常見的bug就是空值異常。在Java 8之前,Google Guava引入了Optionals類來解決NullP
對資料結構的新認識
資料結構是指相互之間存在著一種或多種關係的資料元素的集合和該集合中資料元素之間的關係組成 資料結構具體指同一類資料元素中,各元素之間的相互關係,包括三個組成成分,資料的邏輯結構,資料的儲存結構和資料運算結構。 資料結構是為了更高效的處理資料而存在的 資料結構與演算法關係
對數據結構的新認識
targe 相互 堆數據結構 邏輯結構 存儲空間 先進後出 通過 title .com 數據結構是指相互之間存在著一種或多種關系的數據元素的集合和該集合中數據元素之間的關系組成 數據結構具體指同一類數據元素中,各元素之間的相互關系,包括三個組成成分,數據的邏輯結構,數據
網友年齡 某君新認識一網友。 當問及年齡時,他的網友說: “我的年齡是個2位數,我比兒子大27歲, 如果把我的年齡的兩位數字交換位置,剛好就是我兒子的年齡” 請你計算:網友的年齡一共有多少種
#include <stdio.h> int main() { int i,j,t; for(i=10;i<100;i++) { t=i%10*10+i/10; fo