List、LinkedList、ArrayList、Vector

来源:https://www.cnblogs.com/JamesWang1993/archive/2018/01/20/8321494.html
-Advertisement-
Play Games

目前好像寫不出比較高質量的隨筆,除了多看看別人寫的,就是多寫,做好自己可以做的 最近聽的和看到的最多的一個詞就是“勿忘初心”。的確不少人到了一定高度之後,就不知道該怎麼做了。(包括我曾經的偶像娜姐,在得到法網冠軍之後,有很長一段時間都迷失了) 自己總結一下:人生到了某個層次或高度的時候,應該記得是什 ...


目前好像寫不出比較高質量的隨筆,除了多看看別人寫的,就是多寫,做好自己可以做的

最近聽的和看到的最多的一個詞就是“勿忘初心”。的確不少人到了一定高度之後,就不知道該怎麼做了。(包括我曾經的偶像娜姐,在得到法網冠軍之後,有很長一段時間都迷失了)

自己總結一下:人生到了某個層次或高度的時候,應該記得是什麼原因讓自己可以走到這個高度,而不是覺得自己應該做些什麼去適應這個高度。

當然,每個階段都有每個階段該做的和能做的事,這裡說的是要保持住讓自己前進的好品質。

在項目初期出現的問題:

在Java中,List是一個介面,LinkedList繼承了抽象類AbstractSequentialList實現了List介面(其中AbstractSequentialList類繼承 AbstractList類)

ArrayList、Vector繼承AbstractList類,實現了List介面。

AbstractList實現了 List 的一些位置相關操作(比如 get,set,add,remove),是第一個實現隨機訪問方法的集合類,AbstractList是List介面的最小實現。

