Java集合框架的四個接口 collection list set map


接口

 

[四個接口  collection  list  set  map 的區別]
collection   存儲不唯一的無序的數據
list      存儲有序的不唯一的數據
set        存儲無序的唯一的數據
map     以健值對的形式存儲數據   以鍵取值  鍵不能重復   值可以重復
 
list接口
1.常用方法
①add方法 在列表的最后添加元素
 
②add(index.object)在此列表中的指定位置插入指定的元素。
 
③size() 返回此列表中的元素個數。
 
④get(int index)返回下標為index的元素
如果沒有泛型約束,返回object類型,需要強轉,如果有泛型約束,直接返回泛型類型,無需強轉,
 
⑤clear方法,清除列表中的所有數據
 
⑥contains() 傳入一個對象檢測列表中是否含有對象
    如果傳入的是string和基本數據類型,可以直接對比
    如果傳入的是實體對象,則默認只對比兩個對象的地址
 
⑦indexof ,傳入一個對象,返回此列表該對象的第一次出現的下標,如果此列表不包含元素,則返    回-1。
    lastindexof返回最后一次
 
⑧ remove傳入一個下標或一個對象,刪除指定元素
如果傳入下標,返回被刪除的元素對象,如果下標大於   匯報下標越界
如果傳入對象,則要求重寫equals方法,返回true或者是false表示刪除是否成功
 
⑨set  用指定的元素替換此列表中指定位置的元素。 返回被替換掉的元素對象
 
⑩subList  截取一個子列表,返回list類型
   toArray 將列表轉為數組,返回一個object[]類型的數組
 
 
 
ArrayList
     實現了一個長度可變的數組,在內存空間中開辟一串連續的空間,與數組的區別在於長度可以隨意修改。
這種存儲結構,在循環遍歷和隨機訪問元素的速度比較快。
 
LinkedList
使用鏈表結構存儲數據,在插入和刪除元素時速度非常快。
 
LinkedList的特有方法:
 
① addFirst(): 開頭插入元素
    addLast():  結尾插入元素
 
② removeFirst(): 刪除第一個元素,並返回被刪除的元素。
     removeLast():  刪除最后一個元素,並返回被刪除的元素。
 
③ getFirst():  返回列表第一個元素,不會刪除
     getLast():  返回列表最后一個元素,不會刪除
 
Vector     線程安全
LinkedList   線程不安全

Set接口
常用方法:與List接口基本相同。
但是,由於Set接口中的元素是無序的,因此沒有與下標相關的方法。
例如: get(index)  remove(index)   add(index,obj)  ....
 
Set接口的特點: 唯一、 無序;
 
  HashSet 底層是調用HashMap的相關方法,傳入數據后,根據數據的hashCode進行散列運算,
得到一個散列值后在進行運算,確定元素在序列中存儲的位置。
     HashSet如何確定兩個對象是否相等?
① 先判斷對象的hashCode( ),如果hashCode不同,那肯定不是一個對象。  如果hashCode相同,那繼續判斷equals( )方法;
② 重寫equals( )方法。
 
public boolean equals(Object obj) {
        if (this == obj)
        return true;
        if (obj == null)
        return false;
        if (getClass() != obj.getClass())
        return false;
Person other = (Person) obj;
        if (age != other.age)
        return false;
        if (id != other.id)
        return false;
        if (name == null) {
        if (other.name != null)
        return false;
        } else if (!name.equals(other.name))
        return false;
        return true;
        }            

 

>>>所以,使用HashSet存儲實體對象時,必須重寫對象的hashCode( ) 和 equals( ) 兩個方法!!
 
  LinkedHashSet: 在HashSet的基礎上,新增了一個鏈表。
      用鏈表來記錄HashSet中元素放入的順序,因此使用迭代器遍歷時,可以按照放入的順序依次讀出元素。
 
