Java程式碼常用功能實現總結(二)
文章目錄
1.如何取得map裡key得最大值:
方法一:
將Map中的key存放至set集合中,進行排序,排序後的set中第一個值即為最小,最後一個即為最大
import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; public class test { public static void main(String[] args) { Map<Integer, Integer> map = new HashMap<Integer, Integer>(); map.put(1, 8); map.put(3, 53); map.put(5, 12); System.out.println(getMaxKey(map)); System.out.println(getMaxValue(map)); } /** * 求Map<K,V>中Key(鍵)的最大值 */ public static Object getMaxKey(Map<Integer, Integer> map) { if (map == null) return null; Set<Integer> set = map.keySet(); Object[] obj = set.toArray(); Arrays.sort(obj); return obj[obj.length - 1]; } /** * 求Map<K,V>中Value(值)的最大值 */ public static Object getMaxValue(Map<Integer, Integer> map) { if (map == null) return null; Collection<Integer> c = map.values(); Object[] obj = c.toArray(); Arrays.sort(obj); return obj[obj.length - 1]; } }
執行結果:
5
53
方法二:可以直接使用TreeSet和TreeMap,最後一個為最大值,第一個為最小值
補充:
TreeMap是Map介面的常用實現類,而TreeSet是Set介面的常用實現類。雖然 TreeMap和TreeSet實現的介面規範不同,但TreeSet底層是通過TreeMap來實現的(如同HashSet底層是是通過HashMap來實現的一樣),因此二者的實現方式完全一樣。而TreeMap的實現就是紅黑樹演算法。
相同點:
TreeMap和TreeSet都是有序的集合,也就是說他們儲存的值都是拍好序的。
TreeMap和TreeSet都是非同步集合,因此他們不能在多執行緒之間共享,不過可以使用方法Collections.synchroinzedMap()來實現同步
執行速度都要比Hash集合慢,他們內部對元素的操作時間複雜度為O(logN),而HashMap/HashSet則為O(1)。
不同點:
最主要的區別就是TreeSet和TreeMap非別實現Set和Map介面
TreeSet只儲存一個物件,而TreeMap儲存兩個物件Key和Value(僅僅key物件有序)
TreeSet中不能有重複物件,而TreeMap中可以存在
Set<Integer> a=new HashSet<Integer>(); // 等效於 HashSet<Integer> b = new HashSet<Integer>(); Set<Integer> c=new TreeSet<Integer>(); // 等效於 TreeSet<Integer> d = new TreeSet<Integer>(); a.add(5);
Set是介面,HashSet和TreeSet是實現類
Hashset顧名思義裡面是雜湊表結構
TreeSet就是樹結構
1、TreeSet 是二差樹實現的,Treeset中的資料是自動排好序的,不允許放入null值。
2、HashSet 是雜湊表實現的,HashSet中的資料是無序的,可以放入null,但只能放入一個null,兩者中的值都不能重複,就如資料庫中唯一約束。存取速度比較快
注:由於HashSet儲存資料都是無序的,所以不能用get(i);來獲取具體物件。所以我們必須通過遍歷來得到HashSet的各個資料,由於是沒有索引的。所以不能使用普通型別的for來遍歷它。HashSet只能通過增強型for和迭代器來遍歷它
public static void main(String[] args) {
HashSet<Integer> a = new HashSet<Integer>();
a.add(5);
a.add(4);
a.add(3);
for(Integer n : a) {
System.out.println(n);
}
Iterator<Integer> it = a.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
2.多執行緒寫法樣例:
ExecutorService executorService = Executors.newFixedThreadPool(5);
this.thredExecute(executorService, createSubject);
private void thredExecute(ExecutorService threadPool,CreateSubject createSubject) {
Thread thread = new Thread( () -> {
try {
characterAnalysisService.saveCharacterLeader(createSubject);
} catch (Exception e1) {
e1.printStackTrace();
}
} );
Thread thread2 = new Thread( () -> {
try {
characterAnalysisService.saveIntenetLeader(createSubject);
} catch (Exception e) {
e.printStackTrace();
}
});
Thread thread3 = new Thread( () -> {
try {
emotionAnalysisService.saveAllTypeEmotion(createSubject);
} catch (Exception e) {
e.printStackTrace();
}
});
threadPool.execute(thread);
threadPool.execute(thread2);
threadPool.execute(thread3);
// 關閉執行緒池
threadPool.shutdown();
threadPool = null;
System.gc();
}