阿里Java編程規約(集合)

【強制】關于 hashCode equals 的處理,遵循如下規則:

1 只要覆寫 equals,就必須覆寫 hashCode

2 因為 Set 存儲的是不重復的對象,依據 hashCode equals 進行判斷,所以 Set 存儲的對象必須覆

寫這兩個方法。

3 如果自定義對象作為 Map 的鍵,那么必須覆寫 hashCode equals

說明:String 已覆寫 hashCode equals 方法,所以我們可以愉快地使用 String 對象作為 key 來使用。

【強制】ArrayList subList 結果不可強轉成 ArrayList,否則會拋出 ClassCastException

常,即 java.util.RandomAccessSubList cannot be cast to java.util.ArrayList

說明:subList 返回的是 ArrayList 的內部類 SubList,并不是 ArrayList 而是 ArrayList 的一個視圖,對

SubList 子列表的所有操作最終會反映到原列表上。

【強制】使用 Map 的方法 keySet()/values()/entrySet()返回集合對象時,不可以對其進行添

加元素操作,否則會拋出 UnsupportedOperationException 異常。

【強制】Collections 類返回的對象,如:emptyList()/singletonList()等都是 immutable

list,不可對其進行添加或者刪除元素的操作。

反例:如果查詢無結果,返回 Collections.emptyList()空集合對象,調用方一旦進行了添加元素的操作,就

會觸發 UnsupportedOperationException 異常。

【強制】 subList 場景中,高度注意對原集合元素的增加或刪除,均會導致子列表的遍

歷、增加、刪除產生 ConcurrentModificationException 異常。

【強制】使用集合轉數組的方法,必須使用集合的 toArray(T[] array),傳入的是類型完全一

致、長度為 0 的空數組。

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

ClassCastException 錯誤。

正例:

List<String> list = new ArrayList<>(2);

list.add("guan"); list.add("bao");

String[] array = list.toArray(new String[0]);

說明:使用 toArray 帶參方法,數組空間大小的 length

1 等于 0,動態創建與 size 相同的數組,性能最好。

2 大于 0 但小于 size,重新創建大小等于 size 的數組,增加 GC 負擔。

3 等于 size,在高并發情況下,數組創建完成之后,size 正在變大的情況下,負面影響與上相同。

4 大于 size,空間浪費,且在 size 處插入 null 值,存在 NPE 隱患。

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

NPE 判斷。

說明: ArrayList#addAll 方法的第一行代碼即 Object[] a = c.toArray(); 其中 c 為輸入集合參數,如果

null,則直接拋出異常。

【強制】使用工具類 Arrays.asList()把數組轉換成集合時,不能使用其修改集合相關的方

法,它的 add/remove/clear 方法會拋出 UnsupportedOperationException 異常。

說明:asList 的返回對象是一個 Arrays 內部類,并沒有實現集合的修改方法。Arrays.asList 體現的是適

配器模式,只是轉換接口,后臺的數據仍是數組。

String[] str = new String[] { "yang", "hao" };

List list = Arrays.asList(str);

第一種情況:list.add("yangguanbao"); 運行時異常。

第二種情況:str[0] = "changed"; 也會隨之修改,反之亦然。

【強制】在無泛型限制定義的集合賦值給泛型限制的集合時,在使用集合元素時,需要進行

instanceof 判斷,避免拋出 ClassCastException 異常。

說明:畢竟泛型是在 JDK5 后才出現,考慮到向前兼容,編譯器是允許非泛型集合與泛型集合互相賦值。

反例:

List<String> generics = null;

List notGenerics = new ArrayList(10);

notGenerics.add(new Object());

notGenerics.add(new Integer(1));

generics = notGenerics;

// 此處拋出 ClassCastException 異常 String string = generics.get(0);

【強制】不要在 foreach 循環里進行元素的 remove/add 操作。remove 元素請使用

Iterator 方式,如果并發操作,需要對 Iterator 對象加鎖。

正例:

List<String> list = new ArrayList<>();

