1. 程式人生 > >黑馬程式設計師 Java集合框架Collection

黑馬程式設計師 Java集合框架Collection

1.面嚮物件語言對事物的體現都是以物件的形式,所以為了方便對多個物件的操作,就對物件進行儲存,集合就是儲存物件最常用的一種方式。

2.陣列和集合類同是容器,有何不同:

   陣列雖然也可以儲存物件,但長度是固定的,集合長度是可變的。

   陣列中可以儲存基本資料型別,集合只能儲存物件。

3.集合類的特點:集合只用於儲存物件,集合長度是可變的,集合可以儲存不同型別的物件。

4.每一個容器對資料的儲存方式都有不同。這個儲存方式我們稱之為資料結構。

集合中德共性方法。

1.增加:boolean add(E e) ; 新增元素方法。

2.刪除:boolean remove(Object o) ;

從集合中移除單個元素。

        boolean removeAll(Collection<?> c); 移除一堆元素。

        void clear();  清空集合中的元素。

3.查:Iterator<E> iterator();  返回在此collection的元素上進行迭代的迭代器。

4.長度:  int size();  返回集合中元素的大小。

5. Object[] toArray() ;  把集合轉成陣列。

                       Collection

|--List:元素是有序的,元素可以重複。因為該集合體繫有索引。

   |--ArrayList:底層的資料結構使用的是陣列結構。特點:查詢速度很快。但是增刪稍慢。執行緒不同步。

   |--LinkedList :底層使用的是連結串列資料結構。特點:增刪的速度很快,查詢速度慢。

   |--Vector:底層是陣列資料結構。執行緒同步。被ArrayList替代了.

|--Set:元素是無序的。元素不可以重複。

二 List集合


 List:特有方法。凡是可以操作腳標的方法都是該體系特有的方法。

  增: add(index,element);

       addAll(index Collection)

  刪 : remove(index) 

  改 : set(index,elements);

  查 :  get(index);  

       subList(from,to);

       listIterator();

package Collection;
import java.util.*;
public class CollectionDemo {
	  public static void main(String[] args){
		   method_2();
	  }
	  public static void method_2(){
		  ArrayList  al = new ArrayList();
		   //新增元素
		   al.add("java01");
		   al.add("java02");
		   al.add("java03");
		   al.add("java04");
		   
		   ArrayList  al2 = new ArrayList();
		   //新增元素
		   al2.add("java03");
		   al2.add("java04");
		   al2.add("java05");
		   al2.add("java06");
		   //取兩個集合中的交集,al中只保留交集元素
		 //  al.retainAll(al2);
		  // sop(al);
		   //移除兩個集合交集的元素。
		   al.removeAll(al2);
		   sop(al);
	  }
	  public static void method_1(){
		   ArrayList  al = new ArrayList();
		   //新增元素
		   al.add("java01");
		   al.add("java02");
		   al.add("java03");
		   al.add("java04");
		   sop(al);  //列印集合中的元素
		   sop("size:"+al.size());  //列印集合長度
		   al.remove("java01");  //刪除元素
		   sop("size:"+al.size()); 
		   sop(al);
		   al.clear();  //清空集合中的元素。
		   sop(al);
	  }
	  public static void sop(Object o){
		  System.out.println(o);
	  }

}

在迭代時,不可以通過集合物件的方法操作集合中的元素。因為會發生ConcurrentModificationException異常。

所以在迭代時,只能用迭代器的方法操作元素,可是Iterator方法是有侷限性的。只能對元素進行判斷,取出,刪除的操作。

如果想要其他的操作如新增,修改等,就需要使用其子介面:ListIterator。

該介面只能通過List集合的listIterator方法獲取。

列舉就是Vector特有的取出方式。發現列舉和迭代器很像。

其實列舉和迭代是一樣的。

因為列舉的名稱以及方法的名稱都過長,所以被迭代器取代了。

LinkedList類:

特有方法:

增:

addFirst(E e);  將指定元素插入此列表的開頭。

addLast(E e); 將指定元素新增到此列表的結尾。

刪:

removeFirst() ;移除並返回此列表的第一個元素。若列表為空,則丟擲NosuchElementException異常

removeLast();  移除並返回此列表的最後一個元素。同上的異常

獲取:

getFirst();  返回此列表的第一個元素。 若列表為空,則丟擲NosuchElementException異常

getLast();  返回此列表的最後一個元素。

LinkedList升級後的方法:

增加 :

  offerFirst();

  offerLast();

獲取:

 peekFirst(); 若列表為空,返回null

 peekLast(); 若列表為空,返回null

刪除:

poolFirst();  若列表為空,返回null

poolLast();  若列表為空,返回null

                                                                                

三  Set集合

