1. 程式人生 > >集合框架複習總結(一)

集合框架複習總結(一)

最近在複習集合框架,總結一下Java集合框架的一些方法,還只是複習了一部分,就先總結複習了的部分吧。

一、首先,什麼事集合框架?

       集合框架是為表示和操作集合而規定的一種統一的標準的體系結構。任何集合框架都包含三大塊內容:對外的介面、介面的實現和對集合運算的演算法。

(1)介面:即表示集合的抽象資料型別。介面提供了讓我們對集合中所表示的內容進行單獨操作的可能。 (2)實現:也就是集合框架中介面的具體實現。實際它們就是那些可複用的資料結構。 (3)演算法:在一個實現了某個集合框架中的介面的物件身上完成某種有用的計算的方法,例如查詢、排序等。這些演算法通常是多型的,因為相同的方法可以在同一個介面被多個類實現時有不同的表現。事實上,演算法是可複用的函式。如果你學過C++,那C++中的標準模版庫(STL)你應該不陌生,它是眾所周知的集合框架的絕好例子。 那麼集合的由來是什麼? 答:陣列長度是固定,當新增的元素超過了陣列的長度時需要對陣列重新定義,太麻煩,java內部給我們提供了集合類,能儲存任意物件,長度是可以改變的,隨著元素的增加而增加,隨著元素的減少而減少
陣列和集合的區別是什麼? 答:①陣列既可以儲存基本資料型別,又可以儲存引用資料型別,基本資料型別儲存的是值,引用資料型別儲存的是地址值   ②集合只能儲存引用資料型別(物件)集合中也可以儲存基本資料型別,但是在儲存的時候會自動裝箱變成物件 ③陣列長度是固定的,不能自動增長 ④集合的長度的是可變的,可以根據元素的增加而增長 而框架的發展是怎樣的呢,現在的集合框架基本如下圖所示:
那麼,我就先總結我複習完的Collect方面的內容吧。

一、Collection的基本功能:

boolean add(E e)
boolean remove(Object o)
void clear()
boolean contains(Object o)
boolean isEmpty()
int size()

例子如下:

先設定一個學生類:

public class Student {
	private String name;
	private int age;
	public Student() {
		super();
		
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
	
}

然後例子1如下:
Collection c = new ArrayList();     //父類引用指向子類物件
		boolean b1 = c.add("abc");
		boolean b2 = c.add(true);		//自動裝箱new Boolean(true);
		boolean b3 = c.add(100);
		boolean b4 = c.add(new Student("張三",23));			
		boolean b5 = c.add("abc");
		
		System.out.println(b1);
		System.out.println(b2);
		System.out.println(b3);
		System.out.println(b4);
		System.out.println(b5);
		
		System.out.println(c.toString());                

得出的結果如下:


例子2:

Collection c = new ArrayList();     	
c.add("a");
c.add("b");
c.add("c");
c.add("d");
System.out.println(c);
System.out.println(c.size());                  //獲取元素的個數           
System.out.println(c.contains("b"));
c.remove("b");                                 //刪除指定元素     
System.out.println(c);
System.out.println(c.contains("b"));           //判斷是否包含
System.out.println(c.isEmpty());c.clear();     //清空集合
System.out.println(c);
System.out.println(c.isEmpty());

得出結果如下:




二、遍歷集合

Collection c = new ArrayList();
c.add("first");
c.add("second");
c.add("third");
c.add("forth");
Object[] arr = c.toArray(); //將集合轉換成陣列
for(int i = 0; i < arr.length; i++) {
   System.out.println(arr[i]);
}


若存入的是一個類物件,那麼怎樣遍歷集合呢? 

Collection c = new ArrayList();
c.add(new Student("張三", 23)); //Object 
obj = new Student("張三",23);
c.add(new Student("李四", 24));
c.add(new Student("王五", 25));
c.add(new Student("趙六", 26));
Object[] arr = c.toArray(); //將集合轉換成陣列
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
    Student s = (Student)arr[i]; //向下轉型
    System.out.println(s.getName() + "..." + s.getAge());
}