list.add("1"); list.add("2");

Iterator<String> iterator = list.iterator();

while (iterator.hasNext()) {

String item = iterator.next(); if (刪除元素的條件) {

iterator.remove(); }

}

反例:

for (String item : list) {

if ("1".equals(item)) {

list.remove(item); }

}

說明:以上代碼的執行結果肯定會出乎大家的意料,那么試一下把“1”換成“2”,會是同樣的結果嗎?

【強制】 JDK7 版本及以上,Comparator 實現類要滿足如下三個條件,不然 Arrays.sort

Collections.sort 會拋 IllegalArgumentException 異常。

說明:三個條件如下

1 xy 的比較結果和 yx 的比較結果相反。

2 x>yy>z,則 x>z

3 x=y,則 xz 比較結果和 yz 比較結果相同。

反例:下例中沒有處理相等的情況,交換兩個對象判斷結果并不互反,不符合第一個條件,在實際使用中

可能會出現異常。

new Comparator<Student>() {

?@Override

public int compare(Student o1, Student o2) {

return o1.getId() > o2.getId() ? 1 : -1; }

};

【推薦】集合泛型定義時,在 JDK7 及以上,使用 diamond 語法或全省略。

說明:菱形泛型,即 diamond,直接使用<>來指代前邊已經指定的類型。

正例:

// diamond 方式,即<>

HashMap<String, String> userCache = new HashMap<>(16); // 全省略方式

ArrayList<User> users = new ArrayList(10);

【推薦】集合初始化時,指定集合初始值大小。

說明:HashMap 使用 HashMap(int initialCapacity) 初始化。

正例:initialCapacity = (需要存儲的元素個數 / 負載因子) + 1。注意負載因子(即 loader factor)默認

0.75,如果暫時無法確定初始值大小,請設置為 16(即默認值)。

反例:HashMap 需要放置 1024 個元素,由于沒有設置容量初始大小,隨著元素不斷增加,容量 7 次被

迫擴大,resize 需要重建 hash 表,嚴重影響性能。

【推薦】使用 entrySet 遍歷 Map 類集合 KV,而不是 keySet 方式進行遍歷。

說明:keySet 其實是遍歷了 2 次,一次是轉為 Iterator 對象,另一次是從 hashMap 中取出 key 所對應

value。而 entrySet 只是遍歷了一次就把 key value 都放到了 entry 中,效率更高。如果是 JDK8

使用 Map.forEach 方法。

正例:values()返回的是 V 值集合,是一個 list 集合對象;keySet()返回的是 K 值集合,是一個 Set 集合

對象;entrySet()返回的是 K-V 值組合集合。

【推薦】高度注意 Map 類集合 K/V 能不能存儲 null 值的情況,如下表格:

反例:由于 HashMap 的干擾,很多人認為 ConcurrentHashMap 是可以置入 null 值,而事實上,存儲

null 值時會拋出 NPE 異常。

【參考】合理利用好集合的有序性(sort)和穩定性(order),避免集合的無序性(unsort)和不穩

定性(unorder)帶來的負面影響

說明:有序性是指遍歷的結果是按某種比較規則依次排列的。穩定性指集合每次遍歷的元素次序是一定

的。如:ArrayList order/unsortHashMap unorder/unsortTreeSet order/sort

【參考】利用 Set 元素唯一的特性,可以快速對一個集合進行去重操作,避免使用 List

contains 方法進行遍歷、對比、去重操作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445281.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445281.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445281.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Pytorch(3)-數據載入接口:Dataloader、datasets

pytorch數據載入1.數據載入概況Dataloader 是啥2.支持的三類數據集2.1 torchvision.datasets.xxx2.2 torchvision.datasets.ImageFolder2.3 寫自己的數據類&#xff0c;讀入定制化數據2.3.1 數據類的編寫map-style范式iterable-style 范式2.3.2 DataLoader 導入數據類1.數據載入…

阿里Java編程規約(控制語句)

