引出
程序人生——Java數(shù)組和集合使用建議(2)文章來源地址http://www.zghlxwxcb.cn/news/detail-841500.html
數(shù)組和集合
建議71:推薦使用subList處理局部列表
- 需求:要?jiǎng)h除一個(gè)ArrayList中的20-30范圍內(nèi)的元素;將原列表轉(zhuǎn)換為一個(gè)可變列表,然后使用subList獲取到原列表20到30范圍內(nèi)的一個(gè)視圖(View),然后清空該視圖內(nèi)的元素,即可在原列表中刪除20到30范圍內(nèi)的元素
建議72:生成子列表后不要再操作原列表
- subList生成子列表后,使用Collections.unmodifiableList(list);保持原列表的只讀狀態(tài))(利用subList生成子列表后,更改原列表,會(huì)造成子列表拋出java.util.ConcurrentModificationException異常。原因:subList取出的列表是原列表的一個(gè)視圖,原數(shù)據(jù)集(代碼中的list變量)修改了,但是subList取出的子列表不會(huì)重新生成一個(gè)新列表(這點(diǎn)與數(shù)據(jù)庫(kù)視圖是不相同的),后面再對(duì)子列表操作時(shí),就會(huì)檢測(cè)到修改計(jì)數(shù)器與預(yù)期的不相同,于是就拋出了并發(fā)修改異常
建議73:使用Comparator進(jìn)行排序
- Comparable接口可以作為實(shí)現(xiàn)類的默認(rèn)排序法,Comparator接口則是一個(gè)類的擴(kuò)展排序工具)(兩種數(shù)據(jù)排序?qū)崿F(xiàn)方式:1、實(shí)現(xiàn)Comparable接口,必須要實(shí)現(xiàn)compareTo方法,一般由類直接實(shí)現(xiàn),表明自身是可比較的,有了比較才能進(jìn)行排序;2、實(shí)現(xiàn)Comparator接口,必須實(shí)現(xiàn)compare方法,Comparator接口是一個(gè)工具類接口:用作比較,它與原有類的邏輯沒有關(guān)系,只是實(shí)現(xiàn)兩個(gè)類的比較邏輯
建議74:不推薦使用binarySearch對(duì)列表進(jìn)行檢索
- indexOf與binarySearch方法功能類似,只是使用了二分法搜索。使用二分查找的首要條件是必須要先排序,不然二分查找的值是不準(zhǔn)確的。indexOf方法直接就是遍歷搜尋。從性能方面考慮,binarySearch是最好的選擇
建議75:集合中的元素必須做到compareTo和equals同步
- 實(shí)現(xiàn)了compareTo方法,就應(yīng)該覆寫equals方法,確保兩者同步)(在集合中indexOf方法是通過equals方法的返回值判斷的,而binarySearch查找的依據(jù)是compareTo方法的返回值;equals是判斷元素是否相等,compareTo是判斷元素在排序中的位置是否相同
建議76:集合運(yùn)算時(shí)使用更優(yōu)雅的方式
- 1、并集:list1.addAll(list2);
- 2、交集:list1.retainAll(list2);
- 3、差集:list1.removeAll(list2);
- 4、無重復(fù)的并集:list2.removeAll(list1);list1.addAll(list2);
建議77:使用shuffle打亂列表
- 使用Collections.shuffle(tagClouds)打亂列表
建議78:減少HashMap中元素的數(shù)量
- 盡量讓HashMap中的元素少量并簡(jiǎn)單)(**現(xiàn)象:**使用HashMap存儲(chǔ)數(shù)據(jù)時(shí),還有空閑內(nèi)存,卻拋出了內(nèi)存溢出異常;**原因:**HashMap底層的數(shù)組變量名叫table,它是Entry類型的數(shù)組,保存的是一個(gè)一個(gè)的鍵值對(duì)。與ArrayList集合相比,HashMap比ArrayList多了一次封裝,把String類型的鍵值對(duì)轉(zhuǎn)換成Entry對(duì)象后再放入數(shù)組,這就多了40萬個(gè)對(duì)象,這是問題產(chǎn)生的第一個(gè)原因;HashMap在插入鍵值對(duì)時(shí),會(huì)做長(zhǎng)度校驗(yàn),如果大于或等于閾值(threshold變量),則數(shù)組長(zhǎng)度增大一倍。默認(rèn)閾值是當(dāng)前長(zhǎng)度與加載因子的乘積,默認(rèn)的加載因子(loadFactor變量)是0.75,也就是說只要HashMap的size大于數(shù)組長(zhǎng)度的0.75倍時(shí),就開始擴(kuò)容。導(dǎo)致到最后,空閑的內(nèi)存空間不足以增加一次擴(kuò)容時(shí)就會(huì)拋出OutOfMemoryError異常
建議79:集合中的哈希碼不要重復(fù)
- 列表查找不管是遍歷查找、鏈表查找或者是二分查找都不夠快。最快的是Hash開頭的集合(如HashMap、HashSet等類)查找,原理:根據(jù)hashCode定位元素在數(shù)組中的位置。HashMap的table數(shù)組存儲(chǔ)元素特點(diǎn):1、table數(shù)組的長(zhǎng)度永遠(yuǎn)是2的N次冪;2、table數(shù)組中的元素是Entry類型;3、table數(shù)組中的元素位置是不連續(xù)的;每個(gè)Entry都有一個(gè)next變量,它會(huì)指向下一個(gè)鍵值對(duì),用來鏈表的方式來處理Hash沖突的問題。如果Hash碼相同,則添加的元素都使用鏈表處理,在查找的時(shí)候這部分的性能與ArrayList性能差不多
建議80:多線程使用Vector或HashTable
- Vector與ArrayList原理類似,只是是線程安全的,HashTable是HashMap的多線程版本。線程安全:基本所有的集合類都有一個(gè)叫快速失敗(Fail-Fast)的校驗(yàn)機(jī)制,當(dāng)一個(gè)集合在被多個(gè)線程修改并訪問時(shí),就可能出現(xiàn)ConcurrentModificationException異常,這是為了確保集合方法一致而設(shè)置的保護(hù)措施;實(shí)現(xiàn)原理是modCount修改計(jì)數(shù)器:如果在讀列表時(shí),modCount發(fā)生變化(也就是有其他線程修改)則會(huì)拋出ConcurrentModificationException異常。**線程同步:**是為了保護(hù)集合中的數(shù)據(jù)不被臟讀、臟寫而設(shè)置的
建議81:非穩(wěn)定排序推薦使用List
- 非穩(wěn)定的意思是:經(jīng)常需要改動(dòng);TreeSet集合中元素不可重復(fù),且默認(rèn)按照升序排序,是根據(jù)Comparable接口的compareTo方法的返回值確定排序位置的。SortedSet接口(TreeSet實(shí)現(xiàn)了該接口)只是定義了在該集合加入元素時(shí)將其進(jìn)行排序,并不能保證元素修改后的排序結(jié)果。因此TreeSet適用于不變量的集合數(shù)據(jù)排序,但不適合可變量的排序。對(duì)于可變量的集合,需要自己手動(dòng)進(jìn)行再排序)(SortedSet中的元素被修改后可能會(huì)影響其排序位置
建議82:由點(diǎn)及面,一頁知秋—集合大家族
- List:實(shí)現(xiàn)List接口的集合主要有:ArrayList、LinkedList、Vector、Stack,其中ArrayList是一個(gè)動(dòng)態(tài)數(shù)組,LinkedList是一個(gè)雙向鏈表,Vector是一個(gè)線程安全的動(dòng)態(tài)數(shù)組,Stack是一個(gè)對(duì)象棧,遵循先進(jìn)后出的原則;
- Set:Set是不包含重復(fù)元素的集合,其主要的實(shí)現(xiàn)類有:EnumSet、HashSet、TreeSet,其中EnumSet是枚舉類型的專用Set,HashSet是以哈希碼決定其元素位置的Set,原理與HashMap相似,提供快速插入與查找方法,TreeSet是一個(gè)自動(dòng)排序的Set,它實(shí)現(xiàn)了SortedSet接口;
- Map:可以分為排序Map和非排序Map;排序Map為TreeMap,根據(jù)Key值進(jìn)行自動(dòng)排序;非排序Map主要包括:HashMap、HashTable、Properties、EnumMap等,其中Properties是HashTable的子類,EnumMap則要求其Key必須是某一個(gè)枚舉類型;
- Queue:分為兩類,一類是阻塞式隊(duì)列,隊(duì)列滿了以后再插入元素會(huì)拋異常,主要包括:ArrayBlockingQueue、PriorityBlockingQueue、LinkedBlockingQueue,其中ArrayBlockingQueue是以數(shù)組方式實(shí)現(xiàn)的有界阻塞隊(duì)列;PriorityBlockingQueue是依照優(yōu)先級(jí)組件的隊(duì)列;LinkedBlockingQueue是通過鏈表實(shí)現(xiàn)的阻塞隊(duì)列;另一類是非阻塞隊(duì)列,無邊界的,只要內(nèi)存允許,都可以追加元素,經(jīng)常使用的是PriorityQueue類。還有一種是雙端隊(duì)列,支持在頭、尾兩端插入和移除元素,主要實(shí)現(xiàn)類是:ArrayDeque、LinkedBlockingDeque、LinkedList;
- 數(shù)組:數(shù)組能存儲(chǔ)基本類型,而集合不行;所有的集合底層存儲(chǔ)的都是數(shù)組;
- 工具類:數(shù)組的工具類是:java.util.Arrays和java.lang.reflect.array;集合的工具類是java.util.Collections;
- 擴(kuò)展類:可以使用Apache的commons-collections擴(kuò)展包,也可以使用Google的google-collections擴(kuò)展包
深入認(rèn)識(shí)JVM
JVM內(nèi)存分配,類加載
Java進(jìn)階(1)——JVM的內(nèi)存分配 & 反射Class類的類對(duì)象 & 創(chuàng)建對(duì)象的幾種方式 & 類加載(何時(shí)進(jìn)入內(nèi)存JVM)& 注解 & 反射+注解的案例
創(chuàng)建對(duì)象的4種方法總結(jié)
Java進(jìn)階(4)——結(jié)合類加載JVM的過程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化
垃圾回收GC
Java進(jìn)階(垃圾回收GC)——理論篇:JVM內(nèi)存模型 & 垃圾回收定位清除算法 & JVM中的垃圾回收器
簡(jiǎn)介:本篇博客介紹JVM的內(nèi)存模型,對(duì)比了1.7和1.8的內(nèi)存模型的變化;介紹了垃圾回收的語言發(fā)展;闡述了定位垃圾的方法,引用計(jì)數(shù)法和可達(dá)性分析發(fā)以及垃圾清除算法;然后介紹了Java中的垃圾回收器,由串行、到并行再到并發(fā),最后到G1的演變;最后給出了垃圾回收器的對(duì)比和使用指引。
JVM調(diào)優(yōu),Arthas使用
- Java進(jìn)階(JVM調(diào)優(yōu))——阿里云的Arthas的使用 & 安裝和使用 & 死鎖查找案例,重新加載案例,慢調(diào)用分析
- Java進(jìn)階(JVM調(diào)優(yōu))——JVM調(diào)優(yōu)參數(shù) & JDK自帶工具使用 & 內(nèi)存溢出和死鎖問題案例 & GC垃圾回收
認(rèn)識(shí)多線程
創(chuàng)建多線程方法+了解線程池
Java進(jìn)階(5)——?jiǎng)?chuàng)建多線程的方法extends Thread和implements Runnable的對(duì)比 & 線程池及常用的線程池
多線程下-1非原子性問題即解決
Java進(jìn)階(6)——搶購(gòu)問題中的數(shù)據(jù)不安全(非原子性問題)& Java中的synchronize和ReentrantLock鎖使用 & 死鎖及其產(chǎn)生的條件
再論線程,創(chuàng)建、生命周期
Java進(jìn)階(再論線程)——線程的4種創(chuàng)建方式 & 線程的生命周期 & 線程的3大特性 & 集合中的線程安全問題
主要內(nèi)容:
1.線程創(chuàng)建的方式,繼承Thread類,實(shí)現(xiàn)Runable接口,實(shí)現(xiàn)Callable接口,采用線程池;
2.線程生命周期: join():運(yùn)行結(jié)束再下一個(gè), yield():暫時(shí)讓出cpu的使用權(quán),deamon():守護(hù)線程,最后結(jié)束,sleep():如果有鎖,不會(huì)讓出;
3.線程3大特性,原子性,可見性,有序性;
4.list集合中線程安全問題,hash算法問題;文章來源:http://www.zghlxwxcb.cn/news/detail-841500.html
總結(jié)
程序人生——Java數(shù)組和集合使用建議(2)
到了這里,關(guān)于程序人生——Java數(shù)組和集合使用建議(2)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!