TreeSet: 將存入的元素,進行排序,然后再輸出。
  如果存入的是實體對象,那么實體類必須實現Comparable接口,並重寫compareTo()方法;
          或者,也可以在實例化TreeSet的同時,通過構造函數傳入一個比較器:
  比較器: 一個實現了Comparator接口,並重寫了compare()方法的實現類的對象。
 
   使用匿名內部類,拿到一個比較器對象。
Set<Person>  set = new TreeSet<Person>   (new Comparator( ){
    public int compare(Person p1, Person p2){
          return p1.getId( ) - p2.getId( );
}
  });
 

 

自定義一個比較類,實現Comparator 接口。
   Set<Person> set = new TreeSet<Person>(new Compare( ));
class Compare implements Comparator( ){
重寫compare方法。
  }

 

【Comparable接口 和 Comparator接口的區別】
1、 Comparable由實體類實現,重寫compareTo()方法; 
        實體類實現Comparable接口以后,TreeSet使用空參構造即可。
2、 Comparator需要單獨一個比較類進行實現,重寫Compare()方法。
        實例化TreeSet的時候,需要傳入這個比較類的對象。
 
Map接口
Map接口特點  以健值對的形式存儲數據 以及按鍵取值
鍵不能重復   值可以重復
 
Map接口常用方法
①put(key ,value)向map的最后添加一個鍵值對
 
②get(key) 通過鍵,取到一個值
 
③clear() 刪除所有內容
 
④containsValue()  檢測是否包含指定的值
    containsKey()      檢測是否包含指定的鍵
 
LinkedHashSmap
可以使用鏈表, 用鏈表來記錄元素放入的順序,可以按照放入的順序依次讀出元素。
 TreeMap
根據鍵的順序 進行排序后輸出
如果存入的是實體對象,那么必須重寫比較函數;
 
  HashMap與Hashtable的區別
 
1.Hashtable是線程安全的 (線程同步) HashMap是線程不安全的(線程不同步)
 
2.Hashtable的鍵不能為null  HashMap的鍵可以為null
 
3.HashMap繼承了AbstractMap,HashTable繼承Dictionary抽象類,兩者均實現Map接口。
 
4.HashMap的初始容量為16,Hashtable初始容量為11,兩者的填充因子默認都是0.75。
 
5.HashMap擴容時是當前容量翻倍即:capacity*2,Hashtable擴容時是容量翻倍+1即:capacity*2+1。
 
6.兩者計算hash的方法不同: 
Hashtable計算hash是直接使用key的hashcode對table數組的長度直接進行取模:
HashMap計算hash對key的hashcode進行了二次hash,以獲得更好的散列值,然后對table數組長度取摸:
 
7.在HashMap 中不能用get()方法來判斷HashMap 中是否存在某個鍵,而應該用containsKey()方法來判斷。Hashtable 的鍵值都不能 為null,所以可以用get()方法來判斷是否含有某個鍵。
 
 
遍歷map的方式

第一種

Set<String> keys =map1.keySet();
Iterator<String> iter=keys.iterator();
while (iter1.hasNext()) {
        String key=iter.next();
        System.out.println(key+"----"+map.get(key));
}

第二種

Collection<String> va=map.values();
Iterator<String> iter=va.iterator();
while (iter.hasNext()) {
        System.out.println(iter.next());
}

第三種

Set<Entry<String,String>> set= map.entrySet();
Iterator<Entry<String, String>> iter=set.iterator();
① while (iter.hasNext()) {
Entry<String, String> entry=iter.next();
    //entry是Java給我們提供的一種特殊的數據類型  其實就是一個鍵值對
    //鍵就是當前這條記錄的鍵,使用getkey()取到
    //值就是當前這條記錄的值,使用getValue()取到
System.out.println(entry.getKey()+""+entry.getValue());
}

② for(Entry<String, String>  y:set){
System.out.println(y.getKey()+"----"+y.getValue());
}
 
 

 

 
 
 
 


免責聲明!

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



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