集合及相關類
存儲一個班學員信息,假定一個班容納20名學員
使用數組
特點:長度固定,遍歷速度快 可以存儲基本類型和引用類型
如果並不知道程序運行時會需要多少對象,或者需要更復雜方式存儲對象——可以使用Java集合框架
集合的概念:
集合:Java API所提供的一系列類的實例,可以用於動態存放多個對象。
Java集合框架提供了一套性能優良、使用方便的接口和類,它們位於java.util包中
特點:長度不固定,只能存儲引用類型對象
java集合框架:
List 接口存儲一組不唯一(可重復),有序(插入順序)的對象
Set 接口存儲一組唯一(不可重復)的對象
Map接口存儲一組鍵值對象,提供key到value的映射
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的元素上進行叠代的叠代器
存儲特點
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 HashMap不同步,Hashtable同步
- 2 HashMap可以存儲null鍵null值,Hashtable不可以
- 3 HashMap多線程操作環境下效率高,Hashtable多線程操作環境下效率低
集合及相關類