1. 程式人生 > >集合及相關類

集合及相關類

集合

一:集合概念與框架結構

存儲一個班學員信息,假定一個班容納20名學員
使用數組
特點:長度固定,遍歷速度快 可以存儲基本類型和引用類型
如果並不知道程序運行時會需要多少對象,或者需要更復雜方式存儲對象——可以使用Java集合框架
集合的概念:
集合:Java API所提供的一系列類的實例,可以用於動態存放多個對象。
Java集合框架提供了一套性能優良、使用方便的接口和類,它們位於java.util包中
特點:長度不固定,只能存儲引用類型對象
java集合框架:
技術分享圖片
List 接口存儲一組不唯一(可重復),有序(插入順序)的對象
Set 接口存儲一組唯一(不可重復)的對象
Map接口存儲一組鍵值對象,提供key到value的映射

collection接口中定義的方法
int size();  返回此collection中的元素數
boolean isEmpty(); 判斷此collection中是否包含元素。
boolean contains(Object obj); 判斷此collection是否包含指定的元素。
boolean add(Object element);  向此collection中添加元素。
boolean remove(Object element); 從此collection中移除指定的元素。
void clear();  移除些collection中所有的元素。
Iterator iterator();  返回在此collection的元素上進行叠代的叠代器
Object[] toArray(); 把此collection轉成數組。
存儲特點
Collection接口-定義了存取對象的方法。兩個常用的子接口:
List接口:存放的元素有序且允許有重復的集合接口。
Set接口:存放的元素不包含重復元素的集合接口。

二: List集合及其實現類

List接口是Collection接口的子接口
實現List接口的集合類中的元素是有序的,且允許重復。
List集合中的元素都對應一個整數型的序號記載其在集合中的位置,可以根據序號存取集合中的元素。
JDK API所提供的List集合類常用的有
ArrayList
LinkedList
List接口比Collection接口中新增的幾個實用方法:

    • public Object get(int index);
    • 返回列表中的元素數
    • public Object add(int index, Object element);
    • 在列表的指定位置插入指定元素.將當前處於該位置的元素(如果有的話)和所有後續元素向右移動
    • public Object set(int?index, Object?element) ;
    • 用指定元素替換列表中指定位置的元素
    • public Object remove(int?index);
    • 移除列表中指定位置的元素
    • public ListIterator listIterator()
    • 返回此列表元素的列表叠代器
      ArrayList:
      ArrayList是使用數組結構實現的List集合。

優點:
對於使用索引取出元素有較好的效率
它使用索引來快速定位對象

缺點:
元素做刪除或插入速度較慢
因為使用了數組,需要移動後面的元素以調整索引順序。
LinkList:
LinkedList是使用雙向鏈表實現的集合。
LinkedList新增了一些插入、刪除的方法。

優點:
對頻繁的插入或刪除元素有較好的效率
缺點:
查詢元素時,效率低,因為要從第一個元素查找。
ArrayList和LinkedList的使用情況
ArrayList遍歷元素和隨機訪問元素的效率比較高,插入、刪除等操作頻繁時性能低下
LinkedList插入、刪除元素時效率較高,查找、遍歷效率較低

三:叠代器的使用

Iterator是專門的叠代輸出接口。所謂的叠代輸出就是將元素進行判斷,判斷是否有內容,如果有內容則把內容取出。
Iterator對象稱作叠代器,用以方便的實現對集合內元素的遍歷操作。
所有實現了Collection接口的集合類都有一個iterator()方法用以返回一個實現了Iterator接口的對象。
Iterator it = coll.iterator();
while(it.hasNext()){
it.next();
}
叠代器的使用方法:
Iterator接口中定義了如下方法:
boolean hasNext(); //判斷遊標右邊是否有元素。
Object next(); //返回遊標右邊的元素並將遊標移動到下一個位置。
另一種遍歷集合的方法:
用增強for遍歷集合中的元素
凡是能用 Iterator 叠代的集合都可以用JDK5.0中增強的for循環來更簡便的遍歷。
List<String> list=new ArrayList<String>();

eg: for(String data:list){
System.out.print(data+” ”)
}

四:Set接口的實現類

Set接口沒有提供Collection接口額外的方法,但實現Set接口的集合類中的元素是不可重復的。

