談談集合框架


  一寒假在家都沒有網,很多想法很多項目中遇到的問題也沒能及時記下來,結果博客斷層了一個多月。現在拾起來。

  昨天去面試,兩個面試官大哥很和藹很帥氣,然后給我的第一個問題就是談談ArrayList和LinkedList,這種集合框架的問題在面試中太常見了,以前老師給發過《葵花寶典》里面對這類問題總結的也非常詳細,老師就讓我們背下來,后來提問我的時候我按照自己的想法總體全面得說了一下,結束后老師評價一句:這是你編的吧。。。后來自己仔細想了一下確實好多口誤和認識上的錯誤。所以今天總結一下,給自己提個醒。

  首先引用百度上的一張比較標准圖片吧:

 

  這個圖貌似有點繞,不過沒關系,看多了就不繞了。接口Collection下面有兩個子接口:List和Set;List下面三個實現類:LinkedList、ArrayList、Vector;Set下面兩個實現類:TreeSet和HashSet(子類LinkedHashSet);右邊接口Map下面有兩個實現類TreeMap和HashMap(子類LinkedHashMap)。

  首先看最上面的一個接口Collection,實現了Iterable接口,也就為集合提供了迭代器,這個iterator方法我就經常用。JDK不提供Collection的任何直接實現類,所有的實現都經過它的兩個子接口。提供的一些方法全都是見名知意的,所以不再贅述。補充一點,老師以前說過所有的接口都是一個協議一個標准,它里面甚至可以什么方法都沒有(舉例就像cloneable),對這句話我暫時也沒能理解太深,留給以后解決。

  接下來Collection的兩個子接口:Set和List。兩者之間最大區別就是Set里存放的元素不能重復,而List里存放的元素可以重復(准確來講是Set里不能同時存在a和b使得a.equals(b)成立,而List里可以同時存在a和b使得a.equals(b)成立)。兩者之間還有一點區別是我今天重點記錄的:List和Set的是否有序。對於很多資料上都寥寥地記錄着List是有序的而Set是無序的,在我回答老師問題的時候我也這樣回答,結果被老師狠批了一頓:誰說List有序了,你存個1、4、2、3它能給你排序不,Set內部才有自己的排序算法……當時我就震驚了,我們老師說的完全有道理,那些資料書上都是扯淡?下面我們一起來看一下JDK API幫助文檔上面怎么說:“List:有序的 collection(也稱為序列)。此接口的用戶可以對列表中每個元素的插入位置進行精確地控制。用戶可以根據元素的整數索引(在列表中的位置)訪問元素,並搜索列表中的元素。”。看出來了吧,對於大部分資料上說的List有序是指存儲有序(但是大多數資料並沒有寫明這一點),就是存進去1、4、2、3后,用迭代器打印出來的還會是1、4、2、3;而Set怎么樣呢?下面我用一小段代碼做個測試:

 1 public class Test {
 2 
 3     public static void main(String[] args) {
 4         
 5         Set set = new HashSet();
 6         
 7         set.add("1");
 8         set.add("a");
 9         set.add("2");
10         set.add("b");
11         set.add("3");
12         set.add("c");
13         
14         List list = new ArrayList();
15         
16         list.add("1");
17         list.add("a");
18         list.add("2");
19         list.add("b");
20         list.add("3");
21         list.add("c");
22         
23         
24         Iterator it = set.iterator();
25         while(it.hasNext()){
26             System.out.print(it.next()+" ");
27         }
28 
29         System.out.println("\n"+"***********");
30 
31         Iterator it2 = list.iterator();
32         while(it2.hasNext()){
33             System.out.print(it2.next()+" ");
34         }
35         
36     }
37 }

  上述代碼運行結果為:

  這時候我又想了,那TreeSet和LinkedList會是怎么樣呢,於是我又分別構建了兩個集合,存入同樣的元素,運行結果如下:

 

  下面說一下Map接口。首先還是看一下幫助文檔(這是一個非常好的習慣,就像看源代碼一樣,很多問題通過幫助文檔可以一目了然地得到解決):將鍵映射到值的對象。一個映射不能包含重復的鍵;每個鍵最多只能映射到一個值。其實現類有HashMap和TreeMap。

 

  關於集合還有一些要注意的地方:1.涉及堆棧、隊列等用List。快速隨機訪問用ArrayList,快速插入、刪除等用LinkedList。2.線程同步的類:Vector和HashTable;線程不同步的類:ArrayList LinkedList HashSet TreeSet HashMap TreeMap. 3.ArrayList的大小是如何自增的:ArrayList底層是用數組實現的,如果容量用完,會新建一個長度更長的數組,然后調用Arrays.copyof方法將舊的數組復制到新的數組中去。

 

  在這個博客里我還是想說一下主要目的是給自己總結和復習,本身一個技術渣談不上給別人什么指導,而且我總結的也是在別人總結的基礎上總結別人的,可以說是嚼了別人嚼無數遍又吐出來的知識。如果不回顧自己的總結,不回頭解決以前留下的問題,那這個博客對我來說也就沒什么意義了。昨天面試官大哥就問了我一個問題:能不能說出在搭建ssh時候配置文件web.xml里面的一些配置,這個是我之前博客里總結過的,可是常用的application.xml和struts.xml還有點印象,所以稀里糊塗的回答了application.xml里面的東西,結果大哥給了提示也說不正確,這讓我感覺非常慚愧,以后要盡量讓這個博客發揮出它的價值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM