標籤:
1List:List元素的特點!
List集合的遍曆方式: while-迭代器遍曆 for-迭代器遍曆 foreach-迭代遍曆 for-get遍曆(只有List才可以,set,map都不可以)
有序可重複,因為底層的實現數組和鏈表,都是有下標來表示唯一性的,存進去什麼順序,取出來還是什麼順序。
ArrayList : 底層是一個索引數組,有順序的,靠索引數組的下標
LinkedList: 底層是一個鏈表式的先後維持順序。
深入List集合
ArrayList():底層是索引數組,索引下標 ArrayList集合底層預設初始化的容量是 10,擴大後容量是原始容量的1.5倍 Vector集合底層預設也是10,擴大後容量是原來的兩倍 ArrayListshi Vector 的升級,不要再用Vector 針對數組的代碼最佳化:盡量不要擴容操作,建立集合的時候,就初始化指定容量 List集合即可以有(迭代器-while迴圈,for-迭代器迴圈,for-get迴圈(只有list可以))
下面是個List例子供大家參考:
import java.util.*;
public class List01{
public static void main(String[] args){
List li = new ArrayList();
li.add(100);
li.add(10);
li.add(110);
li.add(100);
for (Iterator it = li.iterator(); it.hasNext(); ){
System.out.println( it.next() );
}
}
}
2 ,Set:無順序不可重複:底層是一個索引數組。HashMap鍵的部分 HashSet:HashTable
SortedSet:紅/黑樹狀結構 無序不可重複,但是存進去的元素可以按照元素大小自動排序
SortedSet集合儲存元素為什麼可以自動排序 因為被儲存的元素實現了Comparable介面;
SUN編寫的的TreeSet集合在添加元素的時候,會自動調用CompareTo方法完成比
Set集合:HashSet 1 HashSet 是HashMap的一個實現,本質就是一個HashMap,而HashMap的資料結構是一個Hash表
2 雜湊表(Hash表):又叫散列表,其底層是用Hash函數組合起來的一個:數組和單向鏈表;每個單向鏈表表都有一個獨一無二的hash值,這個值同時也是數組的下標,每個單項列表節點的hash值是相等的; hash值本質是把key的值調用hashCode()方法 3 向hash表中添加元素的過程 1) 先調用被儲存的key,調用hashCode方法,這個算出hash值,即數組的下標,然偶調用equals()方法,和數組的所有下標進行比對,如果沒有,就在新的桶位(就是下標位)建立鏈表 (如果不存在,則作為一個新的下標,添加一個數組元素,這個元素作為這個新的鏈表的頭元素存在) 如果有,則繼續調用equals()方法,把鍵和值和鏈表中的值進行比較,如果返回為true那麼,就代表該鏈表中已經有了這個key值,放棄添加,如果沒有,則返回false,然後連值一起放到當前的hash值鏈表中
4 HashSet本質是hashMap的key部分,兩者完全一樣
5 HashSet和HashMap初始化容量都是16,預設載入因子是0.75
下面是例子:
import java.util.*;
public class Collection_08_Set_01{
public static void main(String[] args){
Set s = new HashSet();
s.add(1);//自動裝箱:基礎資料型別 (Elementary Data Type)自動轉型為相對應引用資料類型 //自動拆箱:是指有對應的基礎資料型別 (Elementary Data Type)的對象,自動轉型為其基本類型
s.add(1);
s.add(3);
s.add(4);
Iterator it = s.iterator();
while (it.hasNext()){//hasNext()的傳回值是boolean (布爾值)
System.out.println( it.next() );
}
for (Iterator its = s.iterator(); its.hasNext(); ) {
System.out.println( its.next() );
}
}
}
3 Map:map無順序可重複
hash(雜湊):根據對象的特性為對象產生一個唯一標示符的方法
Oject中hashCode()是雜湊的一個應用,拿對象的記憶體位址經過運算來作為對象的唯一標示符
HashMap:最底層還是個數組+單向鏈表:我們把下標是字串的數組叫關聯陣列
數組的下標是一個字串
Map集合和Collection不一樣,但是操作是一樣的,只是操作的方法有細微的差別 增 Object put(Object key, Object value); 向集合中添加索引值對 刪 void clear(); 清空map 改 資料類型轉換 查 int size(); //擷取Map中索引值對的個數 boolean isEmpty();//判斷是否為空白 Object get(Object key);//通過key擷取對應對象的值 Collection values();//擷取map集合中所有value對象的集合 boolean:containsKey(Object key);//判斷集合中是否有這樣的key鍵 boolean containsValue(Object value)//判斷集合中是否有這樣的值 Set keySet();//擷取集合中所有的key,以集合方式返回 Set entrySet;//返回此映射中包含的映射關係,Set集合方式返回
遍曆 HashMap預設初始值16,預設載入因子是0.75
下面是例子:
import java.util.*;
public class Collection_06_Map_01{
public static void main(String[] args){
//1 建立一個HashMap的集合
Map ps = new HashMap();
//2 往裡面添加元素
ps.put("1000","jack");
ps.put("1011","jobs");
ps.put("1002","cook");
ps.put(1003,"rose");//這裡會調用Integer的hashCode()方法:1003.hashCode().hashCode(1003),return-->1003
ps.put("1000","sun");
//查詢裡面的元素
System.out.println( ps.size() );//這裡的傳回值4 是指的是誰,有4個一一映射關係,一個一一映射關係在記憶體中就是一個鏈表節點
System.out.println( ps.containsKey("1004") );//查就是數組的下標,containsKey先是去調用對象的hashCode()產生hash碼,然後在調用對象自身的equals(),去數組下標中比較,然後在調用equals(),去鏈表中比對鍵的原值
System.out.println( ps.containsValue("sun") );//1 "1000"<----->"sun",一一映射,"sun"找到"1000" //2 把"1000".hashCode().equals()去數組中比較下標(又叫桶位),找到這個桶位,然後 //3 "1000".equals()去鏈表中挨個比較 //4 "sun".equals()去比較他們的值//不需要比較 //有一句話:我們hash函數的目的,不是為了唯一性,不是為了產生唯一的hash碼,不同對象可以產生相同的hash碼,因為hash相同不相同對我們的這個一一映射關係沒有影響,對關係關係中的兩個值也沒有有影響.當我們去查詢值的時候,我們equals了三次,以是hash碼,第二次是key的原生值,第三步比較的是value的原生值 //所以:一個隱藏關係,鍵相等,值相等,那他們是不是就想等 System.out.println( ps.get("1011") );
//改
//遍曆:通過key遍曆集合,同時獲得元素的鍵和值
System.out.println( "---------" );
Collection values = ps.values();
Iterator it = values.iterator();
while (it.hasNext()){
System.out.println( it.next() );
}
System.out.println( "---------" );
//刪
System.out.println( ps.remove("1002") ); //資料類型轉換 //將Map轉換成Set集合
Set es = ps.entrySet();
Iterator it3 = es.iterator();
while (it3.hasNext()){
System.out.println( it3.next() );
}
}
}
總結 :list 和set 有共同的父類 它們的用法也是一樣的 唯一的不太就是set中不能有相同的元素 list中可以
list和set的用途非常廣泛 list可以完全代替數組來使用
map 是獨立的合集 它使用索引值對的方式來儲存資料 鍵不能有重複的 值可以用
map不像上邊兩種集合那個用的廣泛 不過在servlet 和jsp中 map可是絕對的重中之重 頁面之間傳值全靠map
下面是介面對應的各種關係
JAVA集中中 List Set Map 區別和關係