結果如下:




三、Collection的All用法:
帶All的功能
boolean addAll(Collection c)
boolean removeAll(Collection c)
boolean containsAll(Collection c)
boolean retainAll(Collection c)
例子如下:
例子1:
Collection c1 = new ArrayList();
c1.add("a");
c1.add("b");
c1.add("c");
c1.add("d");
Collection c2 = new ArrayList();
c2.add("a");
c2.add("b");
c2.add("c");
c2.add("d");
System.out.println(c1);
c1.addAll(c2); //將c2中的每一個元素新增到c1中
System.out.println(c1);
c1.add(c2); //將c2看成一個物件新增到c1中
System.out.println(c1);

得出的結果:




例子2:
Collection c1 = new ArrayList();
c1.add("a");
c1.add("b");
c1.add("c");
c1.add("d");
Collection c2 = new ArrayList();
c2.add("a");
c2.add("b");
c2.add("z");
boolean b = c1.removeAll(c2); //刪除的是交集
System.out.println(b);
System.out.println(c1);

結果如下:




例子3:containsAll() 
Collection c1 = new ArrayList();
c1.add("a");
c1.add("b");
c1.add("c");
Collection c2 = new ArrayList();
c2.add("a");
c2.add("b");
boolean a = c1.containsAll(c2);
c2.add("z");
boolean b = c1.containsAll(c2); //判斷呼叫的集合是否包含傳入的集合
System.out.println(a);
System.out.println(b);

結果如下:
true
false


例子4:
Collection c1 = new ArrayList();
c1.add("a");
c1.add("b");
c1.add("c");
c1.add("d");
Collection c2 = new ArrayList();
c2.add("a");
c2.add("b");
c2.add("c");
c2.add("d");
c2.add("e");
c2.add("f");                    //取交集,如果呼叫的集合改變就返回true,如果呼叫的集合不變就返回false
boolean b = c1.retainAll(c2);			//取交集
System.out.println(b);
System.out.println(c1);
System.out.println(c2);
		
c2.retainAll(c1);
System.out.println(c2);

得出的結果是:




呼叫containsAll的集合會取交集,而導致c2集合會變化。


四、集合的遍歷——迭代器遍歷、
迭代器是什麼?
答:集合是用來儲存元素,儲存的元素需要檢視,那麼就需要迭代(遍歷) 


迭代器的使用:
Collection c = new ArrayList();
c.add("a");
c.add("b");
c.add("c");
c.add("d");
Iterator it = c.iterator(); //獲取迭代器的引用
while(it.hasNext()) { //集合中的迭代方法(遍歷)
System.out.println(it.next());
}


這裡有兩個方法:hasNext()和next(),分別表示是否還有下一個元素和指向下一個元素
那麼,如果要遍歷自定義物件的集合呢?
如下:
Collection c = new ArrayList();
			
c.add(new Student("張三",23));
c.add(new Student("李四",24));
c.add(new Student("王五",25));
c.add(new Student("趙六",26));
c.add(new Student("趙六",26));
			
for(Iterator it = c.iterator();it.hasNext();) {
	Student s = (Student)it.next();				//向下轉型
	System.out.println(s.getName() + "," + s.getAge());	//獲取物件中的姓名和年齡
}
System.out.println("------------------------------");
Iterator it = c.iterator();					//獲取迭代器
while(it.hasNext()) {						//判斷集合中是否有元素
   //System.out.println(((Student)(it.next())).getName() + "," + ((Student)(it.next())).getAge());
	Student s = (Student)it.next();				//向下轉型
	System.out.println(s.getName() + "," + s.getAge());	//獲取物件中的姓名和年齡
}


結果如下:
張三,23
李四,24
王五,25
趙六,26
-----------------------------------
張三,23
李四,24
王五,25
趙六,26


Collection的內容就差不多這樣了,還有List,Set和Map的內容就複習完了再總結