那些年踩過的坑之Arrays.asList

一、前言

? ? ? ? 熟悉開發的兄弟都知道,在寫新增和刪除功能的時候,大多數時候會寫成批量的,原因也很簡單,批量既支持單個也支持多個對象的操作,事情也是發生在這個批量方法的調用上,下面我簡單說一下這個事情。

二、場景描述

? ? ? ? 批量方法的參數可能是一個list集合,里面存放了多個待操作的數據,這是批量方法。當我們操作單個對象的時候,也需要調用批量,那傳參的時候,就涉及到把單個對象封裝成集合,那么封裝的方式有幾種,我下邊羅列一下。

    @Testpublic void listTest(){String code = "ITEM-001";//方式1batchOperate(Arrays.asList(code));//方式2batchOperate(Collections.singletonList(code));//方式3batchOperate(CollectionUtil.newArrayList(code));}

? ? ? ? 我羅列了3種方式,但是我見過最多的就是使用第一種方式Arrays.asList(code),如果用了第一種的話,此時IDEA會給個小黃標提示,有點代碼潔癖的人,會按照IDEA推薦的方式進行進一步修改,也就是我們第二種方式Collections.singletonList(code)。

? ? ? ? 對于我個人來說,我推薦用第三種,而且我本人也是使用第三種傳參方式,下面我們運行一下代碼,首先我們來看一下第一種傳參方式。

? ? ? ? 通過運行代碼,居然報add方法報錯,是不是腦瓜子嗡嗡的?我們打個斷點看一下,如下圖所示,我們發現此時進行add方法的list是不是有點奇怪,不是我們常見的java.util下的ArrayList呀,為了更清晰,我們再深入一下,看看Arrays.asList是怎么一回事。

? ? ? ? 進入到Arrays源碼中,我們看到此ArrayList非彼ArrayList,而是Arrays的一個內部類,而且再仔細看看,發現這個內部類中居然沒有add方法,但是確真真實實調用了add方法,它沒有的話,應該是它所繼承的父類中有add方法,我們繼續進入到父類AbstractList中一探究竟。

? ? ? ? 在AbstractList中,我們終于把add方法給揪出來了,從截圖中可以看到,add方法中直接拋出了throw new UnsupportedOperationException(),這也就解釋了為什么在調用add方法的時候報錯了。

? ? ? ? 來我們繼續再看下一個Collections.singletonList(code)是怎么個情況

? ? ? ? 果然,也報錯了,而且報的錯都一樣,那么原因和剛才也大差不差。我們再點進去看看源碼是什么樣的。

? ? ? ? 通過截圖,我們可以看到,SingletonList也是Collections的一個內部類,而且也沒有add方法,并且也繼承自AbstractList,這時候就很明確了,調用add方法就會直接報錯。我們順便再看看其他的操作方法(如下圖所示),基本上也都是報錯,說明繼承自AbstractList的子類是不允許對集合進行操作的。

? ? ? ? 最后再看一下小永哥的選擇測試結果會怎么樣(希望不會翻車......)

? ? ? ? 通過測試截圖可以看到,沒毛病,情況我們就分析到這里了。日常開發過程中應該用哪一種我想現在已經很明確了。

三、焦點訪談

? ? ? ? T哥:小永哥,有沒有人說你很裝呢?

? ? ? ? 小永哥:好像除了你之外,還沒有。

? ? ? ? T哥:你說的這三種傳參有什么意義嗎?隨便一種都行吧,像你說的那種情況基本上不可能發生。

? ? ? ? 小永哥:你說的有你的道理,但是誰能保證自己調用的方法都是自己寫的,絕對安全可靠,我把參數傳過去,人家想這么處理,完全不是我能控制的,但是因為傳參的問題導致了報錯,是不是得排查,為什么能一次性搞定的東西,要繼續浪費時間和精力去處理呢?

? ? ? ? T哥,這次算你有道理.........

四、結語

? ? ? ? 我分享的這些絕不是為了裝,像這種看似簡單,但是平時不常見的錯誤,解決不也得花時間嗎,如果是生產環境報錯,那排查、定位、解決花費的時間更多,有這功夫,我們摸會魚,喝點咖啡它不香嘛。

????????今天就分享到這里,謝謝大家,晚安。

????????

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

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

相關文章

通過VIN車輛識別代碼查詢_精準版API,獲取車輛精準參數

通過17位VIN碼的精準匹配,幫助用戶快速獲取車輛的品牌、型號、出廠日期、排量、外觀、車輛型號等詳細參數。這一API廣泛應用于二手車交易、車輛租賃、配件采購和車輛維修等領域,為用戶提供一個高效、準確的解決方案。 代碼示例 返回格式:js…

Virtuoso ADE采用Spectre仿真中出現MOS管最小長寬比滿足要求依然報錯的情況解決方法

在ADE仿真中錯誤問題如下: ERROR (CMI-2440): "xxx.scs" 46338: I2.M1: The length, width, or area of the instance does not fit the given lmax-lmin, wmax-wmin, or areamax-areamin range for any model in the I2.M3.nch_hvt group. The channel w…

LeetCode hot 100—最長有效括號

題目 給你一個只包含 ( 和 ) 的字符串,找出最長有效(格式正確且連續)括號子串的長度。 示例 示例 1: 輸入:s "(()" 輸出:2 解釋:最長有效括號子串是 "()"示例 2&#xf…

Vue3集成sass

安裝依賴 pnpm add -D sass-embedded配置全局變量 新建文件 src/styles/variables.scss配置Vite 修改 vite.config.ts variables.scss $base-color: bluevite.config.ts // https://vite.dev/config/ export default defineConfig({plugins: [vue(),],resolve: {alias: {:…

【力扣題目分享】棧專題(C++)

目錄 關于棧的題目: 1. 最小棧: 思路: 實現代碼(最終): 2. 棧的壓入、彈出序列: 思路: 實現代碼: 3. 逆波蘭表達式求值: 思路: 實現代碼: 深入了解…

Office 2019 (含Visio+Project)官方IOS 下載

Microsoft Office 2019 是微軟公司推出的一款辦公軟件套裝, 主要包括Word、Excel、PowerPoint、Outlook、Visio、Access、Publisher、OneDrive for Business 和Skype for Business等組件。 這些組件適用于Windows和MacOS平臺,支持多種語言&#xff0c…

遙測終端機,推動灌區流量監測向數據驅動躍遷

灌區范圍那么大,每一滴水怎么流都關系到糧食夠不夠吃,還有生態能不能平衡。過去靠人工巡查、測量,就像拿著算盤想算明白大數據,根本滿足不了現在水利管理的高要求。遙測終端機一出現,就像給灌區流量監測安上了智能感知…

P4017 最大食物鏈計數-拓撲排序

P4017 最大食物鏈計數 題目來源-洛谷 題意 要求最長食物鏈的數量。按照題意,最長食物鏈就是指有向無環圖DAG中入度為0到出度為0的不同路徑的數量(鏈數) 思路 在計算時,明顯:一個被捕食者所…

Xmind快捷鍵大全

常規 插入主題和元素(常用) 編輯主題文本和樣式 選擇和移動 調整畫布和視圖 工具和其他

四. 以Annoy算法建樹的方式聚類清洗圖像數據集,一次建樹,無限次聚類搜索,提升聚類搜索效率。(附完整代碼)

文章內容結構: 一. 先介紹什么是Annoy算法。 二. 用Annoy算法建樹的完整代碼。 三. 用Annoy建樹后的樹特征匹配聚類歸類圖像。 一. 先介紹什么是Annoy算法 下面的文章鏈接將Annoy算法講解的很詳細,這里就不再做過多原理的分析了,想詳細了解…

什么是電容?

什么是電容? 電荷與電壓的比值就是電容量C。電容單位為法拉(F)。1法拉電容器在電壓為1V時儲存的電荷量為1庫倫(C)。圖1.1中的球體表面電壓與儲存的電荷Q關聯。電壓V等于。Q/V等于。如果球體位于電介質媒介中,電壓V降低倍,Q/V等于。在電介質媒…

Linux服務器上mysql8.0+數據庫優化

1.配置文件路徑 /etc/my.cnf # CentOS/RHEL /etc/mysql/my.cnf # Debian/Ubuntu /etc/mysql/mysql.conf.d/mysqld.cnf # Ubuntu/Debian檢查當前配置文件 sudo grep -v "^#" /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v "^$&q…

MQTT學習資源

MQTT入門:強烈推薦

第十二章 Python語言-大數據分析PySpark(終)

目錄 一. PySpark前言介紹 二.基礎準備 三.數據輸入 四.數據計算 1.數據計算-map方法 2.數據計算-flatMap算子 3.數據計算-reduceByKey方法 4.數據計算-filter方法 5.數據計算-distinct方法 6.數據計算-sortBy方法 五.數據輸出 1.輸出Python對象 (1&am…

【XR手柄交互】Unity 中使用 InputActions 實現手柄控制詳解(基于 OpenXR + Unity新輸入系統(Input Actions))

摘要: 本文主要介紹如何使用 Input Actions(Unity 新輸入系統) OpenXR 來實現 VR手柄控制(監聽ABXY按鈕、搖桿、抓握等操作)。 🎮 Unity 中使用 InputActions 實現手柄控制詳解(基于 OpenXR 新…

java實現網格交易回測

以下是一個基于Java實現的簡單網格交易回測程序框架,以證券ETF(512880)為例。代碼包含歷史數據加載、網格策略邏輯和基礎統計指標: import java.io.BufferedReader; import java.io.FileReader; import java.text.ParseException…

探秘 3D 展廳之卓越優勢,解鎖沉浸式體驗新境界

(一)打破時空枷鎖,全球觸達? 3D 展廳的首要優勢便是打破了時空限制。在傳統展廳中,觀眾需要親臨現場,且必須在展廳開放的特定時間內參觀。而 3D 展廳依托互聯網,讓觀眾無論身處世界哪個角落,只…

第十二屆藍橋杯 2021 C/C++組 直線

目錄 題目: 題目描述: 題目鏈接: 思路: 核心思路: 兩點確定一條直線: 思路詳解: 代碼: 第一種方式代碼詳解: 第二種方式代碼詳解: 題目:…

微信小程序藍牙連接打印機打印單據完整Demo【藍牙小票打印】

文章目錄 一、準備工作1. 硬件準備2. 開發環境 二、小程序配置1. 修改app.json 三、完整代碼實現1. pages/index/index.wxml2. pages/index/index.wxss3. pages/index/index.js 四、ESC/POS指令說明五、測試流程六、常見問題解決七、進一步優化建議 下面我將提供一個完整的微信…

ubuntu opencv 安裝

1.ubuntu opencv 安裝 在Ubuntu系統中安裝OpenCV,可以通過多種方式進行,以下是一種常用的安裝方法,包括從源代碼編譯安裝。請注意,安裝步驟可能會因OpenCV的版本和Ubuntu系統的具體版本而略有不同。 一、安裝準備 更新系統&…