1. 程式人生 > >Java List集合和哈希表

Java List集合和哈希表

imp hashset -c 實現類 app 很多 世界 add 通過

List集合和Set集合,先來看List集合。

List集合存儲元素的特點:

1.有序(List集合中的元素有下標):存進去是什麽樣,取出來還是什麽樣

2.可重復

可以結合以下的簡單代碼來看一看。

import java.util.*;
public class ListTest01{
public static void main(String[] args){
List l=new ArrayList();
l.add(100);
l.add(32);
l.add(32);
l.add(90);
Iterator it=l.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}

編譯運行後輸出:

100
32
32
90

由於ArrayList集合底層是數組,數組是有下標的,所以ArrayList集合有很多自己的特性。ArrayList集合底層默認初始化容量是10,擴大之後的容量是原容量的1.5倍。

import java.util.*;
public class ListTest02{
public static void main(String[] args){
List l=new ArrayList();
l.add(12);
l.add(23);
l.add(43);

//在下標為1的位置上插入元素
l.add(1,555);
//取得第一個元素
System.out.println(l.get(0));
System.out.println("-----------");
for(int i=0;i<l.size();i++){
Object element=l.get(i);
System.out.println(element);
}
}
}

編譯運行後輸出:

12
-----------
12
555
23
43

在上面代碼中,首先List l=new ArrayList();new出一個新的List對象l,接著使用add()方法添加元素,l.add(a,b)可以在指定的下標為a的位置添加元素b,最後使用for循環遍歷輸出List l中的元素。註意for循環中的內容為List獨有的遍歷方式。

Set的實現類主要有HashSet和TreeSet,在講HashSet之前先來看看什麽是哈希表。哈希表(Hash table,也叫散列表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。

記錄的存儲位置=f(關鍵字)

這裏的對應關系f稱為散列函數,又稱為哈希(Hash函數),采用散列技術將記錄存儲在一塊連續的存儲空間中,這塊連續存儲空間稱為散列表或哈希表(Hash table)。

哈希表的結構圖如下圖所示:

技術分享圖片

哈希表是數組和單向鏈表的結合,我們都知道數組的特點是尋址容易,插入和刪除困難,而鏈表的特點是尋址困難,插入和刪除容易,哈希表將二者結合起來,得到了一種尋址容易,插入和刪除也容易的數據結構。哈希表本質是一個數組,不過這個數組中的每個元素又都是單向鏈表,類似於現實世界中的字典。在單向鏈表的每一個節點,都包含四個組成部分,Object key; Object value; final int hash; Entry next; Entry next指向該節點的下一個節點。final int hash;是一個哈希值,是通過key調用hashCode方法得到的值,再通過“哈希算法”得出的值,並且在單向鏈表中每一個節點的哈希值是相同的,代表的是數組的下標。如果要對數組中某一個元素進行查找的話該怎麽做呢?比如要查找一個o對象,o對象去調用hashCode方法,得出哈希值,哈希值代表數組的下標,得到數組的下標也就知道o對象在哪一個單向鏈表中。HashMap中有一個方法,Object get[Object key],得到Object value的值。那麽如何往哈希表中添加元素呢?HashMap中有一個添加元素的方法,void put[Object key,Object value];首先調用Object key的hashCode方法,得到一個哈希值,如果哈希值已經存在於數組中,就能定位單向鏈表,通過key遍歷單向鏈表,如果key與已經存在的key相同(通過equals方法),因為key無序不可重復,所以不添加,反之則在單向鏈表中添加;若哈希值在數組中不存在,則在數組後面的位置添加一個新的單向鏈表。因此哈希表的增刪效率和查詢效率都是非常高的。從上面的描述中我們知道Object key是非常重要的,不可重復。

搜索微信公眾號“程序員考拉”,歡迎關註!

Java List集合和哈希表