#Java學習#(六)容器

其他JAVA學習的內容見:目錄

概念與框架

  • 容器類:Java類庫中提供的用於管理對象集合的類
    在這裏插入圖片描述
  • Collection
    • 列表(List):按照一定次序(對象進入的順序)排列的對象集,對象之間有次序關係,對象可以重複。
    • 集合(Set):對象唯一,不會重複;元素沒有順序。
    • 隊列(Queue):根據排隊規則確定對象的順序。
  • Map(映射表)
    • 一羣成對的對象集,這些對象各自保持着“鍵-值”(key-value)對應關係。
    • 允許使用一個對象來查找另一個對象。

Collection&List

  • Collection接口
    int size();
    boolean isEmpty();
    boolean contains(Object o);
    Iterator<E> iterator();
    Object[] toArray();
    boolean add(E o);
    boolean remove(Object o);
    boolean containsAll(Collection<?> c);
    boolean addAll(Collection<? extends E> c);
    boolean removeAll(Collection<?> c);
    boolean retainAll(Collection<?> c);
    void clear();
    boolean equals(Object o);
  • List接口
    • Collection接口的子接口
    • 特點:實現該接口的類中的元素有順序,可以重複。
    • List容器中的元素都有一個對應的整數型的序號,用以記錄元素在容器中的位置,可以根據序號取元素。
    • 主要實現類:ArrayListLinkedList
   Object get(int index);
   Object set(int index, Object element);
   void add(int index,Object element);
   Object remove(int index);
   int indexOf(Object o);
   int lastIndexOf(Object o);
  • 實例:泛型
List<String> list = new LinkedList<String>();
for(int i=0;i<=5;i++){
	list.add("a"+i);
}
System.out.println(list);
list.add(3,"b");
System.out.println(list);
list.set(6,"c");
System.out.println(list);
System.out.println(list.get(2));
  • Vector(不建議使用)
    • List接口的實現類。
    • 特點:跟ArrayList一樣,都是可變長的對象數組。
    • 與ArrayList區別
      • Vector是線程安全的,是可以同步的,運行效率低;
      • ArrayList不同步,適合於單線程環境中。
    • 常用方法(List中未定義)
public Object elementAt(int index)
public void addElement(Object obj)
public void removeElementAt(int index)
public void insertElementAt(E obj, int index)
public boolean removeElement(Object obj)
public void removeAllElements()

棧與隊列

  • Stack(棧)
  • extend Vector
  • 特點:後進先出的對象堆棧
  • 主要方法:
    • public Object push(E item)
    • public Object pop()
    • public Object peek()
    • public boolean empty()
    • public int search(Object o)
  • 實例
Stack s = new Stack();
s.push("hello");
s.push(new Date());
s.push(100);
s.push(3.14);

System.out.println("彈棧前:size=" + s.size());
System.out.println(s.pop());
System.out.println("彈棧後:size=" + s.size());
System.out.println(s.peek());
System.out.println("peek操作後:size=" + s.size());
while(!s.isEmpty()){
      System.out.println(s.pop());
}
//彈棧前:size=4
//3.14
//彈棧後:size=3
//100
//peek操作後:size=3
//100
//Fri Dec 05 17:09:20 CST 2008
//hello
  • Queue(隊列)
    • 隊列:一種先進先出(FIFO)的容器,從容器的一端放入對象,從另一端取出對象,並且放入和取出的順序相同。
    • 主要方法
      • offer():(入隊)如果可能,將指定的元素插入此隊列。
      • peek()element():在不移除的情況下返回隊頭。peek方法在隊列爲空時返回null,element方法在隊列爲空時拋出異常。
      • poll()remove():移除並返回隊頭(出隊)。poll方法在隊列爲空時返回nullremove方法在隊頭爲空時拋出異常。
    • 主要實現類:LinkedList
Queue queue = new LinkedList();
queue.offer("Hello");
queue.offer("World!");
queue.offer("你好!");
System.out.println(queue.size());
String str;
while ((str = (String)queue.poll()) != null) {
	System.out.println(str);
}
System.out.println(queue.size());

集合set

  • Collection接口的子接口,未提供額外的方法。
  • 實際上Set就是Collection,只是行爲不同(繼承與多態思想的典型應用:表現不同的行爲)。
  • 實現Set接口類的特點:元素無順序,不重複。
  • JDK API中Set的實現類:HashSetTreeSetLinkedHashSet

HashSet

  • HashSet
    • HashSet中使用hashCodeequals方法判斷是否相同,爲了提高效率,先調用hashCode方法(返回hashcode值),hashCode相同的才調用equals方法判斷是否相同
    • 如果一個類要實現hashCode必須和equals方法一塊實現hashCode方法和equals方法返回值的關係滿足:
      • equals()true的兩個對象,hashcode()返回值一定相等;
      • equals()不爲true的兩個對象,它們的hashCode()不一定相等。即,equals()不爲true的兩個對象,hashCode()有可能相等。(哈希碼在生成的時候可能產生衝突)。
      • hashCode()不等的兩個對象,equals()不爲truehashCode()相等,equals()可能爲true ,也可能不爲true
    • hashCode方法的重寫:返回一個result

TreeSet

  • 實現了Set接口,是Set的一個變體,是一個實現了排序功能的集合(類似於“插入排序”)。
  • 工作原理:將對象元素添加到TreeSet中時會自動按照某種比較規則,將其插入到有序的對象序列中,以保證TreeSet集合元素組成的對象序列時刻按照“升序”排列;如果沒指定排序規則,則會按照對象的hash編碼來排序

