對於數組我們應該很熟悉,一個數組在內存中總是一塊連續的存儲空間,數組的創建使用new關鍵字,數組是引用類型的數據,一旦第一個元素的位置確定,那么后面的元素位置也就確定了,數組有一個最大的局限就是數組一旦創建,他的長度就是固定的,不可以進行更改,如果數組空間不夠大,唯一的方法就是再創建一個大的數組,把原來的數組元素拷貝過去。
為了使程序鞥狗方便的存儲和操作數量不固定的數據,java加入了集合個概念,和數組最大的區別也就是長度可以改變,是一種動態的調整。
在java中一共有三種集合分別是List,Set,Map,三種集合有着各自的特點:
List(列表):集合中的每一個位置是按照索引位置放的,像一個櫃子,一層一層的,可以有重復的元素,當我們想要取數據的時候,直接找對應的櫃子的層號就可以找到,就是可以根據索引找到元素,是和數組最像的集合,
Set(集):集合中的每一個元素都是不按順序進行排列,這也決定了Set集合中沒有重復的元素,像籃子里的雞蛋,無序不重復。
Map(映射):集合中的每一個元素都是按照鍵值對的方式存儲,一個鍵對應一個值,鍵不可以重復,值可以重復,我們可以根據鍵找到值,也是無序的集合。
接下來我們看看各個集合類繼承和實現類
我們常說的三種集合其實是三個接口,List和Set集合共同繼承Collection這個父接口,Map集合是單獨的一個接口,他們一共有六個實現類,List的實現類是LinkedList和ArrayList
Set的實現類有HashSet和TreeSet,Map的實現類有HashMap和TreeMap
我們先看ArrayList的源碼:ArrayList的底層實現還是數組,只不過好多方法都封裝好了,不用我們去寫,看着好像一個可變長度的集合,在ArrayList的源碼中有一個數組,構造方法及操作集合的方法都是對這個數組進行操作
每次進行add添加元素操作時,都是把原來的元素復制到新的數組中,利用了System的arraycopy方法,這是native修飾的方法,數組的工具類Arrays中元素的復制也是利用了這個方法。
LinkedList的底層是用鏈表實現的,關於鏈表和數組的區別,請看另一篇文章:單鏈表的插入,查找,刪除 在這里詳細講了數組uhe鏈表的區別
我們看到他的內部有一個內部類Node(節點),定義了前指針,尾指針
所有的操作都是對節點進行操作,舉兩個方法例子: