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);//自動裝箱:基本數據類型自動轉型為相對應引用數據類型 //自動拆箱:是指有對應的基本數據類型的對象,自動轉型為其基本類型
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
下面是接口對應的各種關系