
大資料學習路線分享大資料之Map接口,Collection:直接存儲的是值.
Map:本身是接口,存儲的是鍵值對,一個元素就是一個鍵(key)值(value)對,key必須是唯一的,值随意,即可以重複。
Map:接口
HashMap:底層是哈希表,線程不安全的
TreeMap:底層是二叉樹,線程不安全的
介紹Map接口的方法
Map<String, String> map = new HashMap<>();
//1.增加
//V put(K key,V value) 增加一個鍵值對
//關于傳回值,如果目前的key之前沒有添加過,傳回null.
//如果目前的key之前已經存在了,這裡傳回之前的值
String value1 = map.put("01", "java");//傳回null
String value2 = map.put("01", "html");//傳回java
//void putAll(Map<? extends K,? extends V> map) 增加多個
//2.删除
//V remove(Object key) 根據key删除元素
//傳回值就是被删掉的值
//System.out.println(map.remove("01"));
//void clear() 删除全部 != null
//3.擷取
//V get(Object key) 根據key查找元素
System.out.println(map.get("02"));
//int size() 擷取鍵值對的個數
//Set<K> keySet() 周遊方法一
//Set<Map.Entry<K,V>> entrySet() 周遊方法二
//4.常用的判斷
//boolean isEmpty() //空map!=null
//map = null;
System.out.println(map.isEmpty());
//boolean containsKey(K key) 是否包含目前的key
//boolean containsValue(V value) 是否包含目前的value
周遊方法一:
Map<String, String> map = new HashMap<>();
//原理:先得到所有的key,放入一個Set中,利用Set的疊代器進行周遊得到key,在利用key擷取value
//Set<K> keySet()
//第一步:先得到裝着key的set
Set<String> set = map.keySet();
//第二步:周遊set,得到key,再根據key擷取value
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
System.out.println("key:"+key+" value:"+map.get(key));
}
周遊方法二:
//原理:先得到所有的entry,放入一個Set中,利用Set的疊代器進行周遊得到entry實體,在利用entry的方法擷取key和value
//Set<Map.Entry<K,V>> entrySet()
//第一步:先得到裝着Entry實體的set
Set<Map.Entry<String,String>> set = map.entrySet();
//第二步:周遊set,得到entry實體,再調用entry實體對象的方法擷取key和value
Iterator<Map.Entry<String,String>> iterator = set.iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
//通過setValue可以将map的原始值改變,但是一般在使用entrySet的時候,是進行周遊.不進行值的改變.
//entry.setValue("bingbing");
System.out.println("key1:"+entry.getKey()+" value1:"+entry.getValue());
}
HashMap 去重: 因為HashMap的底層與HashSet的底層實作一樣,隻是對HashMap去重的時候,操作的是key
注意:HashMap可以實作排序:因為他的底層資料結構是由數組+連結清單+二叉樹共同實作的.是以可以排序.同時這樣做的目的是提高資料存儲的效率.
TreeMap:去重和排序: TreeMap底層與TreeSet一緻,在進行排序去重的時候就是去操作key
TreeMap的注意點:
1.什麼類型的資料類型可以作為key?
a:實作了Comparable接口的compareTo()方法 b:實作了Comparator接口的compare()方法
可以的代表:String,包裝類,自定義的實作了要求的類
不可以的代表:數組,ArrayList,LinkedList(如果給他們建立的比較器也可以比較,但是不建議使用)
2.元素可不可以作為key,跟元素内部的成員沒有關系
2.可變參數
可變參數:參數的個數可以改變
作用:簡化代碼,簡化操作
特點
1.給可變參數傳值的實參可以直接寫,個數不限制,内部會自動的将他們放入可變數組中.
資料類型+... 實際上就是資料類型[] 即:int[]
2.當包括可變參數在内有多個參數時,可變參數必須放在最後面,并且一個方法中最多隻能有一個可變參數
3.當可變參數的方法與固定參數的方法是重載關系時,調用的順序,固定參數的優先于可變參數的.
public static int sum(int[] a) {}
//public static int sum(int... a) {}與上面sum方法重名
3.增強for循環
可以周遊的内容有:數組,Collection,Map.但是Map不能直接周遊
結構:
for(元素:數組/Collection){
内容
}
原理:
每次周遊開始後,會自動從數組中依次取出一個元素放入前面的變量中,當次循環的操作使用的就是這個元素.周遊完成之後,會自動進行第二次周遊.一直到數組的末尾.所有元素周遊結束.循環停止.
4.Collections:
封裝了大量操作Collection的工具
ArrayList<String> list = new ArrayList<>();
//第一種排序:預設按照字典進行排序
Collections.sort(list);
//倒叙字典排序
Comparator<String> comparator2 =Collections.reverseOrder();
Collections.sort(list, comparator2);
//注意:要想list中的元素可以按照字典排序,元素必須實作Comparable接口
/按照從短到長排序
//使用比較器
ComStrWithLength1 comStrWithLength = new ComStrWithLength1();
Collections.sort(list, comStrWithLength);
//按照從長到短排序
Comparator<String> comparator1 = Collections.reverseOrder(comStrWithLength);
Collections.sort(list, comparator1);
class ComStrWithLength1 implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
int num = o1.length()-o2.length();
return num==0?o1.compareTo(o2):num;
}
}
5.多線程
程式:一個可執行的檔案
程序:一個正在運作的程式.也可以了解成在記憶體中開辟了一塊兒空間
線程:負責程式的運作,可以看做一條執行的通道或執行單元,是以我們通常将程序的工作了解成線程的工作
程序中可不可以沒有線程?
必須有線程,至少有一個.當有一個線程的時候我們稱為單線程(唯一的線程就是主線程).
當有一個以上的線程同時存在的時候我們稱為多線程.
多線程的作用:為了實作同一時間幹多件事情.
任務區:我們将線程工作的地方稱為任務區.
每一個線程都有一個任務區,任務區通過對應的方法産生作用.
JVM預設是多線程嗎?
至少要有兩個線程:
主線程:任務區:main函數
垃圾回收線程:任務區:finalize函數
注意:
多線程下多個線程之間是搶CPU的關系,在宏觀上講:可以了解成同一時間可以做多件事
多線程不一定提高程式的效率
并不是線程越多越好,多個線程同時存在相當于在一起搶CPU,是以要适當使用
手動運作垃圾回收器System.gc();
主線程随着任務的結束而結束,線程随着任務的開始而開始.當線程還在工作的時候,程序不能結束.
finalize方法
正常情況下,這個函數是由系統調用的,
當對象被釋放的時候,會自動的調用finalize方法
HashMap
經常出的相關面試題
1.HashMap的底層實作
2.HashMap與HashTable的差別
作業:
練習題 :lambda compare
練習題一: 實作字元串和Person對象的去重
TreeMap
練習題二:分别使用預設方法和手動方法實作字元串和Person對象的排序去重
練習題三: 1.josgjsjagwajsogiseafgjwsjgvoier
要求:1.轉化成字元串 : a(字元的個數)b()c().. 2.區分大小寫 3.隻讀取字母