JDK API中所提供的Set集合類常用的有:
HashSet:散列存放
TreeSet:有序存放
LinkedHashSet
HashSet的存儲原理
根據每個對象的哈希碼值(調用hashCode()獲得)用固定的算法算出它的存儲索引,把對象存放在一個叫散列表的相應位置(表元)中:
如果對應的位置沒有其它元素,就只需要直接存入。
如果該位置有元素了,會將新對象跟該位置的所有對象進行比較(調用equals()),以查看是否已經存在了:還不存在就存放,已經存在就不存儲。
HashSet集合的特點及使用技巧
HashSet不保存元素的加入順序。
HashSet接口存、取、刪對象都有很高的效率。
對於要存放到HashSet集合中的對象,對應的類可以重寫hashCode(Object obj)方法和equals()以實現對象相等規則的編寫。
Treeset集合的特點:
TreeSet:可以對加入其中的元素進行排序。但前提是,必須指定排序規則。

構造方法: public?TreeSet()
如果使用TreeSet的無參構造實例化TreeSet集合,則加入到TreeSet集合中的元素所對應的類必須實現java.lang. Comparable<T>接口,復寫其中的int?compareTo(T?o)方法,並在方法中編寫排序規則。
Comparator接口的使用

使用Comparable接口定義排序順序有局限性:實現此接口的類只能按compareTo()定義的這一種方式排序。
如果同一類對象要有多種排序方式,應該為該類定義不同的比較器(實現Comparator接口的類)TreeSet有一個構造方法允許給定比較器,它就會根據給定的比較器對元素進行排序.
Comparator接口中的比較方法:
public int compare(Object obj1, Object obj2); 該方法如果
返回 0,表示 obj1 == obj2
返回正數,表示 obj1 > obj2
返回負數,表示 obj1 < obj2

五:Map集合

特點:
實現Map接口的集合類用來存儲“鍵-值”映射對。
不能包含重復的鍵,每個鍵最多只能映射到一個值,值可以重復。
JDK API中Map接口的實現類常用的有:
HashMap
TreeMap
Hashtable (不常用)
Properties
Map接口中的常用方法

  • Object put(Object key, Object value); //將指定的“鍵-值”對存入Map中
  • Object get(Object key);  //返回指定鍵所映射的值
  • Object remove(Object key); //根據指定的鍵把此“鍵-值”對從Map中移除。
  • boolean containsKey(Object?key); //判斷此Map是否包含指定鍵的“鍵-值”對。
  • boolean containsValue(Object?value);  //判斷此Map是否包含指定值的“鍵-值”對。
  • boolean isEmpty();  //判斷此Map中是否有元素。
  • int size();  //獲得些Map中“鍵-值”對的數量。
  • void clear();  //清空Map中的所有“鍵-值”對。
  • Set keySet();   //返回此Map中包含的鍵的Set集。
  • Collection values();  //返回此Map中包含的值的Collection集。
  • Set<Map.Entry<K,V>>?entrySet() 將所有包含鍵-值對的Map.Entry收集到Set
    Map.Entry接口
    Map.Entry是Map中內部定義的一個接口,專門用來保存key?value的內容。
    HashMap類與TreeMap類
    HashMap存儲結構使用哈希表,使用“鍵”進行散列存放。所以根據“鍵”去取“值”的效率很高。
    TreeMap中的“key-value”對的“key”必須是可“排序”的。
    HashTable類
    舊版的Hashtable,操作大多跟HashMap相同,只是它保證線程的同步。
    它有一個子類Properties(屬性集)比較常用:
    Properties 類表示了一個持久的屬性集。Properties 可保存在流中或從流中加載。屬性集中每個鍵及其對應值都是一個字符串。
    不建議使用 put 和 putAll 這類存放元素方法,應該使用 setProperty(String?key, String?value)方法,因為存放的“鍵-值”對都是字符串。類似取值也應該使用getProperty(String key)。
    HashMap和Hashtable區別
    1. 1 HashMap不同步,Hashtable同步
    2. 2 HashMap可以存儲null鍵null值,Hashtable不可以
    3. 3 HashMap多線程操作環境下效率高,Hashtable多線程操作環境下效率低

集合及相關類