資安

【Java七天學習訓練營】Day4

泰山版Java開發手冊

《Java開發手冊》始於阿里內部規約,在全球 Java 開發者共同努力下,已成為業界普遍遵循的開發規範。今年是手冊上線第四年,推出全新泰山版免費下載,涵蓋三大更新亮點,直接下載一睹為快:專題頁鏈接

Java七天學習訓練營Day4

Java七天學習訓練營是由泰山版《Java開發手冊》的作者親自出題,每天學習一個知識點,寫一份小作業,幫助你不僅是閱讀,更能透徹理解泰山版《Java開發手冊》的重要知識。

完成七天打卡挑戰的少俠即有機會獲得精美的阿里雲開發者社區周邊禮品,包含阿里雲ET公仔、超大社區鼠標墊、衛衣、揹包等等。

獎品說明:
同學們獲取獎品的順序,以阿里妹收到同學完成打卡後填寫的表單序號為主。

第1名和第100、200、300等100的倍數打卡的同學送一個阿里雲ET公仔(限量10個)
第10、20、30名等10的倍數打卡的同學送一張超大鼠標墊(限量50個)
第6名、第66名、第666名(以此類推)打卡同學送一個阿里雲雙肩包
第8名、第88名、第888名(以此類推)打卡的同學送一件阿里雲定製衛衣
除此之外,打卡完成編號是質數的同學可以獲得一份筆記本+貼紙的紀念品

(部分獎品展示)

公仔.jpg

阿里雲ET公仔

152.png

超大開發者社區鼠標墊

揹包.JPG

阿里雲定製雙肩包

今日學習內容:集合處理

閱讀前需瞭解:
1.每日學習的知識點都節選自泰山版《Java開發手冊》,如想完整閱讀電子書的所有內容,請到專題頁下載。
2.根據約束力強弱,規約依次分為強制、推薦、參考三大類:
【強制】必須遵守。是不得不遵守的約定,違反本約定或將會引起嚴重的後果。
【推薦】儘量遵守。長期遵守這樣的規定,有助於系統穩定性和合作效率的提升。
【參考】充分理解。技術意識的引導,是個人學習、團隊溝通、項目合作的方向。

1. 【強制】關於hashCode和equals的處理,遵循如下規則:
 1) 只要重寫equals,就必須重寫hashCode。
 2) 因為Set存儲的是不重複的對象,依據hashCode和equals進行判斷,所以Set存儲的對象必須重寫這兩個方法。
 3) 如果自定義對象作為Map的鍵,那麼必須重寫hashCode和equals。
說明:String正因為重寫了hashCode和equals方法,所以我們可以非常愉快地使用String對象作為key來使用。

2. 【強制】使用Map的方法keySet()/values()/entrySet()返回集合對象時,不可以對其進行添加元素操作,否則會拋出UnsupportedOperationException異常。

3. 【強制】判斷所有集合內部的元素是否為空,使用isEmpty()方法,而不是size()==0的方式。
說明:前者的時間複雜度為O(1),而且可讀性更好。
正例:

Map<String, Object> map = new HashMap<>();
if(map.isEmpty()) {
    System.out.println("no element in this map.");
}

反例:

List<String> list = new ArrayList<>();
if (list.size() == 0) {
    System.out.println("no element in this list.");
}

4. 【強制】Collections類返回的對象,如:emptyList()/singletonList()等都是immutable list,不可對其進行添加或者刪除元素的操作。
反例:某二方庫的方法中,如果查詢無結果,返回Collections.emptyList()空集合對象,調用方一旦進行了添加元素的操作,就會觸發UnsupportedOperationException異常。

5. 【強制】ArrayList的subList結果不可強轉成ArrayList,否則會拋出ClassCastException異常:java.util.RandomAccessSubList cannot be cast to java.util.ArrayList ;

說明: subList 返回的是 ArrayList 的內部類 SubList,並不是 ArrayList ,而是 ArrayList 的一個視圖,對於SubList子列表的所有操作最終會反映到原列表上。

6. 【強制】在subList場景中,高度注意對父集合元素的增加或刪除,均會導致子列表的遍歷、增加、刪除產生ConcurrentModificationException 異常。
說明: 抽查表明,九成的開發同學對此知識點都有錯誤的認知。

7. 【強制】使用集合轉數組的方法,必須使用集合的toArray(T[] array),傳入的是類型完全一致、長度為0的空數組。

反例:直接使用toArray無參方法存在問題,此方法返回值只能是Object[]類,若強轉其它類型數組將出現ClassCastException錯誤。

正例:

List<String> list = new ArrayList<>(2);
list.add("guan");
list.add("bao");
array = list.toArray(new String[0]);

說明:使用toArray帶參方法,數組空間大小的length:
1)等於0,動態創建與size相同的數組,性能最好。
2)大於0但小於size,重新創建大小等於size的數組,增加GC負擔。
3)等於size,在高併發情況下,數組創建完成之後,size正在變大的情況下,負面影響與2相同。
4)大於size,空間浪費,且在size處插入null值,存在NPE隱患。

8. 【強制】在使用Collection接口任何實現類的addAll()方法時,都要對輸入的集合參數進行NPE判斷。

說明:在ArrayList#addAll方法的第一行代碼即Object[] a = c.toArray(); 其中c為輸入集合參數,如果為null,則直接拋出異常。

9. 【強制】使用工具類Arrays.asList()把數組轉換成集合時,不能使用其修改集合相關的方法,它的add/remove/clear方法會拋出UnsupportedOperationException異常。

說明:asList的返回對象是一個Arrays內部類,並沒有實現集合的修改方法。Arrays.asList體現的是適配器模式,只是轉換接口,後臺的數據仍是數組。
String[] str = new String[] { "a", "b" };
List list = Arrays.asList(str);
第一種情況:list.add("c"); 運行時異常。
第二種情況:str[0]= "changed"; 那麼list.get(0)也會隨之修改,反之亦然。

10. 【強制】泛型通配符<? extends T>來接收返回的數據,此寫法的泛型集合不能使用add方法,而<? super T>不能使用get方法,兩者在接口調用賦值的場景中易出錯。

說明:擴展說一下PECS (Producer Extends Consumer Super)原則:第一、頻繁往外讀取內容的,適合用<? extends T>。第二、經常往裡插入的,適合用<? super T>。

今日作業

Map類集合key/value能不能存儲null以及是否線程安全,下面描述哪個不正確的?說說為什麼?

a)Hashtable,不允許key為null,不允許value為null,線程安全

b)ConcurrentHashMap,不允許key為null,不允許value為null,線程安全

c)TreeMap,允許key為null,允許value為null,線程安全

d)HashMap,允許key為null,允許value為null,線程不安全

同學們請把作業寫在評論區裡,如果出現了優秀作業,將再給該同學送出額外的禮品!明天的打卡頁將公佈答案。

上期答案

(4.26日公佈)

點擊此處回到Java開發手冊專題頁

Leave a Reply

Your email address will not be published. Required fields are marked *