Java集合之Vector源碼分析

来源:https://www.cnblogs.com/hujingnb/archive/2019/01/02/10181577.html
-Advertisement-
Play Games

概述 Vector與ArrayLIst類似, 內部同樣維護一個數組, Vector是線程安全的. 方法與ArrayList大體一致, 只是加上 synchronized 關鍵字, 保證線程安全, 下麵就不具體分析源碼了, 具體可以查看ArrayList中的源碼分析. Vector源碼分析 1.主要字 ...


概述

Vector與ArrayLIst類似, 內部同樣維護一個數組, Vector是線程安全的. 方法與ArrayList大體一致, 只是加上 synchronized 關鍵字, 保證線程安全, 下麵就不具體分析源碼了, 具體可以查看ArrayList中的源碼分析.

Vector源碼分析

1.主要欄位

Java集合之Vector

 

2.構造函數

Java集合之Vector

 

Java集合之Vector

 

3.增刪改查

Java集合之Vector

 

其他方法大部分類似, 不再贅述, 下麵看下擴容機制的函數:

Java集合之Vector

 

Java集合之Vector

 

Vector與ArrayList的區別

  1. Vector是線程安全的, ArrayList不是線程安全的, 這是最主要的
  2. ArrayList不可以設置擴展的容量, 預設1.5倍; Vector可以設置, 預設2倍
  3. ArrayList無參構造函數中初始量為0; Vector的無參構造函數初始容量為10

Vector與Collections.synchronizedList

Vector是java.util包中的一個類。 SynchronizedList是java.util.Collections中的一個靜態內部類。

在多線程的場景中可以直接使用Vector類,也可以使用Collections.synchronizedList(List list)方法來返回一個線程安全的List。

那麼,到底SynchronizedList和Vector有沒有區別,為什麼java api要提供這兩種線程安全的List的實現方式呢?

以下看 synchronizedList 部分源碼:

Java集合之Vector

 

Java集合之Vector

 

Java集合之Vector

 

Java集合之Vector

 

Java集合之Vector

 

從代碼中, 我們可以看出:

  1. Vector使用同步方法實現, synchronizedList使用同步代碼塊實現
  2. 兩者的擴容數組容量方式不一樣(兩者在擴容方面的差別就是ArrayList和Vector的差別)

但是, SynchronizedList中 listlterator方法並沒有做同步處理, 但是在Vector卻對該方法加了方法鎖. 所以, 在使用SynchronizedList進行遍歷的時候要手動加鎖.

Java集合之Vector

 

但是之後的但是, 如果想要把LinkedList變成線程安全的, 那麼我們可以將已有的LinkedList直接轉成SynchronizedList, 而不用改變它的底層數據結構, 這一點是Vector無法做到的, 因為Vector底層結構是使用數組的, 這一點是無法更改的.

總結兩者區別如下:

  1. SynchronizedList有很好的擴展和相容功能, 可以將所有的List子類轉成線程安全的類
  2. 使用SynchronizedList在遍歷的時候要手動進行同步處理
  3. SynchronizedList可以指定鎖對象

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在軟體開發領域中,人們經常會用到這一個概念——“設計模式”(design pattern),它是一種針對軟體設計的共性問題而提出的解決方案。在一本聖經級的書籍《設計模式:可復用面向對象軟體的基礎》(1991年,Design Patterns - Elements of Reusable Object ...
  • `synchronized java 同步`的關鍵字,其典型的作用域如下所示. 1 對象鎖 1.1 代碼塊修飾(對象) 此時, 用於保證 函數中的被 大括弧包裹的代碼同步執行. 作用的對象為 的對象實例,例如 函數中的 以及 . Tips: 1. 若在多個線程中被調用,其輸出順序將保證同步,按照 的 ...
  • Django 為大家提供了一個完善的後臺管理系統—admin,但是這個後臺管理系統總體來說不太適合國人的習慣,所以有大神就使用 bootstrap 和 jQuery,為我們開發了一個第三 方的 Django 後臺管理系統—xadmin,這個界面的友好度比較高,目前企業的使用頻率比較高,我們來學習一些 ...
  • 標準輸入對話框(QInputDialog)系列: 主要模塊 效果如下: 完整代碼: 打開文件(QFileDialog)、顏色(QColorDialog)、字體(QFontDialog)對話框 效果如下: 參考: https://zhuanlan.zhihu.com/p/29321561 完整代碼: ...
  • 題意 "題目鏈接" Sol 介紹一種神奇的點分治的做法 啥?這都有根樹了怎麼點分治?? 嘿嘿,這道題的點分治不同於一般的點分治。正常的點分治思路大概是先統計過重心的,再遞歸下去 實際上一般的點分治與統計順序關係不大,也就是說我可以先統計再遞歸,或者先遞歸再統計。 但是這題不單單是統計,它是dp,存在 ...
  • 一、ORM簡介 MVC和MTV框架中包含一個重要部分,就是ORM,它實現了數據模型與資料庫的解耦,即數據模型的設計不需要依賴於特定的資料庫,通過簡單的配置就可以輕鬆更換資料庫。 ORM是‘對象-關係-映射’的簡稱 #sql中的表 #創建表: CREATE TABLE employee( id INT ...
  • 1.編譯型解釋型語言區別: 編譯型:一次性將全部代碼編譯成二進位文件,代表c,c++ 優點:執行效率高 缺點:開發速度慢,不能跨平臺 解釋型:當程式運行時,從上至下一行一行執行,解釋成二進位去執行 優點:開發速度快,效率高,可以跨平臺 缺點:運行效率低 2.python2和python3區別: py ...
  • 概述 LinkedLIst和ArrayLIst一樣, 都實現了List介面, 但其內部的數據結構不同, LinkedList是基於鏈表實現的(從名字也能看出來), 隨機訪問效率要比ArrayList差. 它的插入和刪除操作比ArrayList更加高效, 但還是要遍歷部分鏈表的指針才能移動到下標所指的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...