謹用ArrayList中的subList方法

謹用ArrayList中的subList方法

規范一:

  • ArrayList 的 subList 結果不可強轉成 ArrayList,否則會拋出 ClassCastException 異常:

  • public static void test7() {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);List<Integer> subList = list.subList(1, 3);System.out.println(subList);//2,3ArrayList<Integer> subList1 = (ArrayList<Integer>)list.subList(1, 3);//java.lang.ClassCastException: java.util.ArrayList$SubList cannot be cast to java.util.ArrayListSystem.out.println(subList1);}
    
  • 分析:

  • SubList 繼承 AbstractList ,所以具有List接口的所有方法。

  • SubList 是ArrayList 的一個內部類。SubList并沒有重新創建一個List,而是直接引用原有的List,只不過對原來List做截取而已。

  • ArrayList 也是繼承AbstractList,但是 SubList 和 ArrayList 沒有繼承關系,所以不能強轉換。

規范二:

  • 在 subList 場景中,高度注意對原集合元素的增加或刪除,均會導致子列表的遍歷、增加、刪除產生 ConcurrentModificationException 異常。

  • public static void test8() {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);List<Integer> subList = list.subList(1, 3);list.add(4);//java.util.ConcurrentModificationExceptionSystem.out.println(subList);}
    
  • 分析:

  • 調用subList方法返回的集合保存了ArrayList的modCount

  • 在這里插入圖片描述

  • 當對原list進行add/remove時,導致modCount++;

  • 訪問子集合時,加了checkForComodification();校驗

  • 在這里插入圖片描述

對subList返回的子集合進行add/remove操作會如何?

  • 我們來看一段代碼

  • public static void test9() {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);List<Integer> subList = list.subList(1, 3);System.out.println(list);//1,2,3System.out.println(subList);//2,3System.out.println("------------------------");subList.remove(0);System.out.println(list);//1,3System.out.println(subList);//3System.out.println("------------------------");subList.add(1,4);System.out.println(list);//1,3,4System.out.println(subList);//3,4}
    
  • 運行正常,分析:

  • 在這里插入圖片描述

  • subList返回的集合在調用add/remove方法時,會將modCount進行更新。注:更新操作只更新原集合,因為subList不會重新創建新集合。

總結:

  • subList 返回的是 ArrayList 的內部類 SubList,并不是 ArrayList 而是 ArrayList 的一個視圖,對于 SubList 子列表的所有操作最終會反映到原列表上。
  • 在 subList 場景中,高度注意對原集合元素的增加或刪除,均會導致子列表的遍歷、增加、刪除產生 ConcurrentModificationException 異常。

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

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

相關文章

JavaWeb—— SpringBootWeb綜合案例(登錄功能、登錄校驗、異常處理)

案例-登錄認證 目錄 案例-登錄認證1. 登錄功能1.1 需求1.2 接口文檔1.3 思路分析1.4 功能開發1.5 測試 2. 登錄校驗2.1 問題分析2.2 會話技術2.2.1 會話技術介紹2.2.2 會話跟蹤方案2.2.2.1 方案一 - Cookie2.2.2.2 方案二 - Session2.2.2.3 方案三 - 令牌技術 2.3 JWT令牌2.3.1…

程序員眼中的“祖傳代碼”

引言 在IT界&#xff0c;特別是在Java項目中&#xff0c;“祖傳代碼”通常指的是那些經過長時間積累、由多位開發者共同維護、且蘊含深厚技術沉淀的代碼片段或模塊。這些代碼可能存在于項目的核心模塊&#xff0c;也可能是一些輔助性的工具類。它們承載著項目的歷史&#xff0…

Matlab 多項式插值(曲線擬合)

文章目錄 一、簡介二、實現代碼三、實現效果參考資料一、簡介 由于對曲線擬合有些興趣,這里就找了一些資料從最基本的方法來看一下曲線擬合的效果: 二、實現代碼 % **********

Vue.js中的路由導航守衛和其使用方法

Vue.js 中的路由導航守衛是 Vue Router 提供的一套機制&#xff0c;用于在路由切換的過程中執行自定義代碼邏輯&#xff0c;包括但不限于權限驗證、頁面滾動位置保存、加載數據等。它分為三種類型&#xff1a; 全局前置守衛 (Global beforeEach Guard) 全局前置守衛應用在整個…

python科學計算庫之Numpy庫的使用的簡單習題

Numpy庫 Numpy&#xff08;Numerical Python的縮寫&#xff09;是一個開源的Python庫&#xff0c;用于進行科學計算。它提供了一個高性能的多維數組對象&#xff08;ndarray&#xff09;及用于處理這些數組的各種工具和函數。由于其高效和靈活的數據結構以及豐富的功能&#x…

Google 地圖 API 教程--干貨(1/2)

Google Maps API 教程 在本教程中我們將學習如何使用谷歌地圖API V3創建交互式地圖。 什么是 API? API = 應用程序編程接口(Application programming interface)。 API(Application Programming Interface,應用編程接口)其實就是操作系統留給應用程序的一個調用接口,…

【d34】【Java】【力扣】27. 移除元素

題目 給你一個數組 nums 和一個值 val&#xff0c;你需要 原地 移除所有數值等于 val 的元素&#xff0c;并返回移除后數組的新長度。 不要使用額外的數組空間&#xff0c;你必須僅使用 O(1) 額外空間并 原地 修改輸入數組。 元素的順序可以改變。你不需要考慮數組中超出新長…

