天天看點

JavaSE——day12集合Collection集合

Collection集合

    集合的繼承體系圖如下所示:(學習順序是:(從上向下))

JavaSE——day12集合Collection集合

Collection是集合層次的跟接口,JDK不提供此接口的任何實作方法,也沒有字段,沒有構造方法,隻有方法。Collection隻提供兩個更具體的子接口,一個是List還有一個是Set。List接口的實作類中有3個子實作類。

    數組和長度的差別? (1)長度差別:數組長度固定,集合長度可變。 (2)内容差別:數組可以存儲同一種類型的元素,集合可以存儲多種類型的元素。 (3)存儲類型差別:數組可以存儲基本類型,也可以存儲引用類型。集合隻能存儲應用類型。

List:有序的集合類,通常允許重複的元素。

Set:無需的集合接口,不允許存在重複元素(因為有hash和equals方法的限制)。 List的子實作類:

    ArrayList的基本功能包括增加,删除,暴力删除,包含檢測,空集合檢測。。。 例子:

import java.util.ArrayList;import java.util.Collection;

public class Test1 {

 public static void main(String[] args) {

  Collection<String> c = new ArrayList<String>();    //添加功能  c.add("hello");  c.add("world");  c.add("!") ;  System.out.println(c);    //删除功能  c.remove("!");  System.out.println(c);//删除了以後在原集合中就沒有了    boolean b = c.contains("world") ;   System.out.println("c中包含world?"+b);    System.out.println("c的元素數:"+c.size());    //暴力删除  c.clear();  System.out.println("clear 暴力清除:"+c);    //判斷集合是否為空  boolean emp = c.isEmpty();  System.out.println("是否為空?"+emp);//因為我們用clear方法将數組暴力清空了,是以為空    //再添加一次元素    c.add("hello");  c.add("world");  c.add("!") ;      //應用類型轉換為Array數組:可友善周遊  Object[] obj = c.toArray();  for(int x  = 0 ;x < obj.length ;x ++) {//hello world !     System.out.print(obj[x]+ " ");  }    Collection<String> c1 = new ArrayList<String>() ;  c1.add("aloha");  c1.add("你好") ;  c1.add("hello");  c1.add("空你系哇") ;  c1.add("world");  c1.add("!");    System.out.println("c: "+c);  System.out.println("c1: "+c1);  

  //交集判斷  boolean c1jc = c1.retainAll(c) ;  boolean cjc1 = c.retainAll(c1) ;  System.out.println("c1交c: "+ c1jc+ ", c交c1: "+ cjc1);  //結論:兩個集合求交集的傳回值看是誰交誰,若是相交完前者不變化,傳回true,若是相交完前者不變化,傳回false

  //全部包含?  boolean c1c = c1.containsAll(c);  System.out.println("c1包含c? "+c1c);      //删除一個?  boolean c1dc = c1.removeAll(c);  System.out.println("c1删除c? "+c1dc);  System.out.println("現在c1中沒有c中的元素了:"+c1);    // }

}

添加的傳回值是boolean ,如果添加成功傳回true。contains和equals方法的傳回值也都是boolean型,規規矩矩的回報自己完成的情況。

clear()方法是沒有傳回值的,暴力删除就是這麼猛,不用打招呼。

ArrayList的進階功能:全部删除,包含全部判斷,應用類型轉換。。。

控制台輸出結果:

JavaSE——day12集合Collection集合

我們還可以用toArray方法實作對集合轉換成對象數組進行周遊。

疊代器Iterator

        Iterator 是一個接口,這個接口是Collection的超級接口。這個接口有兩個已知子實作類。它是一個疊代器,這個接口有兩個方法:hasnext():若果有元素可以疊代,那麼傳回true,否則傳回false。next()指向集合中的下一個元素。

建立集合的疊代器:

 Iterator<E>

iterator()

            //這是Collection集合上的一個方法          傳回在此 collection 的元素上進行疊代的疊代器。

我們可以這樣建立: Iterator it = Collection的對象名.iterator() ;

注意: 這裡是調用集合的方法,而不是建立集合iterator的對象!是以下面這種是錯誤的:

    Iterator it = new c.iterator();

            另外,由于Collection是沒有實作方法的,是以我們必須先建立Collection的執行個體化對象,預設建立ArrayList。

