目前好像寫不出比較高質量的隨筆,除了多看看別人寫的,就是多寫,做好自己可以做的 最近聽的和看到的最多的一個詞就是“勿忘初心”。的確不少人到了一定高度之後,就不知道該怎麼做了。(包括我曾經的偶像娜姐,在得到法網冠軍之後,有很長一段時間都迷失了) 自己總結一下:人生到了某個層次或高度的時候,應該記得是什 ...
目前好像寫不出比較高質量的隨筆,除了多看看別人寫的,就是多寫,做好自己可以做的
最近聽的和看到的最多的一個詞就是“勿忘初心”。的確不少人到了一定高度之後,就不知道該怎麼做了。(包括我曾經的偶像娜姐,在得到法網冠軍之後,有很長一段時間都迷失了)
自己總結一下:人生到了某個層次或高度的時候,應該記得是什麼原因讓自己可以走到這個高度,而不是覺得自己應該做些什麼去適應這個高度。
當然,每個階段都有每個階段該做的和能做的事,這裡說的是要保持住讓自己前進的好品質。
在項目初期出現的問題:
在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了~希望以後會更熟練吧,希望能鍛煉自己的梳理能力,也能溫習以前遇到的東西。