------<a href="http://www.itheima.com" target="_blank" rel="external nofollow" target="blank">Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練</a>、期待與您交流! -------
集合架構:用于存儲資料的容器。
特點:
1、對象封裝資料,對象多了也需要存儲。集合用于存儲對象。
2、對象的個數确定可以使用數組,但是不确定怎麼辦?可以用集合。因為集合是可變長度的。
集合和數組的差別:
1、數組是固定長度的;集合可變長度的。
2、數組可以存儲基本資料類型,也可以存儲引用資料類型;集合隻能存儲引用資料類型。
3、數組存儲的元素必須是同一個資料類型;集合存儲的對象可以是不同資料類型。
資料結構:就是容器中存儲資料的方式。
對于集合容器,有很多種。因為每一個容器的自身特點不同,其實原理在于每個容器的内部資料結構不同。 集合容器在不斷向上抽取過程中。出現了集合體系。
在使用一個體系時,原則:參閱頂層内容。建立底層對象。
java中集合類的關系圖
Collection接口:
Collection: |--List:有序(元素存入集合的順序和取出的順序一緻),元素都有索引。元素可以重複。
|--Set:無序(存入和取出順序有可能不一緻),不可以存儲重複元素。必須保證元素唯一性。
1、添加:add(object):添加一個元素
addAll(Collection) :添加一個集合中的所有元素
2、删除:clear():将集合中的元素全删除,清空集合
remove(obj) :删除集合中指定的對象 注意:删除成功,集合的長度會改變
removeAll(collection) :删除部分元素。部分元素和傳入Collection一緻
3、判斷: boolean contains(obj) :集合中是否包含指定元素
boolean containsAll(Collection) :集合中是否包含指定的多個元素
boolean isEmpty():集合中是否有元素。
4、擷取: int size():集合中有幾個元素
5、取交集:boolean retainAll(Collection) :對目前集合中保留和指定集合中的相同的元素。如果兩個集合元素相同,傳回flase;如果retainAll修改了目前集合,傳回true
6、擷取集合中所有元素:Iterator iterator():疊代器
7、将集合變成數組: toArray()
Iterator接口:
疊代器:是一個接口。作用:用于取集合中的元素。
boolean hasNext() 如果仍有元素可以疊代,則傳回 true。
E next() 傳回疊代的下一個元素。
void remove() 從疊代器指向的 collection 中移除疊代器傳回的最後一個元素(可選操作)。
每一個集合都有自己的資料結構,都有特定的取出自己内部元素的方式。為了便于操作所有的容器,取出元素。将容器内部的取出方式按照一個統一的規則向外提供,這個規則就是Iterator
接口。 也就說,隻要通過該接口就可以取出Collection集合中的元素,至于每一個具體的容器依據自己的資料結構,如何實作的具體取出細節,這個不用關心,這樣就降低了取出元素和具體
集合的耦合性。
Iterator it = coll.iterator();//擷取容器中的疊代器對象,至于這個對象是是什麼不重要。這對象肯定符合一個規則Iterator接口。
public static void main(String[] args) {
Collection coll = new ArrayList();
coll.add("abc0");
coll.add("abc1");
coll.add("abc2");
//周遊方式1
Iterator it = coll.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
//周遊方式2 此種方法更優,因為疊代器随周遊完畢而釋放。
for(Iterator it = coll.iterator();it.hasNext(); ){
System.out.println(it.next());
}
}
List接口:
List本身是Collection接口的子接口,具備了Collection的所有方法。現在學習List體系特有的共性方法,查閱方法發現List的特有方法都有索引,這是該集合最大的特點。
List:有序(元素存入集合的順序和取出的順序一緻),元素都有索引。元素可以重複。
|--ArrayList:底層的資料結構是數組,線程不同步,ArrayList替代了Vector,查詢元素的速度非常快。
|--LinkedList:底層的資料結構是連結清單,線程不同步,增删元素的速度非常快。
|--Vector:底層的資料結構就是數組,線程同步的,Vector無論查詢和增删都很慢。
1、添加:add(index,element) :在指定的索引位插入元素。
addAll(index,collection) :在指定的索引位插入一堆元素。
2、删除: remove(index) :删除指定索引位的元素。 傳回被删的元素。
3、擷取: Object get(index) :通過索引擷取指定元素。
int indexOf(obj) :擷取指定元素第一次出現的索引位,如果該元素不存在傳回-1;是以,通過-1,可以判斷一個元素是否存在。
int lastIndexOf(Object o) :反向索引指定元素的位置。
List subList(start,end) :擷取子清單。
4、修改:Object set(index,element) :對指定索引位進行元素的修改。
5、擷取所有元素:ListIterator listIterator():list集合特有的疊代器。
List集合支援對元素的增、删、改、查。
List集合因為角标有了自己的擷取元素的方式: 周遊。 for(int x=0; x<list.size(); x++){ sop("get:"+list.get(x)); }
在進行list清單元素疊代的時候,如果想要在疊代過程中,想要對元素進行操作的時候,比如滿足條件添加新元素。會發生.ConcurrentModificationException并發修改異常。
導緻的原因是:
集合引用和疊代器引用在同時操作元素,通過集合擷取到對應的疊代器後,在疊代中,進行集合引用的元素添加,疊代器并不知道,是以會出現異常情況。
解決方法:
既然是在疊代中對元素進行操作,找疊代器的方法最為合适.可是Iterator中隻有hasNext,next,remove方法.通過查閱的它的子接口,ListIterator,發現該清單疊代器接口具備了對元素的
增、删、改、查的動作。
ListIterator是List集合特有的疊代器。
ListIterator it = list.listIterator;//取代Iterator it = list.iterator;
方法摘要:
void add(E e) 将指定的元素插入清單(可選操作)。
boolean hasNext() 以正向周遊清單時,如果清單疊代器有多個元素,則傳回 true(換句話說,如果 next 傳回一個元素而不是抛出異常,則傳回 true)。
boolean hasPrevious() 如果以逆向周遊清單,清單疊代器有多個元素,則傳回 true。
E next() 傳回清單中的下一個元素。
int nextIndex() 傳回對 next 的後續調用所傳回元素的索引。
E previous() 傳回清單中的前一個元素。
int previousIndex() 傳回對 previous 的後續調用所傳回元素的索引。
void remove() 從清單中移除由 next 或 previous 傳回的最後一個元素(可選操作)。
void set(E e) 用指定元素替換 next 或 previous 傳回的最後一個元素(可選操作)。
可變長度數組的原理:
當元素超出數組長度,會産生一個新數組,将原數組的資料複制到新數組中,再将新的元素添加到新數組中。
ArrayList:是按照原數組的50%延長。構造一個初始容量為 10 的空清單。
Vector:是按照原數組的100%延長。
注意:對于list集合,底層判斷元素是否相同,其實用的是元素自身的equals方法完成的。是以建議元素都要複寫equals方法,建立元素對象自己的比較相同的條件依據。
LinkedList的特有方法:
addFirst(); addLast(); 在jdk1.6以後。 offerFirst(); offerLast();
getFirst():擷取連結清單中的第一個元素。如果連結清單為空,抛出NoSuchElementException; getLast();
在jdk1.6以後。peekFirst();擷取連結清單中的第一個元素。如果連結清單為空,傳回null。 peekLast();
removeFirst():擷取連結清單中的第一個元素,但是會删除連結清單中的第一個元素。如果連結清單為空,抛出NoSuchElementException removeLast();
在jdk1.6以後。pollFirst();擷取連結清單中的第一個元素,但是會删除連結清單中的第一個元素。如果連結清單為空,傳回null。 pollLast();
Set接口:
Set接口中的方法和Collection中方法一緻的。Set接口取出方式隻有一種,疊代器。
|--HashSet:底層資料結構是哈希表,線程是不同步的。無序,高效; HashSet集合保證元素唯一性:通過元素的hashCode方法,和equals方法完成的。 當元素的hashCode值
相同時,才繼續判斷元素的equals是否為true。如果為true,那麼視為相同元素,不存。如果為false,那麼存儲。 如果hashCode值不同,那麼不判斷equals,進而提高
對象比較的速度。
|--LinkedHashSet:有序,hashset的子類。
|--TreeSet:對Set集合中的元素的進行指定順序的排序。不同步。TreeSet底層的資料結構就是二叉樹。
對于HashSet集合,判斷元素是否存在,或者删除元素,底層依據的是hashCode方法和equals方法。
TreeSet:
用于對Set集合進行元素的指定順序排序,排序需要依據元素自身具備的比較性。 如果元素不具備比較性,在運作時會發生ClassCastException異常。
是以需要元素實作Comparable接口,強制讓元素具備比較性,複寫compareTo方法。 依據compareTo方法的傳回值,确定元素在TreeSet資料結構中的位置。
TreeSet方法保證元素唯一性的方式:就是參考比較方法的結果是否為0,如果return 0,視為兩個對象重複,不存。
TreeSet集合排序有兩種方式,Comparable和Comparator差別:
1、讓元素自身具備比較性,需要元素對象實作Comparable接口,覆寫compareTo方法。
2、讓集合自身具備比較性,需要定義一個實作了Comparator接口的比較器,并覆寫compare方法,并将該類對象作為實際參數傳遞給TreeSet集合的構造函數。
第二種方式較為靈活。
Map接口:
|--Hashtable:底層是哈希表資料結構,是線程同步的。不可以存儲null鍵,null值。
|--HashMap:底層是哈希表資料結構,是線程不同步的。可以存儲null鍵,null值。替代了Hashtable. |--TreeMap:底層是二叉樹結構,可以對map集合中的鍵進行指定順序的排序。
Map集合存儲和Collection有着很大不同:
1、Collection一次存一個元素;Map一次存一對元素。
2、Collection是單列集合;Map是雙列集合。
Map中的存儲的一對元素:一個是鍵,一個是值,鍵與值之間有對應(映射)關系。 特點:要保證map集合中鍵的唯一性。
1、添加:put(key,value):當存儲的鍵相同時,新的值會替換老的值,并将老值傳回。如果鍵沒有重複,傳回null。
void putAll(Map);
2、删除:void clear():清空
value remove(key) :删除指定鍵。
3、判斷:boolean isEmpty():是否為空
boolean containsKey(key):是否包含key
boolean containsValue(value) :是否包含value
4、取出:int size():傳回長度
value get(key) :通過指定鍵擷取對應的值。如果傳回null,可以判斷該鍵不存在。當然有特殊情況,就是在hashmap集合中,是可以存儲null鍵null值的。
Collection values():擷取map集合中的所有的值。
5、想要擷取map中的所有元素:
原理:map中是沒有疊代器的,collection具備疊代器,隻要将map集合轉成Set集合,可以使用疊代器了。之是以轉成set,是因為map集合具備着鍵的唯一性,其實set集合就來自于
map,set集合底層其實用的就是 map的方法。
把map集合轉成set的方法: Set keySet();//将map集合中的鍵都取出存放到set集合中
Set entrySet();//取的是鍵和值的映射關系。
方式一:keySet()方法:可以将map集合中的鍵都取出存放到set集合中。對set集合進行疊代。疊代完成,再通過get方法對擷取到的鍵進行值的擷取。
Set keySet = map.keySet();
Iterator it = keySet.iterator();
while(it.hasNext()) {
Object key = it.next();
Object value = map.get(key);
System.out.println(key+":"+value);
}
方式二:entrySet()方法:map集合中的映射關系Map.Entry都取出存放到set集合中。通過Map.Entry的getKey()和getValue()方法擷取到鍵和值。
Set entrySet = map.entrySet();
Iterator it = entrySet.iterator();
while(it.hasNext()) {
Map.Entry me = (Map.Entry)it.next();
System.out.println(me.getKey()+"::::"+me.getValue());
}
Collections:它的出現給集合操作提供了更多的功能。這個類不需要建立對象,内部提供的都是靜态方法。
方法摘要:
Collections.sort(list);//list集合進行元素的自然順序排序。
Collections.sort(list,new ComparatorByLen());//按指定的比較器方法排序。
Collections.max(list); //傳回list中字典順序最大的元素。
int index = Collections.binarySearch(list,"zz");//二分查找,傳回角标。 Collections.reverseOrder();//逆向反轉排序。
Collections.shuffle(list);//随機對list中的元素進行位置的置換。
Collection 和 Collections的差別:
Collections是個java.util下的類,是針對集合類的一個工具類,提供一系列靜态方法,實作對集合的查找、排序、替換、線程安全化(将非同步的集合轉換成同步的)等操作。
Collection是個java.util下的接口,它是各種集合結構的父接口,繼承于它的接口主要有Set和List,提供了關于集合的一些操作,如插入、删除、判斷一個元素是否其成員、周遊等。
Arrays:用于操作數組對象的工具類,裡面都是靜态方法。
static List asList():将數組轉換成list集合。
注意:數組是固定長度,不可以使用集合對象增加或者删除等,會改變數組長度的功能方法。比如add、remove、clear。(會報不支援操作異常UnsupportedOperationException);
如果數組中存儲的引用資料類型,直接作為集合的元素可以直接用集合方法操作。 如果數組中存儲的是基本資料類型,asList會将數組實體作為集合元素存在。