1. 程式人生 > >JAVA----集合的子介面List

JAVA----集合的子介面List

List

List:列表
       此介面對應的實現類的特點都是:有序的,可以重複的
       重複與否與元素的equals方法有關

常用方法
      void add(int index,E element)--------將某一元素,插入到此集合的某一下標index處  
      E get(int index)--------------返回指定下標上的元素
      int indexOf(Object obj)--------------返回指定元素出現的位置,如果沒有返回-1。 

      E set(int index, E newElement)  -------------使用新元素newElement替換下標index上的元素,返回原元素。
      boolean remove(int index)--------------移除此集合中下標為index的元素 (注意在元素的類中重寫equals方法)  
      List subList(int fromIndex,int endIndex)------ 擷取此集合中的一部分,即擷取子集,從fromIndex到endIndex,包前不包後
               PS:此方法在堆中產生了一個內部類SubList集合物件,此集合物件引用的是父集的一部分。修改子集,會影響父集。


      int lastIndexOf(Object obj)------------返回此集合指定元素obj最後一次出現的下標,找不到返回-1

陣列與集合之間的轉換
    1、集合轉陣列
       Object[ ] toArray()
       <E>E[ ] toArray(E[ ] e)
    2、陣列轉集合
       List Arrays.asList(T……a)  
       注意:陣列轉型的集合,不能進行增刪操作,否則會出現執行時異常,可以進行替換操作,但是會對陣列變數有影響。  
                  如果想要成功進行增刪操作,可以將元素存入新的集合中。 

Iterator:迭代器介面


       (1)迭代器的作用是用來遍歷集合元素。是一個介面,Collection繼承了該介面,提供了一個方法Iterator iterator()
       (2)Collection的實現類使用內部類定義了迭代器子類。
       (3)迭代器提供了統一的方法,用於遍歷集合元素
       常用方法:
        boolean hasNext()--------------- 判斷集合中是否有下一個元素
        E next()----------------- 取出集合中的下一個元素
        remove(Object obj)

       在使用迭代器對集合進行遍歷時,不能使用集合的移除方法移除集合的元素.

       必須使用迭代器自己提供的移除方法才行。 

      增強for迴圈——foreach迴圈
      for(元素型別 變數名:要遍歷的集合或者陣列){
      
      }
           與經典for迴圈的區別:
        (1)增強for迴圈中無法使用下標。
        (2)經典for迴圈可以使用下標,跟下標有關的邏輯,隨便寫 

 List的實現類

 (1)ArrayList------底層是基於動態陣列的資料結構。是有存放順序的。
   
 (2)LinkedList------底層是基於雙鏈表的資料結構。每一個儲存單元都涉及到其他兩個引用。   
 

 ArrayList和LinkedList比較:在執行get()/set()時,ArrayList的效率高,LinkedList需要移動指標,效率低在增加和刪除          時,LinkedList效率高, ArrayList效率低(需要擴容,移動元素) 
 PS:當然,在元素的數量大的情況下,區別才明顯               
       
 (3)Vector:是一個比較古老的集合型別,執行緒安全但是效率特別低,雖然安全也不建議使用。

public class TestIterator02 {
	public static void main(String[] args) {
		/*建立一個集合list,用於儲存座標系第二象限的整數點
		 * 整數點5個
		 * 使用迭代器進行遍歷,檢視是否有點(-3,2).
		 * 如果有,請從集合中刪除
		 * */
		List<Point> list = new ArrayList<Point>();
		list.add(new Point(-1,2));
		list.add(new Point(-2,4));
		list.add(new Point(-3,2));
		list.add(new Point(-6,7));
		list.add(new Point(-9,8));
		System.out.println(list);
		Iterator<Point> it = list.iterator();
		Point p1 = new Point(-3,2);
		while(it.hasNext()){
			Point p = it.next();
			if(p.equals(p1)){
				it.remove();
			}
		}
		System.out.println(list);
	}

}

List排序

Comparable介面:
        如何定義集合元素之間的大小之分?我們需要在定義元素型別時,實現Comparable介面,實現介面內的

         CompareTo(E e)。實現此介面的型別的物件之間可以進行比較。
方法:
    int compareTo(E e):
        比較規則:
         (1)this與e比較,this-e
                        如果大於零,返回大於0的一個數
                        如果等於零,返回0
                        如果小於零,返回小於0的一個數
                        按照升序排序
         
         (2)e-this,降序排序
工具類Collections
       提供了一個sort(Collection c)方法,對集合裡的元素進行排序


Comparator比較器介面
     如果元素型別已經實現了Comparable介面,定義了預設的比較規則,之後再想換其他比較規則時,不修改原始碼。
     可以利用比較器介面來重新定義比較規則。
     
     方法:
      int compare(E o1,E o2);
            比較規則:
            升序:o1-o2
            降序:o2-o1

public class TestSort02 {
	public static void main(String[] args) {
		/* 在集合List中儲存五個字串物件,排序 */
		List<String> list = new ArrayList<String>();
		list.add("php");
		list.add("java");
		list.add("python");
		list.add("scala");
		list.add("C++");
		System.out.println(list);
		// 定義一個比較器物件
		Comparator<String> my = new Comparator<String>() {
			public int compare(String o1, String o2) {

				return o1.length() - o2.length();
			}

		};
		Collections.sort(list, my);
		/**Collections.sort(list, new Comparator<String>() {
			public int compare(String o1, String o2) {

				return o1.length() - o2.length();
			}

		};);----------------進一步修改*/
		System.out.println(list);
		/**max():找到自然排序後的最大值*/
		String  e1= Collections.max(list);
		System.out.println(e1);
		/**reverse():對集合元素進行反轉*/
		Collections.reverse(list);
		System.out.println(list);
		/*shuffle():對集合元素進行打亂順序,混洗*/
		Collections.shuffle(list);
		System.out.println(list);
	}

}