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()指向集合中的下一個元素。
建立集合的疊代器:
| //這是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;
}
}
編譯時期沒有報錯,但是運作出錯了:
出錯原因是: 我們在使用疊代器周遊數組的時候,加了List集合的方法add,這是造成錯誤的原因。是以我們在使用疊代器周遊元素的時候不能使用集合添加元素。
解決辦法: 1、使用疊代器添加,使用疊代器周遊。 2、使用集合周遊,使用集合添加元素(普通for循環)。
ArrayLis實作是不同步的(執行效率高)單線程适用,Vector實作是同步的,是線程安全的适用于多線程。
end:
數組查詢快,增删慢。 連結清單查詢慢,增删快。List接口中的Linkedlist,由一個鍊連接配接了很多節點,節點由資料和位址值組成,在c中叫資料域和指針域,連結清單查詢任何資料都要從頭開始找。
List集合有三個子實作類:
ArrayList
底層資料結構式數組結構,查詢快,增删慢
從記憶體角度考慮:線程不安全的,不同步的,執行效率高
多線程:synchronized :同步的意思 解決線程安全問題
sychronized(鎖對象){ 同步代碼
共享資料;
}
解決線程安全問題,通過同步可以解決,但是效率低了...
LinkedList
:底層資料結構式連結清單結構,查詢慢,增删塊
從記憶體角度考慮:線程不安全,不同步,執行效率高
Vector:
這是一個線程安全的類,
底層資料結構是數組:查詢快,增删慢
線程安全的,同步,執行效率低!