案例介紹:汽車售后服務網絡構建與信息抽取技術應用(開源)

一、引言 在當今競爭激烈的汽車行業中&#xff0c;售后服務的質量已成為品牌成功的關鍵因素之一。作為一位經驗豐富的項目經理&#xff0c;我曾參與構建一個全面的汽車售后服務網絡&#xff0c;旨在為客戶提供無縫的維修、保養和配件更換服務。這個項目的核心目標是通過高效的…

spring、springmvc、springboot框架的介紹

前言 我們已經學過Spring&#xff0c;SpringMVC&#xff0c;SpringBoot了&#xff0c;那這三者之間有沒有聯系或者區別呢&#xff1f; spring是一個一站式的輕量級java開發的框架&#xff0c;那我們剛開始使用spring的時候&#xff0c;是需要配置很多的配置文件以及繁瑣的過程…

狀態機實現雙擊、短按、長按等按鍵識別檢測算法

1、按鍵識別算法的作用 按鍵識別算法在不同的技術和應用背景下有不同的作用&#xff0c;但其核心目標都是準確、可靠地檢測和區分用戶通過物理或虛擬按鍵所執行的操作。按鍵識別算法在各類電子設備及系統中起到至關重要的作用&#xff0c;它確保了人機交互的有效性和準確性&…

Vue前端+快速入門【詳解】

目錄 1.Vue概述 2. 快速入門 3. Vue指令 4.表格信息案例 5. 生命周期 1.Vue概述 1.MVVM思想 原始HTMLCSSJavaScript開發存在的問題&#xff1a;操作麻煩&#xff0c;耦合性強 為了實現html標簽與數據的解耦&#xff0c;前端開發中提供了MVVM思想&#xff1a;即Model-Vi…

Mysql-主從架構篇(一主多從,半同步案例搭建)

主從架構 主從架構有什么用&#xff1f; 通過搭建MySQL主從集群&#xff0c;可以緩解MySQL的數據存儲以及訪問的壓力。 數據安全&#xff08;主備&#xff09;&#xff1a;給主服務增加一個數據備份。基于這個目的&#xff0c;可以搭建主從架構&#xff0c;或者也可以基于主…

GO語言學習筆記(與Java的比較學習)(九)

讀寫數據 讀取用戶的輸入 最簡單的辦法是使用 fmt 包提供的 Scan 和 Sscan 開頭的函數。 Scanln 掃描來自標準輸入的文本&#xff0c;將空格分隔的值依次存放到后續的參數內&#xff0c;直到碰到換行。Scanf 與其類似&#xff0c;除了 Scanf 的第一個參數用作格式字符串&…

大數據開發(Java面試真題-卷三)

大數據開發&#xff08;Java面試真題&#xff09; 1、簡要介紹以下JVM有幾種垃圾收集器&#xff1f;2、Java中Synchronized的底層原理是什么&#xff1f;3、Java String為什么是不可變的&#xff1f;為什么要設計成不可變&#xff1f;4、泛型&#xff1f;5、常用的反射方法&…

深入Java日志框架及其最佳實踐

概述 在Java應用開發中&#xff0c;日志框架是確保應用穩定性和可觀察性的關鍵組件。它幫助開發者記錄應用的行為、診斷問題&#xff0c;并監控系統的健康狀況。隨著Java生態系統的不斷發展&#xff0c;各種日志框架也應運而生&#xff0c;各有特點和優勢。本文將詳細探討幾個…

redis進階(一)

文章目錄 前言一、Redis中的對象的結構體如下&#xff1a;二、壓縮鏈表三、跳躍表 前言 Redis是一種key/value型數據庫&#xff0c;其中&#xff0c;每個key和value都是使用對象表示的。 一、Redis中的對象的結構體如下&#xff1a; /** Redis 對象*/ typedef struct redisO…

c# .net8 香橙派orangepi + hc-04藍牙 實例

這些使用c# .net8開發&#xff0c;硬件 香橙派 orangepi 3lts和 hc-04藍牙 使用場景&#xff1a;可以通過這個功能&#xff0c;手機連接orangepi進行wifi等參數配置 硬件&#xff1a; 1、帶USB口的linux開發板orangepi 2、USB 轉TTL 中轉接藍牙&#xff08;HC-04) 某寶上買…

Vue的響應式原理是如何實現的

Vue的響應式原理主要**基于JavaScript的Object.defineProperty方法實現**。具體如下&#xff1a; 1. 數據劫持&#xff08;Data Hijacking&#xff09; Vue在初始化時&#xff0c;會遍歷data對象中的所有屬性&#xff0c;并使用Object.defineProperty將這些屬性轉換為getter/s…

Flink:Temporal Table Function(時態表函數)和 Temporal Join

博主歷時三年精心創作的《大數據平臺架構與原型實現&#xff1a;數據中臺建設實戰》一書現已由知名IT圖書品牌電子工業出版社博文視點出版發行&#xff0c;點擊《重磅推薦&#xff1a;建大數據平臺太難了&#xff01;給我發個工程原型吧&#xff01;》了解圖書詳情&#xff0c;…

AR時間序列模型

AR時間序列模型&#xff08;AutoRegressive Time Series Model&#xff09;是一種用于分析和預測時間序列數據的統計模型。該模型假設未來的觀測值與過去的觀測值相關&#xff0c;且該相關性可以通過線性回歸來描述。 AR模型的基本思想是將當前時刻的觀測值表示為過去幾個時刻…