天天看點

c++ map iterator 擷取key_大資料學習路線分享大資料之Map接口

c++ map iterator 擷取key_大資料學習路線分享大資料之Map接口

  大資料學習路線分享大資料之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.隻讀取字母

繼續閱讀