Collection容器
1、首先我們要瞭解為什麼JAVA中要有容器?
我們知道數組的長度一旦指定,程式在執行過程中就不能改變,正是因為數組有這樣的缺陷,所以才出現就(collection)容器,容器的大小可以任意改變,容器的大小就是根據你實際放入了多少的資料而相應的變大。
2、容器中包括Set 和List,那麼他們有什麼區別呢?
Set是無序唯一的,底層是用Map實現的;List是有序不唯一的,底層是數組,所以可以用索引來得到值
注意:在list中刪除資料時,當刪除的是裡面的整數資料類型時要知道使用封裝類型進行刪除,我們要知道JAVA會自動裝箱和拆箱 但是在Set就不需要使用封裝類型來刪除,因為Set中沒有索引
3、List又分為Arrylist和LinkedList,他們之間又有什麼區別呢?各適用於什麼情況呢?
ArrayList(數組)的記憶體位址連續,這個容器中的資料是經常用來尋找的;LinkedList(鏈表)記憶體位址不連續,這個容器中的資料經常用來更新
4、Iterator(容器的迭代器)
所有實現了Collection介面的類都有一個iterator方法,這個方法會得到一個實現了Iterator的類的對象;List雖然有索引,但是也可以使用JAVA5.0以後出來的增強for迴圈,其實就相當於.Net中的foreach(),但是因為不能方便的操作索引,只用於簡單的遍曆,如果增強for迴圈迭代的是容器的話內部預設的也是使用的Iterator迭代器實現的。但是也必須要使用迭代器來實現,因為這是唯一縣城安全的方法
5、Collections類
該類提供了一系列的方法來對List進行操作,比如說我們自己寫的類要進行比較大小或者是排序,那麼和它相關的一切規則需要我們自己來定義,比如比較對象是否相等或者是判斷大小的規則,如果是要實現比較大小的類一定要實現Comparable介面然後重寫public int compareTo(Object o)方法,為了更美觀的輸出到控制台上也建議重寫public String toString()方法。
如下程式調用collections類中的sort方法對list進行排序,在自己寫的類當中規定好排序的方法:
1 import java.util.*; 2 3 public class test{ 4 public static void main(String[] args){ 5 6 List<Person> list = new ArrayList<Person>(); 7 list.add(new Person("jack",23)); 8 list.add(new Person("tom",19)); 9 list.add(new Person("rose",22));10 list.add(new Person("mack",21));11 list.add(new Person("twins",34)); 12 13 Collections.sort(list); //因為該方法是靜態所以可以直接使用 類名.方法名 直接調用14 System.out.println(list);15 } 16 }17 18 class Person implements Comparable{19 20 public Person(String name,int age){21 this.name = name;22 this.age = age;23 }24 String name;25 int age;26 public String toString(){27 return "name "+this.name +" age:"+this.age ;28 }29 public int compareTo(Object o){30 Person p = (Person)o;31 if(this.age > p.age){32 return 1;33 }else if(this.age < p.age){34 return -1;35 }else{36 return 0;37 }38 39 }40 41 }
6、JAVA5.0之後出現的泛型
概念:指定當前的容器中只能放置什麼樣的類型,並且泛型中沒有父類的引用指向子類的對象
7、容器中為什麼會出現Map?
因為Set是無序的,唯一的,hashSet沒有索引,不方便通過索引來對容器進行操作,所以出現了Map,所以Map就是可以建立索引,而且這個索引還是自己定義的。Map是以Key-value(鍵-值)對的形式來儲存資料的,添加資料是使用Map.put( index,value);index是自訂的類型,可以是自己規定的;擷取資料是使用Map.get(index) 其實Map就相當於List只是Map是添加了索引的功能
Map的迭代方法有兩種:
1)、先使用map.keySet()方法獲得map裡面的所有Key值封裝成Set類型,然後再使用set的iterator迭代器來進行迭代,獲得key值就可以獲得value值 如下代碼:
import java.util.*;public class test{public static void main(String[] args){ Map<String,String> map = new HashMap<String,String>(); map.put("1","zhong"); map.put("2","ke"); map.put("3","wen"); map.put("4","good"); map.put("5","night !!"); Set<String> set = map.keySet(); for(Iterator i = set.iterator();i.hasNext();){ String key = (String)i.next(); System.out.println(map.get(key)); }} }
2)、使用Map中的EntrySet方法來獲得索引值對Entry,封裝成Set試圖在使用Set中的Iterator方法進行迭代。Entry代表的是一對key-value,我們可以把他看成是Map的屬性(成員變數)
如下代碼所示:
import java.util.*;public class test{public static void main(String[] args){ Map<String,String> map = new HashMap<String,String>(); map.put("1","zhong"); map.put("2","ke"); map.put("3","wen"); map.put("4","good"); map.put("5","night !!"); Set<Map.Entry<String,String>> entrys = map.entrySet(); for(Iterator<Map.Entry<String,String>> i = entrys.iterator();i.hasNext();){ Map.Entry<String,String> entry = i.next(); System.out.println(entry.getValue()); } } }