(也有人說AbstractList是多餘的參考Why does LinkedHashSet<E> extend HashSet<e> and implement Set<E>

 

扯遠了,項目中有地方用到了LinkedList的時候出錯。

一、將List賦值給另一個List

 1         LinkedList<Integer> getData=new LinkedList<Integer>();
 2         LinkedList<Integer> saveData;
 3         //錯誤一:saveData對象引用getData對象(類似於指針指向A),並不是將getData對象傳遞給savaData
 4         saveData=getData;
 5         //錯誤二:淺克隆,依然是同一個對象
 6         saveData=(LinkedList<Integer>) getData.clone();
 7         
 8         //正確一
 9         LinkedList<Integer> saveData=new LinkedList<Integer>(getData);
10         //正確二
11         LinkedList<Integer> saveData=new LinkedList<Integer> ();
12         saveData.addAll(getData);
13         //正確三
14         for(Integer s:getData)
15             saveData.add(s);

二、實現在一個List中多線程操作(添加和刪除)

由於LinkedList是線程不同步的,所以我選擇的辦法是給他的添加、刪除等操作的模塊加鎖

關鍵字synchronized取得的鎖都是對象鎖,而不是把一段代碼或方法(函數)當作鎖,哪個線程先執行帶synchronized關鍵字的方法,哪個線程就持有該方法所屬對象的鎖,其他線程都只能呈等待狀態。但是這有個前提:既然鎖叫做對象鎖,那麼勢必和對象相關,所以多個線程訪問的必須是同一個對象

 

//代碼塊一,將含有添加元素的語句放入鎖中 
synchronized (test.myApp.getFlag()) {//myApp是一個繼承Application類的類,getFlag()得到其中定義的一個String對象(字元串常量)
     if (Assets2.start == 1) {
         float[] i = {event.getAccelerationX(), event.getAccelerationY(), event.getAccelerationZ()};
        test.myApp.getAsensorData().addLast(i);
    } else test.myApp.getAsensorData().clear();
 }

 

//代碼塊二,給含刪除List中元素的代碼塊加鎖,註意鎖與代碼塊一相同
synchronized (test.myApp.getFlag()) {
     if (!test.myApp.getAsensorData().isEmpty() && (!test.myApp.getGsensorData().isEmpty())) {
        test.myApp.getAsensorData().removeFirst();
       // test.myApp.getGsensorData().removeFirst();
     }
}

其中test.myApp.getFlag()只用是一個對象即可,如果是在Java中非安卓中使用:String flag="110";用flag代替test.myApp.getFlag()即可。

 test.myApp.getAsensorData()是獲取定義為全局變數的LinkedList,在Java中:LinkedList<float[]> asensorData=new LinkedList<>();後用asensorData代替test.myApp.getAsensorData()。

 

知識補充:vector、LinkedList、ArrayList區別

1.Vector、ArrayList都是以類似數組的形式存儲在記憶體中,LinkedList則以鏈表的形式進行存儲。

2.Vector的方法加了synchronized, 而ArrayList、LinkedList則沒有。Vector屬於線程安全的(也稱線程同步)。

3.LinkedList適合指定位置插入、刪除操作,不適合查找。()Vector、ArrayList適合查找,不適合指定位置插入、刪除。

4.ArrayList在記憶體不夠時預設是擴展50% + 1個。(例如:原始大小是 10 ,擴容後的大小就是 10 + 5+1 = 16);Vector是當增長因數>0,預設擴展增加一個增長因數,否則預設擴展1倍(當擴容因數大於0時,新數組長度為原數組長度+擴容因數,否子新數組長度為原數組長度的2倍。)。linkedList 是一個雙向鏈表,沒有初始化大小,也沒有擴容的機制,就是一直在前面或者後面新增就好。

添加:HashMap擴容(初始化大小是 16 ,擴容因數預設0.75(可以指定初始化大小,和擴容因數)),當前大小 和 當前容量 的比例超過了 擴容因數,就會擴容,擴容後大小為 一倍。

例如:初始大小為 16 ,擴容因數 0.75 ,當容量為12的時候,比例已經是0.75 。觸發擴容,擴容後的大小為 32。

 

寫一篇隨筆挺花時間的,有時候寫到一半,忘記,下次再打開居然沒存,就gg了~希望以後會更熟練吧,希望能鍛煉自己的梳理能力,也能溫習以前遇到的東西。

 


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

-Advertisement-
Play Games
更多相關文章
  • C/S又稱Client/Server或客戶/伺服器模式。伺服器通常採用高性能的PC、工作站或小型機,並採用大型資料庫系統,如Oracle、Sybase、Informix或 SQL Server。客戶端需要安裝專用的客戶端軟體。 B/S是Brower/Server的縮寫,客戶機上只要安裝一個瀏覽器(B ...
  • Django中模型(二) 三、定義模型 1、模型、屬性、表、欄位間的關係: 一個模型類在資料庫中對應一張表;在模型類中定義的屬性,對應該模型對照表中的欄位。 2、定義屬性 A、概述 ·django根據屬性的類型確定以下信息 ·當前選擇的資料庫支持欄位的類型 ·渲染管理表單時使用的預設html控制項 · ...
  • B站是目前本人看到的最好的免費學習Python的網站 黑馬程式員- https://space.bilibili.com/37974444?spm_id_from=333.338.viewbox_report.6#/ B站上找老男孩Linux 教育視頻 關註黑馬程式員官方微信可下載近70G的Pyth ...
  • #for 和 while #for用來迭代處理,什麼叫迭代?你就當沒看到這個詞,for是把一堆玩意做一個一個加工用的,比如吃一袋花生,得一個一個剝吧,就是這意思 a = 'abcde' #每個字母當做一個花生,a是一袋子 for i in a: #從袋子裡面一個一個拿花生,拿出的每一個花生都起名叫小 ...
  • 1.會話技術簡介 http協議是無狀態的,因此對於服務端來說,當它接收到客戶端的http請求時,無法識別這個請求來源於哪個客戶端。無狀態的協議有優點也有缺點,但對於需要識別客戶端甚至是需要記住客戶端的業務來說,應當要讓http協議"有狀態"。 需要記住客戶端的業務種類非常多。例如登陸系統,在一個頁面 ...
  • 本篇我們開始進入Java的學習,首先在學習如何編寫Java語言前要先瞭解Java程式的基本結構。 一、Java程式的基本結構 一個Java程式的基本結構大體可以分為包、類、main()主方法、標識符、關鍵字、語句和註釋等,如下: 我們來逐一分析一下每一條語句,過多的概念我就不詳述了,只說最基本的。 ...
  • 記得我在以前找工作的經歷中,遇到過一個面試官問過我一個很基礎的問題。問題是:有一個List中有10個元素,我現在想從中刪除3個元素,請問怎麼做?我當時也沒想,就直接說,List的有自帶的remove方法,可以直接使用,他說請詳細的說明一下,我說寫一個for迴圈,迴圈的次數是List的長度,然後在迴圈 ...
  • 過往的項目中數據存儲都離不開資料庫,不過最近做的一個項目的某些數據(比如人員信息、菜單、許可權等等)卻完全沒有涉及任何資料庫操作,直接XML搞定。這裡無意比較優劣,因為資料庫存儲和XML存儲本就有不同的適用場景,盲目比較毫無意義,只是因為業務需要,僅此而已。先來概念一下——XML,可擴展標記語言,設計 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...