字典Map

  • 實現Map接口的類:存儲“鍵-值”對。
  • 主要實現類:HashMapTreeMap
  • Map中“鍵值對”通過鍵標示,鍵要唯一,不重複
    • 重複:equalstruehashCode相等)

HashMap

  • 基於哈希表實現了映射集合結構。
  • 特點:不保證其中元素的先後順序,並且允許使用“null”鍵和“null”值
	public static void main(String args[]) {
		Map m1 = new HashMap();
		Map m2 = new TreeMap();
		m1.put("one", new Integer(1));
		m1.put("two", new Integer(2));
		m1.put("three", new Integer(3));
		m2.put("A", new Integer(1));
		m2.put("B", new Integer(2));
		System.out.println(m1.size());//3
		System.out.println(m1.containsKey("one"));//true
		System.out.println(m2.containsValue(new Integer(1)));/true
		if (m1.containsKey("two")) {
			int i = ((Integer) m1.get("two")).intValue();
			System.out.println(i);//2
		}
		Map m3 = new HashMap(m1);
		m3.putAll(m2);
		System.out.println(m3);//{two=2, A=1, B=2, one=1, three=3}
	}

Hashtable

  • 特點:實現Map接口,與HashMap作用基本一樣。
  • HashtableHashMap的用法、格式完全相同。
  • HashMap的區別:
    • Hashtable是同步的,線程安全的,效率低一點;HashMap不同步,效率較高,適合於單線程環境;
    • Hashtable的鍵值都不能爲null

Properties

  • public class Properties extends Hashtable<Object,Object>
  • 作用:處理屬性文件時方便,把Map對象和屬性文件關聯起來
    • 可以把Map對象中的key-value對寫入到屬性文件;
    • 可以把屬性文件中的“屬性名=屬性值”加載到Map對象中。
  • 說明:keyvalue都是String類型
Properties props = new Properties();
// 向Properties中增加屬性
props.setProperty("username" , "admin");
props.setProperty("password" , "123456");
// 將Properties中的key-value對保存到a.ini文件中
props.store(new FileOutputStream("e:/gar/a.ini"),"用戶名密碼錶");
// 新建一個Properties對象
Properties props2 = new Properties();
props2.load(new FileInputStream("e:/gar/a.ini") ); 
String username = props2.getProperty("username");
String pwd = props2.getProperty("password");
System.out.println("用戶名是:"+username+",密碼是:"+pwd);//用戶名是:admin,密碼是:123456

迭代器

  • 容器的遍歷:必須根據容器的確切類型進行編碼。
  • 迭代器:以統一的方式遍歷容器中的對象,程序員不必知道該容器的底層結構。

Iterator接口

  • 作用:以統一的方式對各種集合元素進行遍歷、迭代。
  • 實現Collection接口的容器類都有一個iterator方法。
    • 返回一個實現了Iterator接口的對象。
  • Iterator中的方法
    • boolean hasnext( )
    • object next()
    • void remove( )
  • 實例(只能前移)
 Collection c = new HashSet();
 c.add(new Student(1,"Tom",60));
 c.add(new Student(2,"Peter",70));
 c.add(new Student(3,"Bob",80));
 Iterator i = c.iterator();
 while(i.hasNext()){
       Student s = (Student)i.next();//沒有使用泛型,所以要加強制類型轉換
       System.out.println(s.getName());
 }
  • 缺點:
    • 對於數組:不能方便的訪問數組下標。
    • 對於Collection,不能方便的刪除元素。
  • 說明:
    • 所有的Collection都可以使用foreach語法遍歷。
    • 對容器只是向前遍歷、不修改容器本身時使用。
    • 除了簡單遍歷,不要使用增強的for循環。

ListIterator接口

  • Iterator的子類型,功能更強大,只能用於各種List的訪問。
  • 特點:可以雙向移動。
  • 創建方法(來源於List
    • listIterator():產生一個指向List開始處的ListIterator
    • listIterator(n):創建一個開始指向列表索引爲n的元素處的listIterator。
  • 實例
List all = new ArrayList();
all.add("hello");
all.add("_");
all.add("world");
ListIterator iter = all.listIterator();
while (iter.hasNext()) {
	String str = (String)iter.next();
	System.out.println(str + " ");
}
while (iter.hasPrevious()) {
	String str = (String)iter.previous();
	System.out.println(str + " ");
}

實用類

  • Collections類
    • java.util.Collections提供了List容器操作的靜態方法
    • 常用方法
      • void sort(List list);//對List容器內元素排序
      • void reverse(List list);//對List容器內的對象進行逆序排列
      • void copy(List dest,List src);//把src中List容器內容拷貝到dest List容器
      • int binarySearch(List list, Object key);//對順序的List容器,用折半查找方法查找指定對象
      • void shuffle(List);//對List容器內的對象進行隨機排序
  • Arrays類
    • 定義了多種數組操作方法,實現了對數組元素的排序、填充、轉換爲列表或字符串形式、增強的檢索和深度比較等功能
    • 實例
Integer[ ] a = {3,25,12,79,48};
System.out.println(Arrays.toString(a));//[3, 25, 12, 79, 48]
Arrays.sort(a);
System.out.println(Arrays.toString(a));//[3, 12, 25, 48, 79]
int idx = Arrays.binarySearch(a,25);
System.out.println(idx);//2

List list = Arrays.asList(3,4,5);
System.out.println(list);//[3, 4, 5]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章