Array是數組,不在集合框架范疇之內,一旦選定了,它的容量大小就不能改變了,所以通常在編程中不選用數組來(lái)存放.
集合 :
集合對象:用于管理其他若干對象的對象
數組:長(cháng)度不可變
List: 有順序的,元素可以重復
遍歷:for 迭代
排序:Comparable Comparator Collections.sort()
ArrayList:底層用數組實(shí)現的List
特點(diǎn):查詢(xún)效率高,增刪效率低 輕量級 線(xiàn)程不安全
LinkedList:底層用雙向循環(huán)鏈表 實(shí)現的List
特點(diǎn):查詢(xún)效率低,增刪效率高
Vector: 底層用數組實(shí)現List接口的另一個(gè)類(lèi)
特點(diǎn):重量級,占據更多的系統開(kāi)銷(xiāo) 線(xiàn)程安全
Set:無(wú)順序的,元素不可重復(值不相同)
遍歷:迭代
排序:SortedSet
HashSet:采用哈希算法來(lái)實(shí)現Set接口
唯一性保證:重復對象equals方法返回為true
重復對象hashCode方法返回相同的整數
不同對象 哈希碼 盡量保證不同(提高效率)
SortedSet:對一個(gè)Set排序
TreeSet:在元素添加的同時(shí),進(jìn)行排序。也要給出排序規則
唯一性保證:根據排序規則,compareTo方法返回為0,就可以認定兩個(gè)對象中有一個(gè)是重復對象。
Map:元素是鍵值對 key:唯一,不可重復 value:可重復
遍歷:先迭代遍歷key的集合,再根據key得到value
HashMap:輕量級 線(xiàn)程不安全 允許key或者value是null
Hashtable:重量級 線(xiàn)程安全 不允許key或者value是null
Properties:Hashtable的子類(lèi),key和value都是String
SortedMap:元素自動(dòng)對key排序
TreeMap:
集合是指一個(gè)對象可以容納了多個(gè)對象(不是引用),這個(gè)集合對象主要用來(lái)管理維護一系列相似的對象。
集合接口類(lèi)層次 :
位于package java.util.*;
Collection
↑
|ˉˉˉˉˉˉ|
Set List Map
↑ ↑
| |
SortedSet SortedMap
1) Set: 集合類(lèi)中不允許有重復對象;
2) SortedSet: 和Set接口同,但元素按升序排列;
3) List: 元素加載和移出時(shí)按照順序,可以保存重復對象。
4) Map: (key-value對)存儲了唯一關(guān)鍵字辨識和對應的值。
5) SortedMap: 和Map類(lèi)同,但對象按他們關(guān)鍵字的升序排列。
集合類(lèi)層次 :
(注:JAVA1.5對JAVA1.4的最大改進(jìn)就是增加了對范型的支持)
Collection
↑
|ˉˉˉˉˉˉ|
HashSet LinkedList Hashtable
(Set) Vector, ArrayList Hashmap
(List) (Map)
↑ ↑
| |
TreeSet TreeMap
(SortedSet) (SortedMap)
Collection接口的方法:
add(Object o)
addAll(Collection c)
contains(Object o)
containsAll(Collection c)
remove(Object o)
removeAll(Collection c)
clear()
equals(Object o)
isEmpty()
iterator()
size()
toArray()
toArray(Object[] o)
五個(gè)最常用的集合類(lèi)之間的區別和聯(lián)系:
1.ArrayList: 元素單個(gè),效率高,多用于查詢(xún)
2.Vector: 元素單個(gè),線(xiàn)程安全,多用于查詢(xún)
3.LinkedList:元素單個(gè),多用于插入和刪除
4.HashMap: 元素成對,元素可為空
5.HashTable: 元素成對,線(xiàn)程安全,元素不可為空
ArrayList
底層是Object數組,所以ArrayList具有數組的查詢(xún)速度快的優(yōu)點(diǎn)以及增刪速度慢的缺點(diǎn)。
而在LinkedList的底層是一種雙向循環(huán)鏈表。在此鏈表上每一個(gè)數據節點(diǎn)都由三部分組成:前指針(指向前面的節點(diǎn)的位置),數據,后指針(指向后面的節點(diǎn)的位置)。最后一個(gè)節點(diǎn)的后指針指向第一個(gè)節點(diǎn)的前指針,形成一個(gè)循環(huán)。
雙向循環(huán)鏈表的查詢(xún)效率低但是增刪效率高。
ArrayList和LinkedList在用法上沒(méi)有區別,但是在功能上還是有區別的。
LinkedList
經(jīng)常用在增刪操作較多而查詢(xún)操作很少的情況下:隊列和堆棧。
隊列:先進(jìn)先出的數據結構。
棧:后進(jìn)先出的數據結構。
注意:使用棧的時(shí)候一定不能提供方法讓不是最后一個(gè)元素的元素獲得出棧的機會(huì )。
Vector
(與ArrayList相似,區別是Vector是重量級的組件,使用使消耗的資源比較多。)
結論:在考慮并發(fā)的情況下用Vector(保證線(xiàn)程的安全)。
在不考慮并發(fā)的情況下用ArrayList(不能保證線(xiàn)程的安全)。
java.util.stack(stack即為堆棧)的父類(lèi)為Vector??墒莝tack的父類(lèi)是最不應該為Vector的。因為Vector的底層是數組,且Vector有g(shù)et方法(意味著(zhù)它可能訪(fǎng)問(wèn)到并不屬于最后一個(gè)位置元素的其他元素,很不安全)。
對于堆棧和隊列只能用push類(lèi)和get類(lèi)。
Stack類(lèi)以后不要輕易使用。
實(shí)現棧一定要用LinkedList。
(在JAVA1.5中,collection有queue來(lái)實(shí)現隊列。)
Set-HashSet實(shí)現類(lèi):
遍歷一個(gè)Set的方法只有一個(gè):迭代器(interator)。
HashSet中元素是無(wú)序的(這個(gè)無(wú)序指的是數據的添加順序和后來(lái)的排列順序不同),而且元素不可重復。
在Object中除了有finalize(),toString(),equals(),還有hashCode()。
HashSet底層用的也是數組。
當向數組中利用add(Object o)添加對象的時(shí)候,系統先找對象的hashCode:
int hc=o.hashCode(); 返回的hashCode為整數值。
IntI=hc%n;(n為數組的長(cháng)度),取得余數后,利用余數向數組中相應的位置添加數據,以n為6為例,如果I=0則放在數組a[0]位置,如果I=1,則放在數組a[1]位置。如果equals()返回的值為true,則說(shuō)明數據重復。如果equals()返回的值為false,則再找其他的位置進(jìn)行比較。這樣的機制就導致兩個(gè)相同的對象有可能重復地添加到數組中,因為他們的hashCode不同。
如果我們能夠使兩個(gè)相同的對象具有相同hashcode,才能在equals()返回為真。
在實(shí)例中,定義student對象時(shí)覆蓋它的hashcode。
因為String類(lèi)是自動(dòng)覆蓋的,所以當比較String類(lèi)的對象的時(shí)候,就不會(huì )出現有兩個(gè)相同的string對象的情況。
現在,在大部分的JDK中,都已經(jīng)要求覆蓋了hashCode。
結論:如將自定義類(lèi)用hashSet來(lái)添加對象,一定要覆蓋hashcode()和equals(),覆蓋的原則是保證當兩個(gè)對象hashcode返回相同的整數,而且equals()返回值為T(mén)rue。
如果偷懶,沒(méi)有設定equals(),就會(huì )造成返回hashCode雖然結果相同,但在程序執行的過(guò)程中會(huì )多次地調用equals(),從而影響程序執行的效率。
我們要保證相同對象的返回的hashCode一定相同,也要保證不相同的對象的hashCode盡可能不同(因為數組的邊界性,hashCode還是可能相同的)。
例子:
public int hashCode(){
return name.hashcode()+age;
}
這個(gè)例子保證了相同姓名和年齡的記錄返回的hashCode是相同的。
使用hashSet的優(yōu)點(diǎn):
hashSet的底層是數組,其查詢(xún)效率非常高。而且在增加和刪除的時(shí)候由于運用的hashCode的比較開(kāi)確定添加元素的位置,所以不存在元素的偏移,所以效率也非常高。因為hashSet查詢(xún)和刪除和增加元素的效率都非常高。
但是hashSet增刪的高效率是通過(guò)花費大量的空間換來(lái)的:因為空間越大,取余數相同的情況就越小。HashSet這種算法會(huì )建立許多無(wú)用的空間。
使用hashSet類(lèi)時(shí)要注意,如果發(fā)生沖突,就會(huì )出現遍歷整個(gè)數組的情況,這樣就使得效率非常的低。
1.1.4. 比較
Collections類(lèi)(工具類(lèi)―――全是static 方法)
Public static int binarySearch(List list,Object key)
Public static void Sort(List list,Comparator com)
Public static void sort(List list)
方法一:
Comparator接口
Int compare(Object a,Object b)
Boolean equals(Object o)
例子:
import java.util.*;
public class Test {
public static void main(String[] arg) {
ArrayList al = new ArrayList();
Person p1 = new Person("dudi");
Person p2 = new Person("cony");
Person p3 = new Person("aihao");
al.add(p1);
al.add(p2);
al.add(p3);
Collections.sort(al,p1);
for(Iterator it = al.iterator();it.hasNext();){
Person p = (Person)it.next();
System.out.println(p.name);
}
}
}
class Person implements java.util.Comparator
{
public String name;
public Person(String name){
this.name = name;
}
public int compare(Object a,Object b){
if(a instanceof Person&&b instanceof Person){
Person pa = (Person)a;
Person pb = (Person)b;
return pa.name.compareTo(pb.name);
}
return 0;
}
public boolean equals(Object a){return true;}
}
方法二
Java.lang.Comparable
Public int compareTo(Object o)
Class Person implements java.lang.Comparable{
Public int compareTo(Object o){
Comparable c1=(Comparable)this;
Comparable c2=(Comparable)o;
Return c1.name.compareTo(c2.name );
}
}
……………………………….
}