標籤:
首先,集合與數組的區別?
1. 長度: 數組固定;集合可變。
2. 儲存類型: 數組儲存基礎資料型別 (Elementary Data Type)和對象;集合只能儲存基礎資料型別 (Elementary Data Type)。
數組儲存的元素必須是一個資料類型;集合儲存物件可以是不同類型。
集合類(為什麼出現集合類??)
物件導向語言對事物的體現都是以對象的形式,所以為了方便對多個對象的操作,就對對象進行儲存,
集合就是儲存物件最常用的一個方式。
Collection介面
|--List: 有序,元素都有索引。 元素可以重複。
|--ArrayList: 底層的資料結構是數組,線程不同步
|--LinkedList: 底層的資料結構是鏈表,線程不同步
|--Vector: 底層的資料結構是數組,線程同步
取出list集合中元素的方式:
get(int index):通過腳標擷取元素
iterator():通過迭代方法擷取迭代器對象
|--Set: 無序,不可以儲存重複元素。 必須保證元素唯一性。
|--HashSet: 底層資料結構是雜湊表,線程不同步,無序高效。
HashSet集合保證元素唯一性:通過元素的hashCode方法,和equals方法完成。
|--TreeSet: 底層資料結構是二叉樹,對集合中的元素進行指定順序的排序,不同步
用於對set集合進行元素的指定順序排序,排序需要依據元素自身具備的比較性。
1. 讓元素自身具備比較性,元素實現comparable介面,覆蓋compareTo方法。這種方式也稱為元素的自然排序
class Student implements Comparable{ //該介面強制讓學生具備比較性
private String name;
private int age;
Student(String name, int age){
this.name = name;
this.age = age;
}
public int compateTo(Object obj){
if(!(obj instanceof Student))
throw new RuntimeException("not a student");
Student s = (Student)obj;
if(this.age > s.age)
return 1;
if(this.age = s.age)
return this.name.compareTo(s.name);
return -1;
}
}
2. 當元素自身不具備比較性時,或者具備的比較性不是所需要的,這時需要讓集合自身具備比較性。
定義一個實現了Comparator介面的比較子,並覆蓋compare方法,並將該類對象作為實際參數傳遞給TreeSet集合的建構函式。
class StrLenComparator implements Comparator{ //元素自身具備比較性不是所需要的,定義比較子
public int compare(Object o1, Object o2){
String s1 = (String)o1;
String s2 = (String)o2;
int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
if(num == 0)
return s1.compareTo(s2);
return num;
}
}
Iterator介面: 用於取集合中的元素。
Iterator it = coll.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
Map集合
|--Hashtable: 底層是雜湊表資料結構,是線程同步的。 不可以儲存null鍵null值
|--HashMap: 底層是雜湊表資料結構,是線程不同步的。 可以儲存null,替代了Hashtable
|--TreeMap: 底層是二叉樹結構,可以對map集合中的鍵進行指定順序的排序。
Map和Collection區別???
|--Collection一次存一個元素;Map一次存一對元素。
|--Map儲存元素用put方法;Collection使用add方法。
|--Collection是單列集合;Map是雙列集合。
|--Map中的儲存的一對元素:一個是鍵,一個是值,鍵與值之間有映射關係。
|--Map集合沒有取出元素的方法,需要先轉成set集合,再通過迭代器取出元素。
特點:要保證map集合中鍵的唯一性。
把Map集合轉成set的方法(map中沒有迭代器,所以想要取出map中的所有元素,需要將map集合轉成set集合)
Set keySet();
Set entrySet(); //取的是鍵和值的映射關係
註:Entry就是Map介面中的內部介面:
為什麼要定義在map內部呢?entry是訪問索引值關係的入口,是map的入口,訪問的是map中的索引值對。
使用集合的技巧:
|--看到Array就是數組結構,有角標,查詢速度很快;
|--看到link就是鏈表結構:增刪速度快,
而且有特有方法:addFirst, addLast, removeFirst(), removeLast(), getFirst(), getLast()
|--看到hash就是雜湊表,
就要想到雜湊值,
就要想到唯一性,
就要想到存入到該結構中的元素必須覆蓋hashCode,equals方法
|--看到tree就是二叉樹,就要想到排序,就想到要用比較。
比較的兩種方式:實現Comparable介面,覆蓋compareTo方法
實現Comparable介面的比較子,覆蓋compare方法
|--LinkedHashSet,LinkedHashMap:這兩個集合可以保證雜湊表存入順序和取出順序一致,保證雜湊表有序。
集合什麼時候用??
|--當儲存的是一個元素時,就用Collection。當儲存物件之間存在映射關係時,就使用map集合
|--保證唯一,就用set;不保證唯一,就要list
Collection和Collections區別??
|--Collections是個java.util下的類,是針對集合類的一個工具類,提供一系列靜態方法,實現對集合的操作。
|--Collection是個java.util下的介面,是各種集合結構的父介面。
泛型:JDK1.5版本以後出現的新特性,用於解決安全問題,是一個安全機制。
泛型格式:通過<>來定義要操作的引用資料類型。<>就是用來接受類型的。
好處:
1. 將運行時期出現的問題,轉移到了編譯時間期,方便程式員解決問題,讓運行時問題減少,安全。
2. 避免了強制轉換的麻煩。 在使用java提供的對象時,什麼時候寫泛型呢?通常在集合架構中很常見。 什麼時候定義泛型類?當類中要操作的引用資料類型不確定的時候,早期定義Object來完成擴充,現在定義泛型來完成擴充。 泛型類定義的泛型,在整個類中有效。如果被方法使用,
那麼泛型類的對象明確要操作的具體類型後,所有要操作的類型就已經固定了。
為了讓不同方法可以操作不同類型,而且類型還不確定。那麼可以將泛型定義在方法上。
靜態泛型: 靜態方法不可以訪問類上定義的泛型,如果靜態方法操作的應用資料類型不確定,可以將泛型定義在方法上。 泛型介面:泛型定義在介面上
Java基礎-集合架構