1.Set:元素是無序(存入和取出的順序不一定一致),元素不可以重複。

      |--HashSet:底層資料結構是雜湊表。執行緒不同步

           HashSet是如何保證元素的唯一性的呢?

           是通過元素的兩個方法,hashCodeequals來完成。

           如果元素的HashCode值相同,才會判斷equals是否為true

           如果元素的HashCode不同。就不會呼叫equals方法。

注意:對於判斷元素是否存在,以及刪除等操作,依賴的方法是元素的hashcodeequals方法。

      |--TreeSet:底層資料結構是二叉樹。保證元素唯一性的依據。

        TreeSet排序的第一種方式:讓元素自身具備比較性。元素需要實現Comparable介面,覆蓋compareTo方法。這種方式也成為元素的自然順序,或者叫做預設順序。

      TreeSet的第二種排序方式。當元素自身不具備比較性時,或者具備的比較性不是所需要的。這時就需要讓集合自身具備比較性。在集合初始化時,就有了比較方式。

特點:可以對Set集合中的元素進行排序。

當兩種排序都存在時,以比較起為主。

     記住,當排序時,當主要條件相同時,一定要判斷一下次要條件。

2.Set集合的功能和Collection是一致的。

3.Set集合取出方式只有一種就是迭代器。

雜湊表:

1)雜湊表是按照雜湊值的大小進行排列的,如果兩個雜湊值不同,則大的值放後面;如果兩個雜湊值相同,則再用equals方法比較兩個元素的物件是否相同,如果不同,則將第二個值順延,兩個值串起來,放在同一個位置上。

2)取值時是按照雜湊值取出來的。

HashSet示例

package Collection;

import java.util.HashSet;
import java.util.Iterator;



public class HashSetDemo {
	  public static void main(String[] args){
		   HashSet hs = new HashSet();
		   hs.add(new Person("java01",11));
		   hs.add(new Person("java02",12));
		   hs.add(new Person("java01",11));
		   hs.add(new Person("java03",13));
		   
		    for(Iterator it =hs.iterator();it.hasNext();){
		    	 Person p = (Person)it.next();
		    	 System.out.println(p.getName()+"......"+p.getAge());
		    }
	  }

}
class Person {
	 private String name;
	 private int age;
	 
	 //定義構造方法,在學生建立時就賦予它基本資訊(名字,成績,總成績)
	 Person(String name,int age){
		 this.name=name;
	     this.age=age;
	 }
	 public String getName(){
		 return this.name;
	 }
	 public int getAge(){
		 return this.age;
	 }
	 //重寫hashCode方法
	 public int hashCode(){
		 System.out.println(this.name+".....hashcode");
		 return 60;
	 }
	 public boolean equals(Object o){
		  if(! (o instanceof Person))
			  return false;
		  
		  Person p  = (Person)o;
		  System.out.println(this.name+"equals"+p.name);
		  return this.name.equals(p.name)&&this.age==p.age;
		  
	 }
	 
}

TreeSet排序示例
package Collection;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class TreeSetDemo {
	public static void main(String[] args){
		//第二種排序方式。就是讓集合具有可比性
		TreeSet ts = new TreeSet(new Mycomparator());
		 ts.add(new Student("java01",40));
		 ts.add(new Student("java073",55));
		 ts.add(new Student("java02",20));
		 ts.add(new Student("java01",35));
		 ts.add(new Student("java013",55));
		 ts.add(new Student("java03",55));
		 
		 for(Iterator it = ts.iterator();it.hasNext();){
			 Student s =(Student)it.next();
			 System.out.println(s.getName()+"........."+s.getAge());
		 }
	}
	


}
//第一種排序方式。讓元素自身實現可比性。
class Student implements Comparable{
    private String name;
    private int age;
    Student(String name,int age){
    	this.name=name;
    	this.age=age;
    }
    Student(){
    	
    }
    public String getName(){
    	return this.name;
    }
    public int getAge(){
    	return this.age;
    }
	@Override
	public int compareTo(Object o) {
		 if(!(o instanceof Student))
			 throw new RuntimeException("型別不匹配");
		 Student s = (Student)o;
		 int num = new Integer(this.age).compareTo(new Integer(s.getAge()));
		 if(num==0)
			 return this.name.compareTo(s.getName());
		return num;
	}
	
}
class Mycomparator implements Comparator{

	@Override
	public int compare(Object o1, Object o2) {
		// TODO Auto-generated method stub
		Student s = (Student)o1;
		Student s2 = (Student)o2;
		int num = new Integer(s.getAge()).compareTo(new Integer(s2.getAge()));
		if(num==0)
			return s.getName().compareTo(s2.getName());
		return num;
	}
	 
}