JAVA集合出現:
1.由於傳統數組的長度大小是一定的,而集合的長度大小是不固定的,而且集合只能存儲引用類型數據,不能存儲基本類型數據;(JAVA的Integer 是對int的封裝);
JAVA基本分類:
1.List(列表)
2.Set(集合)
3.Map(映射)
Collection 接口 :Collection是最基本的集合接口,聲明瞭適用於JAVA集合(只包括Set和List)的通用方法。 Set 和List 都繼承了Conllection,Map;
Collection接口的方法:
boolean add(Object o) :向集合中加入一個對象的引用
void clear():刪除集合中所有的對象,即不再持有這些對象的引用
boolean isEmpty() :判斷集合是否爲空
boolean contains(Object o) : 判斷集合中是否持有特定對象的引用
Iterartor iterator() :返回一個Iterator對象,可以用來遍歷集合中的元素
boolean remove(Object o) :從集合中刪除一個對象的引用
int size() :返回集合中元素的數目
Object[] toArray() : 返回一個數組,該數組中包括集合中的所有元素
Iterator() 和toArray() 方法都用於集合的所有的元素,前者返回一個Iterator對象,後者返回一個包含集合中所有元素的數組。
1.Set(集合): Set是最簡單的一種集合。集合中的對象不按特定的方式排序,並且沒有重複對象。
如果試圖把兩個相同元素加入同一個集合中,add方法返回false。
Set判斷兩個對象相同不是使用==運算符,而是根據equals方法。也就是說,只要兩個對象用equals方法比較返回true,Set就不 會接受這兩個對象。
HashSet :HashSet類按照哈希算法來存取集合中的對象,存取速度比較快 ; 不能保證元素的排列順序,順序有可能發生變化;集合元素可以是null,但只能放入一個null;
不是同步的;
LinkedHashSet:保留插入順序,迭代訪問性能比HashSet好,但插入不如HashSet;
TreeSet:TreeSet類實現了SortedSet接口,能夠對集合中的對象進行排序;TreeSet支持兩種排序方式,自然排序 和定製排序,其中自然排序爲默認的排序方式。向TreeSet中加入的應該是同一個類的對象;自然排序是根據集合元素的大小,以升序排列,如果要定製排序,應該使用Comparator接口,實現 int compare(T o1,T o2)方法;
示例代碼如下;
package test;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
public class SetTest {
public static void main(String[] args){
//載入自定義的排序規則
Set<Student> qingHua=new TreeSet<Student>(new TestComparator());
qingHua.add(new Student(170,120,100.1));
qingHua.add(new Student(175,115,100.2));
qingHua.add(new Student(180,110,100.3));
for(Student s:qingHua){
System.out.println("Height:"+s.getHeight()+" Weight:"+s.getWeight()+" grade:"+s.getGrade());
}
Student.sortMold=2;
for(Student s:qingHua){
System.out.println("Height:"+s.getHeight()+" Weight:"+s.getWeight()+" grade:"+s.getGrade());
}
Student.sortMold=3;
for(Student s:qingHua){
System.out.println("Height:"+s.getHeight()+" Weight:"+s.getWeight()+" grade:"+s.getGrade());
}
}
}
class TestComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
if(Student.sortMold==1){
if(o1.getHeight()>o2.getHeight()){
//返回-1的是需要的順序
return -1;
}else if(o1.getHeight()<o2.getHeight()){
return 1;
}else{
return 0;
}
}else if(Student.sortMold==2){
if(o1.getWeight()<o1.getWeight()){
return 1;
}else if(o1.getWeight()>o1.getWeight()){
return -1;
}else{
return 0;
}
}else if(Student.sortMold==3){
if(o1.getGrade()>o2.getGrade()){
return -1;
}else if(o1.getGrade()<o2.getGrade()){
return 1;
}else{
return 0;
}
}
return 0;
}
}
class Student{
public static int sortMold =1; //排序模式,1爲身高,2爲體重,3爲成績
private int height; //身高
private int weight; //體重
private Double grade; //成績
Student(int height,int weight,Double grade){
this.height=height;
this.weight=weight;
this.grade=grade;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public Double getGrade() {
return grade;
}
public void setGrade(Double grade) {
this.grade = grade;
}
}
2.List(列表): List的特徵是其元素以線性方式存儲,集合中可以存放重複對象。
ArrayList 是一個可改變大小的數組.當更多的元素加入到ArrayList中時,其大小將會動態地增長.內部的元素可以直接通過get與set方法進行訪問,因爲ArrayList本質上就是一個數組.
LinkedList 是一個雙鏈表,在添加和刪除元素時具有比ArrayList更好的性能.但在get與set方面弱於ArrayList.
當然,這些對比都是指數據量很大或者操作很頻繁的情況下的對比,如果數據和運算量很小,那麼對比將失去意義.
Vector 和ArrayList類似,但屬於強同步類。如果你的程序本身是線程安全的(thread-safe,沒有在多個線程之間共享同一個集合/對象),那麼使用ArrayList是更好的選擇。
Vector和ArrayList在更多元素添加進來時會請求更大的空間。Vector每次請求其大小的雙倍空間,而ArrayList每次對size增長50%.而 LinkedList
還實現了 Queue 接口,該接口比List提供了更多的方法,包括 offer(),peek(),poll()等.
注意: 默認情況下ArrayList的初始容量非常小,所以如果可以預估數據量的話,分配一個較大的初始值屬於最佳實踐,這樣可以減少調整大小的開銷。
3.Map(映射):Map主要用於存儲健值對,根據鍵得到值,因此不允許鍵重複(重複了覆蓋了),但允許值重複。
HashMap:
Hashmap 是一個最常用的Map,它根據鍵的HashCode 值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度,遍歷時,取得數據的順序是完全隨機的。
HashMap最多隻允許一條記錄的鍵爲Null;允 許多條記錄的值爲 Null;
HashMap不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap;可能會導致數據的不一致。
如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
Hashtable:HashMap類似,它繼承自Dictionary類,
不同的是:它不允許記錄的鍵或者值爲空;
它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,因此也導致了 Hashtable在寫入時會比較慢。
LinkedHashMap:
保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的.也可以 在構造時用帶參數,按照應用次數排序。
在遍歷的時候會比HashMap慢,不過有種情況例外,當HashMap容量很大,實際數據較少時,遍歷起來可能會 比LinkedHashMap慢,因爲LinkedHashMap的遍歷速度只和實際數據有關,和容量無關,而HashMap的遍歷速度和他的容量有關。
TreeMap:實現SortMap接口,能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,也可以指定排序的比較器,當用Iterator 遍歷TreeMap時,得到的記錄是排過序的。
一般情況下,我們用的最多的是HashMap,HashMap裏面存入的鍵值對在取出的時候是隨機的,它根據鍵的HashCode值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度.
在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。
TreeMap取出來的是排序後的鍵值對。但如果您要按自然順序或自定義順序遍歷鍵,那麼TreeMap會更好。
LinkedHashMap 是HashMap的一個子類,如果需要輸出的順序和輸入的相同,那麼用LinkedHashMap可以實現,它還可以按讀取順序來排列,像連接池中可以應 用。