今天回顧類集的基本內容:java
(一). 類集數組
實際上就是一個動態的對象數組,與通常的對象數組不一樣,類集中的對象內容能夠任意擴充。安全
類集的特徵:框架
1.這種框架是高性能的;dom
2.框架必須容許不一樣類型的類集以相同的方式和高度互操做方式工做;異步
3.類集必須是容易擴展和修改的。性能
(二)類集框架主要接口spa
No線程 |
接口設計 |
描述 |
1 |
Collection |
是存放一組單值的最大接口,所謂的單值是指集合中的每一個元素都是一個對象。通常不多會直接使用此接口直接操做。 |
2 |
List |
是Collection接口的子接口,也是最經常使用的接口,此接口對Collection接口進行了大量的擴充,裏面的內容是容許重複的。 |
3 |
Set |
是Collection接口的子類,沒有對Collection接口進行擴充,裏面不容許存放重複內容。 |
4 |
Map |
Map是存放一對值的最大接口,即,接口中的每一個元素都是一對,以keyvalue的形式保存。 |
5 |
Iterator |
集合的輸出接口,用於輸出集合中的內容,只能進行從前到後的單向輸出。 |
6 |
ListIterator |
是Iterator的子接口,能夠進行雙向輸出。 |
7 |
Enumeration |
是最先的輸出接口,用於輸出指定集合中的內容。 |
8 |
SortedSet |
單值的排序接口,實現此接口的集合類,裏面的內容是能夠排序的,使用比較器排序。 |
9 |
SortedMap |
存放一對值的排序接口,實現此接口的集合類,裏面的內容按照key排序,使用比較器排序。 |
10 |
Queue |
隊列接口,此接口的子類能夠實現隊列操做。 |
11 |
Map.Entry |
Map.Entry的內部接口,每一個Map.Entry對象都保存着一對keyvalue的內容,每一個Map接口中都保存多個Map.Entry接口實例。 |
(三)接口的繼承關係
Collection接口:
Map接口:
(四) 接口介紹
4.1 Collection接口
4.1.1 Collection接口的定義
Collection是保存單值集合的最大父接口。 Collection接口定義: public interface Collection<E> extends Iterable<E> JDK 1.5以後爲Collection接口增長了泛型聲明。
4.1.2 Collection接口的方法定義
No. |
方法 |
類型 |
描述 |
1 |
public boolean add(E o) |
普通 |
向集合中插入對象 |
2 |
public boolean addAll(Collection<? extends E> c) |
普通 |
將一個集合的內容插入進來 |
3 |
public void clear() |
普通 |
清除此集合中的全部元素 |
4 |
public boolean contains(Object o) |
普通 |
判斷某一個對象是否在集合中存在 |
5 |
public boolean containsAll(Collection<?> c) |
普通 |
判斷一組對象是否在集合中存在 |
6 |
public boolean equals(Object o) |
普通 |
對象比較 |
7 |
public int hashCode() |
普通 |
哈希碼 |
8 |
public boolean isEmpty() |
普通 |
集合是否爲空 |
9 |
public Iterator<E> iterator() |
普通 |
爲Iterator接口實例化 |
10 |
public boolean remove(Object o) |
普通 |
刪除指定對象 |
11 |
public boolean removeAll(Collection<?> c) |
普通 |
刪除一組對象 |
12 |
public boolean retainAll(Collection<?> c) |
普通 |
保存指定內容 |
13 |
public int size() |
普通 |
求出集合的大小 |
14 |
public Object[] toArray() |
普通 |
將一個集合變爲對象數組 |
15 |
public <T> T[] toArray(T[] a) |
普通 |
指定好返回的對象數組類型 |
4.1.3 Collection接口的使用注意
在通常的開發中,每每不多去直接使用Collection接口進行開發,而基本上都是使用其子接口。子接口主要有:List、Set、Queue、SortedSet。
4.1.4 Collection子接口的定義
Collection接口雖然是集合的最大接口,可是若是直接使用Collection接口進行操做的話,則表示的操做意義不明確,因此在JAVA開發中已經不提倡直接使用Collection接口了,主要的子接口以下:
List接口:能夠存放重複的內容。
Set接口:不能存放重複的內容,全部的重複內容是靠hashCode()和equals()兩個方法區分的。
Queue:隊列接口。
SortedSet接口:能夠對集合中的數據進行排序。
4.2 List接口
4.2.1List接口
List接口是Collection的子接口,裏面能夠保存各個重複的內容,此接口的定義以下: public interface List<E> extends Collection<E>
4.2.2 List接口的擴展方法
No. |
方法 |
類型 |
描述 |
1 |
public void add(int index, E element) |
普通 |
在指定位置增長元素 |
2 |
public boolean addAll(int index, Collection<? extends E> c) |
普通 |
在指定位置增長一組元素 |
3 |
E get(int index) |
普通 |
返回指定位置的元素 |
4 |
public int indexOf(Object o) |
普通 |
查找指定元素的位置 |
5 |
public int lastIndexOf(Object o) |
普通 |
從後向前查找指定元素的位置 |
6 |
public ListIterator<E> listIterator() |
普通 |
爲ListIterator接口實例化 |
7 |
public E remove(int index) |
普通 |
按指定的位置刪除元素 |
8 |
public List<E> subList(int fromIndex, int toIndex) |
普通 |
取出集合中的子集合 |
9 |
public E set(int index, E element) |
普通 |
替換指定位置的元素 |
4.2.3 List接口的經常使用子類 —— ArrayList
ArrayList是List子類,能夠直接經過對象的多態性,爲List接口實例化 此類的定義以下:
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable
AbstractList類的定義以下:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
實例操做一:向集合中增長元素
import java.util.ArrayList; import java.util.Collection; import java.util.List; public class ArrayListDemo01 { public static void main(String[] args) { List<String> allList = null ; // 定義List對象 Collection<String> allCollection = null ;// 定義Collection對象 allList = new ArrayList<String>(); // 實例化List對象,只能是String類型 allCollection = new ArrayList<String>(); // 實例化Collection,只能是String類型 allList.add("Hello"); // 從Collection繼承的方法 allList.add(0, "World"); // 此方法爲List擴充的方法 System.out.println(allList); // 輸出集合中的內容 allCollection.add("Hello"); // 增長數據 allCollection.add("Everyone"); // 增長數據 allList.addAll(allCollection); // 從Collection繼承的方法,增長一組對象 allList.addAll(0, allCollection); // 此方法List自定義的,增長一組對象 System.out.println(allList); // 輸出對象,調用toString()方法 } }
實例操做二:刪除元素
import java.util.ArrayList; import java.util.List; public class ArrayListDemo02 { public static void main(String[] args) { List<String> allList = null ; // 聲明List對象 allList = new ArrayList<String>(); // 實例化List對象,只能是String類型 allList.add("Hello"); // 增長元素 allList.add(0, "World"); // 此方法爲List擴展的增長方法 allList.add("Hello"); // 增長元素 allList.add("everyone"); // 增長元素 allList.remove(0); // 刪除指定位置的元素 allList.remove("Hello"); // 刪除指定內容的元素 System.out.println(allList); // 輸出對象,調用toString()方法 } }
實例操做三:輸出List中的內容
import java.util.ArrayList; import java.util.List; public class ArrayListDemo03 { public static void main(String[] args) { List<String> allList = null ; // 定義List接口對象 allList = new ArrayList<String>(); // 實例化List對象,只能是String類型 allList.add("Hello"); // 增長元素 allList.add("Hello"); // 增長元素 allList.add(0, "World"); // 增長元素 allList.add("Hello"); // 增長元素 allList.add("Everyone"); // 增長元素 System.out.print("由前向後輸出:"); // 信息輸出 for (int i = 0; i < allList.size(); i++) { // 循環輸出集合內容 System.out.print(allList.get(i) + "、");// 經過下標取得集合中的元素 } System.out.print("\n由後向前輸出:"); for (int i = allList.size() - 1; i >= 0; i--) {// 循環輸出集合內容 System.out.print(allList.get(i) + "、");// 經過下標取得集合中的元素 } } }
實例操做四:將集合變爲對象數組
import java.util.ArrayList; import java.util.List; public class ArrayListDemo04 { public static void main(String[] args) { List<String> allList = null ; // 聲明List對象 allList = new ArrayList<String>(); // 實例化List對象,只能是String類型 allList.add("Hello"); // 增長元素 allList.add(0, "World"); // 增長元素 allList.add("Hello"); // 增長元素 allList.add("Everyone"); // 增長元素 String str[] = (String[]) allList.toArray(new String[] {}); // 指定的泛型類型 System.out.print("指定數組類型:"); // 信息輸出 for (int i = 0; i < str.length; i++) {// 輸出字符串數組中的內容 System.out.print(str[i] + "、"); // 輸出每個元素 } System.out.print("\n返回對象數組:"); // 信息輸出 Object obj[] = allList.toArray(); // 直接返回對象數組 for (int i = 0; i < obj.length; i++) { // 循環輸出對象數組內容 String temp = (String) obj[i]; // 每個對象都是String類型實例 System.out.print(temp + "、"); // 輸出每個元素 } } }
實例操做五:集合的其餘相關操做
import java.util.ArrayList; import java.util.List; public class ArrayListDemo05 { public static void main(String[] args) { List<String> allList = null ; // 聲明List對象 allList = new ArrayList<String>(); // 實例化List對象,只能是String類型 System.out.println("集合操做前是否爲空?" + allList.isEmpty()); allList.add("Hello"); // 增長元素 allList.add(0, "World"); // 增長元素 allList.add("Hello"); // 增長元素 allList.add("Everyone"); // 增長元素 System.out.println(allList.contains("Hello") ? "\"Hello\"字符串存在!": "\"Hello\"字符串不存在!"); List<String> allSub = allList.subList(2, 3);// 取出裏面的部分集合 System.out.print("集合截取:"); for (int i = 0; i < allSub.size(); i++) { // 截取部分集合 System.out.print(allList.get(i) + "、"); } System.out.println("") ; System.out.println("Everyone字符串的位置:" + allList.indexOf("Everyone")); System.out.println("集合操做後是否爲空?" + allList.isEmpty()); } }
4.2.4 挽救的子類:Vector
在List接口中還有一個子類:Vector,Vector類屬於一個挽救的子類,從整個JAVA的集合發展歷史來看,Vector算是一個元老級的類,在JDK 1.0的時候就已經存在類此類。可是到了JAVA 2(JDK 1.2)以後重點強調了集合框架的概念,因此前後定義了不少的新接口(如:List等),可是考慮到一大部分的人已經習慣了使用Vector類,因此JAVA的設計者,就讓Vector類多實現了一個List接口,這纔將其保留下來。可是由於其是List子類,因此Vector類的使用與以前的並無太大的區別。
Vector類的定義: public class Vector<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, Serializable
4.2.4.1Vector子類
import java.util.List; import java.util.Vector; public class VectorDemo01 { public static void main(String[] args) { List<String> allList = null ; // 聲明List對象 allList = new Vector<String>(); // 實例化List對象,只能是String類型 allList.add("Hello"); // 增長元素 allList.add(0, "World"); // 增長元素 allList.add("Hello"); // 增長元素 allList.add("Everyone"); // 增長元素 for (int i = 0; i < allList.size(); i++) { // 循環輸出 System.out.print(allList.get(i) + "、");// 經過get()取出每個元素 } } }
使用舊的方法
import java.util.Vector; public class VectorDemo02 { public static void main(String[] args) { Vector<String> allList = new Vector<String>(); // 實例化Vector對象 allList.addElement("Hello"); // 此方法爲Vector本身定義 allList.addElement("Everyone"); // 此方法爲Vector本身定義 allList.addElement("Yes"); // 此方法爲Vector本身定義 for (int i = 0; i < allList.size(); i++) { // 循環輸出 System.out.print(allList.get(i) + "、");// 取得集合中的每個元素 } } }
4.2.4.2 子類的差別:ArrayList與Vector的區別
No. |
比較點 |
ArrayList |
Vector |
1 |
推出時間 |
JDK 1.2以後推出的,屬於新的操做類 |
JDK 1.0時推出,屬於舊的操做類 |
2 |
性能 |
採用異步處理方式,性能更高 |
採用同步處理方式,性能較低 |
3 |
線程安全 |
屬於非線程安全的操做類 |
屬於線程安全的操做類 |
4 |
輸出 |
只能使用Iterator、foreach輸出 |
可使用Iterator、foreach、Enumeration輸出 |
4.3 LinkedList子類
4.3.1 LinkedList 子類
LinkedList表示的是一個鏈表的操做類,此類定義以下:
public class LinkedList<E> extends AbstractSequentialList<E>implements List<E>, Queue<E>, Cloneable, Serializable
4.3.2 LinkedList中操做鏈表的部分方法:
No. |
方法 |
類型 |
描述 |
1 |
public void addFirst(E o) |
普通 |
在鏈表開頭增長元素 |
2 |
public void addLast(E o) |
普通 |
在鏈表結尾增長元素 |
3 |
public boolean offer(E o) |
普通 |
將指定元素增長到鏈表的結尾 |
4 |
public E removeFirst() |
普通 |
刪除鏈表的第一個元素 |
5 |
public E removeLast() |
普通 |
刪除鏈表的最後一個元素 |
實例操做一:在鏈表的開頭和結尾增長數據
import java.util.LinkedList; public class LinkedListDemo01 { public static void main(String[] args) { LinkedList<String> link = new LinkedList<String>(); link.add("A"); // 向鏈表中增長數據 link.add("B"); // 向鏈表中增長數據 link.add("C"); // 向鏈表中增長數據 System.out.println("初始化鏈表:" + link); // 輸出鏈表內容,調用toString() link.addFirst("M"); // 在鏈表的表頭增長內容 link.addLast("N"); // 在鏈表的表尾增長內容 System.out.println("增長頭和尾以後的鏈表:" + link); // 輸出鏈表內容,調用toString() } }
4.4 Queue接口定義的方法
4.4.1 Queue定義:
Queue接口是Collection的子接口,此接口定義以下:
public interface Queue<E> extends Collection<E>
4.4.2 Queue接口定義的方法:
No. |
方法 |
類型 |
描述 |
3 |
public E element() |
普通 |
找到鏈表的表頭 |
4 |
public boolean offer(E o) |
普通 |
將指定元素增長到鏈表的結尾 |
5 |
public E peek() |
普通 |
找到但並不刪除鏈表的頭 |
6 |
public E poll() |
普通 |
找到並刪除此鏈表的頭 |
7 |
public E remove () |
普通 |
檢索並移除表頭 |
實例操做一:找到鏈表頭
import java.util.LinkedList; public class LinkedListDemo02 { public static void main(String[] args) { LinkedList<String> link = new LinkedList<String>(); link.add("A"); // 向鏈表中增長數據 link.add("B"); // 向鏈表中增長數據 link.add("C"); // 向鏈表中增長數據 System.out.println("1-一、element()方法找到表頭:" + link.element()); System.out.println("1-二、找完以後的鏈表內容:" + link); System.out.println("2-一、peek()方法找到表頭:" + link.peek()); System.out.println("2-二、找完以後的鏈表內容:" + link); System.out.println("3-一、poll()方法找到表頭:" + link.poll()); System.out.println("3-二、找完以後的鏈表內容:" + link); } }
實例操做二:以先進先出的方式取出所有的數據
import java.util.LinkedList; public class LinkedListDemo03 { public static void main(String[] args) { LinkedList<String> link = new LinkedList<String>(); link.add("A"); // 向鏈表中增長數據 link.add("B"); // 向鏈表中增長數據 link.add("C"); // 向鏈表中增長數據 System.out.print("以FIFO的方式輸出:"); // 信息輸出 for (int i = 0; i < link.size() + 1; i++) {// 循環輸出 System.out.print(link.poll() + "、"); // 取出表頭 } } }