    Collection c = new ArrayList() ;

這樣it就是我們建立的可用來調用疊代器的對象了。

集合調用疊代器并且用兩個方法周遊的例子:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Test3 {

	public static void main(String[] args) {

		Collection<String> c = new ArrayList<String>() ; 
		
		c.add("hello") ;
		c.add("aloha") ;
		c.add("nihao") ;
		
		//通過集合擷取疊代器
		Iterator it = c.iterator();
	
		//用hasnext和next方法周遊數組
		while(it.hasNext()) {
			System.out.print(it.next()+ " ");
		}
		
	}

}
           

List集合

    List集合的特點:有序的(存儲和取出一緻),可以允許重複元素。     List集合的特有功能:添加、删除、擷取、修改。 例子:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class Test1 {

	public static void main(String[] args) {

		List<String> c = new ArrayList<String>() ;
		
		c.add("hello") ;
		c.add("nihao") ;
		c.add("空你系哇") ;
		System.out.println("c: "+ c);
		
		//從指定位置 處添加指定元素
		c.add(1, "aloha");
		System.out.println("在c的1索引插入元素: "+c);
		
		//擷取:傳回清單指定元素,清單疊代器
		String s = c.get(1) ;
		System.out.println("1索引處的元素是: "+ s );
		
		/**
		 * ListIterator有hasPrevious()和previous()方法,
		 * 可以實作逆向(順序向前)周遊。Iterator就不可以。
		 */
		//ListIterator:擷取清單疊代器
		System.out.print("擷取清單疊代器:");
		ListIterator<String> it = c.listIterator();
		while(it.hasNext()) {
			System.out.print(it.next() + " ");
		}
		System.out.println();
		
		
		//修該方法
		String str = c.set(1, "aolhatothis");
		System.out.println(c+"   " + str);//str便是可以儲存我們1号索引修改前的元素!
		
		
	}

}
           

    ListIterator繼承自Iterator,在Iterator接口功能的基礎上,增加了正向周遊和逆向周遊,但是在逆向周遊之前,必須得先正向周遊。

 java.util.ConcurrentModificationException并發運作異常

    例子:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class Test2 {

	public static void main(String[] args) {

		List c = new ArrayList() ;
		Student s1 = new Student("aloha",22) ;
		Student s2 = new Student("nihao",23) ;
		Student s3 = new Student("hello",24) ;
		Student s4 = new Student("你好",25) ;
	
		List li = c;
		li.add(s1) ;
		li.add(s2) ;
		li.add(s3) ;
		
		ListIterator list = c.listIterator();
		while(list.hasNext()) {
			Student s =(Student)list.next();

			c.add(s4) ;
			System.out.println(s.getName()+"---"+s.getAge());
		}
		
	}

}

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;
	}
	
	
	 
}
           

編譯時期沒有報錯,但是運作出錯了:

JavaSE——day12集合Collection集合

出錯原因是: 我們在使用疊代器周遊數組的時候,加了List集合的方法add,這是造成錯誤的原因。是以我們在使用疊代器周遊元素的時候不能使用集合添加元素。

    解決辦法:   1、使用疊代器添加,使用疊代器周遊。                         2、使用集合周遊,使用集合添加元素(普通for循環)。

ArrayLis實作是不同步的(執行效率高)單線程适用,Vector實作是同步的,是線程安全的适用于多線程。

end:

數組查詢快,增删慢。 連結清單查詢慢,增删快。List接口中的Linkedlist,由一個鍊連接配接了很多節點,節點由資料和位址值組成,在c中叫資料域和指針域,連結清單查詢任何資料都要從頭開始找。

List集合有三個子實作類:

   ArrayList

     底層資料結構式數組結構,查詢快,增删慢

     從記憶體角度考慮:線程不安全的,不同步的,執行效率高

     多線程:synchronized :同步的意思  解決線程安全問題

       sychronized(鎖對象){ 同步代碼

         共享資料; 

       }

     解決線程安全問題,通過同步可以解決,但是效率低了...

   LinkedList

     :底層資料結構式連結清單結構,查詢慢,增删塊

     從記憶體角度考慮:線程不安全,不同步,執行效率高

   Vector:

     這是一個線程安全的類,

     底層資料結構是數組:查詢快,增删慢

     線程安全的,同步,執行效率低!