【強制】在一個 switch 塊內&#xff0c;每個 case 要么通過 continue/break/return 等來終止&#xff0c;要么 注釋說明程序將繼續執行到哪一個 case 為止&#xff1b;在一個 switch 塊內&#xff0c;都必須包含一個 default 語句并且放在最后&#xff0c;即使它什么代碼也沒…

大數據學習(5)-- NoSQL數據庫

文章目錄目錄1.NoSQL的介紹2.NoSQL產生的原因2.1 web2.02.2 NoSQL興起原因3.NoSQL和關系數據庫的區別4.NoSQL的四大類型4.1 鍵值數據庫4.2 列族數據庫4.3 文檔數據庫4.4 圖形數據庫4.5 不同類型的NoSQL數據庫進行比較5.NoSQL的三大基石5.1 CAP5.2 base5.3 最終一致性6.從NoSQL到…

經典算法重點總結

文章目錄排序算法冒泡排序直接插入排序希爾排序直接選擇排序快速排序堆排序歸并排序總結查找算法順序查找二分查找插值查找斐波那契查找樹表查找分塊查找哈希查找總結排序算法 冒泡排序 void bubbleSort(int a[] , int n){for(int i n-1 ; i > 0 ; i--){for(int j 0 ; j …

Python(18)-字典dictionary、集合

Python高級數據類型-字典1.字典的定義2.字典的基本操作:查詢&#xff0c;增加&#xff0c;修改&#xff0c;獲取3.字典的統計、合并、清空4.字典的循環遍歷5.返回最大“值”對應的“鍵”6.應用場景pop(key)7.集合字典是除了列表之外最靈活的數據類型&#xff0c;用來描述一個物…

redis——Redis中的LRU算法改進

redis通常使用緩存&#xff0c;是使用一種固定最大內存的使用。當數據達到可使用的最大固定內存時&#xff0c;我們需要通過移除老數據來獲取空間。redis作為緩存是否有效的重要標志是如何尋找一種好的策略&#xff1a;刪除即將需要使用的數據是一種糟糕的策略&#xff0c;而刪…

redis——HyperLogLog

HyperLogLog 是一種概率數據結構&#xff0c;用來估算數據的基數。數據集可以是網站訪客的 IP 地址&#xff0c;E-mail 郵箱或者用戶 ID。 基數就是指一個集合中不同值的數目&#xff0c;比如 a, b, c, d 的基數就是 4&#xff0c;a, b, c, d, a 的基數還是 4。雖然 a 出現兩次…

機器學習知識總結系列-機器學習中的優化算法總結(1-4)

文章目錄1.梯度下降1.1批量梯度下降(BGD)1.2隨機梯度下降&#xff08;SGD&#xff09;1.3 小批量隨機梯度下降&#xff08;MSGD&#xff09;1.4 比較&#xff1a;1.5 動量算法&#xff08;momentum&#xff09;1.6 Nestrov Momentum2. 自適應方法2.1 自適應學習率算法&#xff…

Python(19)-字符串、Unicode字符串

高級數據類型--字符串、Unicode字符串1.字符串的定義2.字符串的長度、計數、Index3.字符串常用方法3.1判斷類型3.2查找和替換3.3文本對齊3.4去除空白字符.strip()4.字符串的拆分和拼接5.字符串的切片6.跨行字符串7.包含轉義字符r8.字符串的分割與連接9.Unicode字符串字符串-不變…

機器學習中的距離和損失函數

文章目錄13.1 距離度量13.2 損失函數13.1 距離度量 距離函數種類&#xff1a;歐式距離、曼哈頓距離、明式距離&#xff08;閔可夫斯基距離&#xff09;、馬氏距離、切比雪夫距離、標準化歐式距離、漢明距離、夾角余弦等常用距離函數&#xff1a;歐式距離、馬氏距離、曼哈頓距離…

Python(20)-高級數據類型的公共方法

高級數據類型的公共方法1內置函數2高級數據類型切片3運算符&#xff0c;*&#xff0c;in4完整的for循環公共方法是列表&#xff0c;元組&#xff0c;字典&#xff0c;字符串都能使用的方法1內置函數 內置函數&#xff1a;不需要import導入模塊&#xff0c;就可以直接使用的函數…

redis——為什么選擇了跳表而不是紅黑樹?

跳表是個啥東西請看這個文章。 我們知道&#xff0c;節點插入時隨機出一個層數&#xff0c;僅僅依靠一個簡單的隨機數操作而構建出來的多層鏈表結構&#xff0c;能保證它有一個良好的查找性能嗎&#xff1f;為了回答這個疑問&#xff0c;我們需要分析skiplist的統計性能。 在…

機器學習公式推導

文章目錄線性回歸邏輯回歸線性判別分析PCAk-means決策樹svm隨機深林GBDTxgboost強化學習MapReduce線性回歸 邏輯回歸 對于分類問題&#xff1a;輸出0/1&#xff0c;超過[0,1]沒有意義&#xff0c;使用sigmoid函數 **代價函數&#xff1a;**使用L2平方差&#xff0c;由于模型函…

Python綜合應用(1)--名片管理系統開發

第一個綜合應用-名片管理系統1框架搭建2完善功能綜合應用&#xff0c;名片管理系統 歡迎界面&#xff0c;不同選項&#xff0c;1.新建名片&#xff0c;2.顯示全部&#xff0c;3 查詢名片&#xff08;查到之后可以修改名片信息&#xff09;&#xff0c;0 退出系統 程序開發流程…

springboot1——spring相關入門

spring 隨著我們開發&#xff0c;發現了一個問題&#xff1a; A---->B---->C---->D 在A中創建B的對象調用B的資源 在B中創建C的對象調用C的資源 在C中創建D的對象調用…

大數據學習(06)-- 云數據庫

文章目錄目錄1.什么是云數據庫&#xff1f;1.1 云計算和云數據庫的關系1.2 云數據庫的概念1.3 云數據庫的特性1.4 云數據庫應用場景1.5 云數據庫和其他數據的關系2.云數據庫產品有哪些&#xff1f;2.1 云數據庫廠商概述2.2 亞馬遜云數據庫產品2.3 Google云數據庫產品2.4 微軟云…

Python(21)--變量進階

變量的進階使用1變量引用2可變、不可變數據類型3局部變量和全局變量4.Tips本系列博文來自學習《Python基礎視頻教程》筆記整理&#xff0c;視屏教程連接地址&#xff1a;http://yun.itheima.com/course/273.html在博文&#xff1a;https://blog.csdn.net/sinat_40624829/articl…

HTTP 響應代碼全集

HTTP 響應狀態代碼指示特定 http 請求是否已成功完成。響應分為五類&#xff1a;信息響應(100–199)&#xff0c;成功響應(200–299)&#xff0c;重定向(300–399)&#xff0c;客戶端錯誤(400–499)和服務器錯誤 (500–599)。狀態代碼由 section 10 of RFC 2616定義 信息響應 …

機器學習知識總結系列-機器學習中的數學-矩陣(1-3-2)

矩陣 SVD 矩陣的乘法狀態轉移矩陣狀態轉移矩陣特征值和特征向量 對稱陣 正交陣 正定陣數據白化矩陣求導 向量對向量求導 標量對向量求導 標量對矩陣求導一.矩陣1.1 SVD奇異值分解&#xff08;Singular Value Decomposition&#xff09;&#xff0c;假設A是一個mn階矩陣&#xf…

阿里Java編程規約(注釋)提煉

【強制】類、類屬性、類方法的注釋必須使用 Javadoc 規范&#xff0c;使用/**內容*/格式&#xff0c;不得使用 // xxx 方式。 說明&#xff1a;在 IDE 編輯窗口中&#xff0c;Javadoc 方式會提示相關注釋&#xff0c;生成 Javadoc 可以正確輸出相應注釋&#xff1b;在 IDE 中…