本文爲集合框架總的整理,方便之後快速查看,大部分爲連接指引(別人寫的好,本身則不必寫了),有一些是看別人博客以爲看不懂(一上來就灌輸一大堆概念)不夠友好而本身寫的。html
-------------------------------------------------------------------------------------------------------------------------------------java
1.ArrayList:http://www.javashuo.com/article/p-vtixszls-bh.html程序員
2.LinkedList:http://www.javashuo.com/article/p-fakdpnft-cs.html安全
3.Vector:用法--->https://www.cnblogs.com/zheting/p/7708366.html 源碼解析------>http://www.javashuo.com/article/p-zthdqkun-dm.html 框架
和ArrayList的區別---->https://www.cnblogs.com/wanlipeng/archive/2010/10/21/1857791.htmlide
-------------------------------------------------------------------------------------------------------------------------------------------------------函數
4.Map測試
1). 實現 Map 接口的類用來存儲鍵(key) -值(value)對
2). Map 接口的實現類有 HashMap 和 TreeMap 等
3). Map 類中存儲的鍵-值對經過鍵來標識,因此鍵值不能
重複this
4.1HashMap的使用spa
1 import java.util.Collection; 2 import java.util.HashMap; 3 import java.util.Set; 4 5 public class TestHashMap { 6 public static void main(String[] args) { 7 //Map接口的特色,key不容許重複,值能夠重複,並且key是無序的 8 //建立集合對象 9 HashMap hm=new HashMap(); 10 //(1)添加元素 11 hm.put("hello", 123);//123自動裝箱,Integer類型 12 hm.put("world",456); 13 hm.put("hello", 1000); //集合中的key不能重複,若是重複,將進行值的覆蓋 14 hm.put("java", 1000); 15 System.out.println("集合中元素的個數:"+hm.size());//3 16 System.out.println("集合是否爲空:"+hm.isEmpty());//false 17 System.out.println(hm);//{world=456, java=1000, hello=1000} 18 System.out.println(hm.remove("world"));//456 (先輸出後移除) 19 System.out.println(hm);//{java=1000, hello=1000} 20 //判斷 21 System.out.println(hm.containsKey("java")+"\t"+hm.containsKey("world"));//true false 22 System.out.println(hm.containsValue(1000)+"\t"+hm.containsValue(2000));//true false 23 //獲取元素 24 System.out.println(hm.get("java")+"\t"+hm.get("world"));//1000 null 25 //獲取全部key的集合 26 Set set=hm.keySet(); 27 for(Object obj:set){ //java 28 System.out.println(obj);//hello 29 } 30 //獲取全部的value的集合 31 System.out.println("\n--------------------------"); 32 Collection coll=hm.values(); 33 for(Object obj:coll){ //1000 34 System.out.println(obj);//1000 35 } 36 //獲取全部key-value關係的集合 37 Set entrySet=hm.entrySet(); 38 for(Object obj:entrySet){ //java=1000 39 System.out.println(obj);//hello=1000 40 } 41 42 /** 43 * HashMap與Hashtable用法相同 44 * HashMap與Hashtable的區別 45 * (1)版本不一樣 HashMap JDK1.2 Hashtable 1.0 46 * (2)HashMap繼承了AbstractMap,實現了Map接口,Hashtable繼承了Dictionary實現Map接口 47 * (3)HashMap容許null值和null鍵, 可是null做爲key只允一個, Hashtable非null的鍵和值 48 * (4)HashMap是線程不一樣步的 (效率高,安全性低),Hashtable(效率低,安全性高)線程同步 49 * 50 * 51 * */ 52 } 53 }
4.2HashMap實現原理---->https://www.cnblogs.com/xwdreamer/archive/2012/05/14/2499339.html
4.3二叉樹和紅黑樹----->http://www.javashuo.com/article/p-ncgmlhbk-du.html 深刻理解--->http://www.cnblogs.com/yangecnu/p/Introduce-Red-Black-Tree.html
4.4TreeMap--->Key:惟 一,有序,升序
若是使用 TreeMap 存儲自定義對象作爲 key 時,要求必須具
備比較規則,不然運行報錯
淺析--->http://www.javashuo.com/article/p-xjzvshys-eb.html 深刻理解--->http://www.javashuo.com/article/p-owkxwugs-kh.html
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5.Set:惟1、無序
Set的實現類都是基於Map來實現的(HashSet是經過HashMap實現的,TreeSet是經過TreeMap實現的)。
HashSet依賴於HashMap,它其實是經過HashMap實現的。HashSet中的元素是無序的。
HashSet------->http://www.javashuo.com/article/p-kzigpcrx-ek.html
TreeSet依賴於TreeMap,它其實是經過TreeMap實現的。TreeSet中的元素是有序的。
TreeSet-------->http://www.javashuo.com/article/p-nxodlshh-er.html
--------------------------------------------------------------------------------------------------------------------------------------------------------------
6.泛型
6.1 爲何須要使用泛型
JDK1.4 之前類型不明確:
裝入集合的類型都被看成 Object 對待,從而失去本身的實際
類型。
從集合中取出時每每須要轉型,效率低,容易產生錯誤。
1 import java.util.ArrayList; 2 3 public class Test { 4 public static void main(String[] args) { 5 6 ArrayList a1 = new ArrayList(); 7 a1.add("hello"); 8 a1.add(123); 9 for(Object obj : a1) { 10 String s = (String)obj; 11 System.out.println(s); 12 } 13 } 14 }
向下類型轉換時產生錯誤,Integer是不能去轉成String的
---------------------------------------------------------------------------------------------------------------
6.2 解決辦法:
泛型,在定義集合的時候同時定義集合中對象的類型
1 import java.util.ArrayList; 2 3 public class Test { 4 public static void main(String[] args) { 5 //在建立集合對象時,明確集合中所存儲的元素的類型 6 7 ArrayList<String> al=new ArrayList<String>(); 8 al.add("hello"); 9 //al.add(123);//指定爲String存儲類型後再添加Integer類型會報錯 10 for (String str : al) { 11 System.out.println(str); 12 } 13 } 14 }
6.3 好處:
加強程序的可讀性和安全性
6.4 泛型的分類
(1)泛型類
1 public class MyGeneric<T> {//T就是一個英文字母,表明一種數據類型,在建立實例時肯定 2 3 } 4 class TestMyGeneric{ 5 public static void main(String[] args) { 6 MyGeneric<String> my1=new MyGeneric<String>(); 7 MyGeneric<Integer> my2=new MyGeneric<Integer>(); 8 } 9 }
(2)泛型接口
1 public interface MyInterface<T> { 2 3 } 4 class MyImplement implements MyInterface<String>{ 5 6 } 7 class MyImplement1<T> implements MyInterface<T>{ 8 9 } 10 class TestMyInterface{ 11 public static void main(String[] args) { 12 MyImplement my=new MyImplement(); 13 14 MyImplement1<Integer> my2=new MyImplement1<Integer>(); 15 } 16 }
(3)泛型方法
1 public class MyMethod<T> {//泛型類 2 public void show(T t){ //在建立MyMethod類的對象時決定 3 System.out.println(t); 4 } 5 public <Q> void method(Q q){ //在調用method這個方法時明確 6 System.out.println(q); 7 } 8 public <K>void fun(K...k){ //可變參數的泛型方法 9 for (int i = 0; i < k.length; i++) { 10 System.out.println(k[i]); 11 } 12 } 13 }
1 public class TestMyMethod { 2 public static void main(String[] args) { 3 MyMethod<String> my=new MyMethod<String>(); 4 my.show("hello");//在建立類的對象時明確了數據類型爲String 5 6 //有了泛型方法,解決了參數個數相同的狀況下的方法重載 7 my.method("hello"); 8 my.method(123); 9 my.method('a'); 10 11 //可變參數的泛型方法,解決參數的個數不一樣,類型不一樣的方法重載 12 my.fun("hello"); 13 my.fun("hello","world","java"); 14 my.fun(123,456); 15 } 16 }
------------------------------------------------------------------------
6.5 泛型的高級使用
泛型的上限:使用關鍵字 extends,表示參數化的類型多是
所指定的類型或者是此類型的子類
泛型的下限:使用關鍵字 super 進行聲明,表示參數化的類型
多是所指定的類型,或者是此類型的父類型,直至 Object
類
先建立一個Person類,包含姓名,年齡屬性,get() set()方法,有參無參構造函數,重寫toString方法
1 public class Person{ 2 private String name; //姓名 3 private int age;//年齡 4 5 @Override 6 public String toString() { 7 return "Person [name=" + name + ", age=" + age + "]"; 8 } 9 public String getName() { 10 return name; 11 } 12 public void setName(String name) { 13 this.name = name; 14 } 15 public int getAge() { 16 return age; 17 } 18 public void setAge(int age) { 19 this.age = age; 20 } 21 public Person(String name, int age) { 22 super(); 23 this.name = name; 24 this.age = age; 25 } 26 public Person() { 27 super(); 28 } 29 }
再建立一個Student類,繼承Person類,包含學號屬性,get() set()方法,有參無參構造函數,重寫toString方法
1 public class Student extends Person { 2 private String stuNo;//學號 3 4 @Override 5 public String toString() { 6 return super.toString()+"Student [stuNo=" + stuNo + "]"; 7 } 8 9 public String getStuNo() { 10 return stuNo; 11 } 12 public void setStuNo(String stuNo) { 13 this.stuNo = stuNo; 14 } 15 public Student(String name, int age, String stuNo) { 16 super(name, age); 17 this.stuNo = stuNo; 18 } 19 public Student() { 20 super(); 21 } 22 }
建立一個Test類測試
1 import java.util.ArrayList; 2 3 public class Test { 4 public static void main(String[] args) { 5 //建立集合對象,同時明確了集合中所存儲的對象的類型只能是Person類型 6 ArrayList<Person> al=new ArrayList<Person>(); 7 //建立Person類型的對象添加到集合中 8 Person p1=new Person("marry", 20); 9 Person p2=new Person("lili",29); 10 Person p3=new Person("jack",18); 11 //添加以集合中 12 al.add(p1); 13 al.add(p2); 14 al.add(p3); 15 //遍歷集合 16 print(al); 17 /* Person [name=marry, age=20] 18 Person [name=lili, age=29] 19 Person [name=jack, age=18] 20 * */ 21 22 23 //建立一個集合對象,用於存儲Student類型的對象 24 ArrayList<Student> al2=new ArrayList<Student>(); 25 Student stu1=new Student("sean", 20, "sxt1001"); 26 Student stu2=new Student("nico",19,"sxt1002"); 27 //添加到集合中 28 al2.add(stu1); 29 al2.add(stu2); 30 //須要遍歷集合 31 print(al2); 32 /* 33 * Person [name=sean, age=20]Student [stuNo=sxt1001] 34 Person [name=nico, age=19]Student [stuNo=sxt1002] 35 */ 36 37 38 //調用show方法 39 System.out.println("\n---------------------------\n"); 40 41 show(al); 42 /* 43 * Person [name=marry, age=20] 44 Person [name=lili, age=29] 45 Person [name=jack, age=18] 46 */ 47 48 show(al2); 49 /* 50 * Person [name=sean, age=20]Student [stuNo=sxt1001] 51 Person [name=nico, age=19]Student [stuNo=sxt1002] 52 */ 53 54 ArrayList<Object> alObject=new ArrayList<Object>(); 55 Object ob1=new Object(); 56 Object obj2=new Object(); 57 alObject.add(ob1); 58 alObject.add(obj2); 59 60 show(alObject);//泛型下限 Object類型也可使用show()方法 61 /* 62 * java.lang.Object@1175e2db 63 java.lang.Object@36aa7bc2 64 */ 65 } 66 67 //泛型上限,Person及Person的子類 68 //<? extends Person>解釋:?(通配符) 誰 extends 繼承了 Person 誰就可使用這個方法 69 public static void print(ArrayList<? extends Person> al){ 70 for (Person p : al) { 71 System.out.println(p); 72 } 73 } 74 75 //泛型下限,Student及Student的父類 76 //<? super Student>解釋: ?(通配符) 誰 super Student 是Student的父類 誰就可使用這個方法 77 public static void show(ArrayList<? super Student> al){ 78 for (Object obj : al) { 79 System.out.println(obj); 80 } 81 } 82 }
6.6 泛型的好處
類型安全。 泛型的主要目標是提升 Java 程序的類型安全。經過知道使用泛型定義的變量的類型限制,編譯器能夠在一個高得多的程度上驗證類型假設。沒有泛型,這些假設就只存在於程序員的頭腦中(或者若是幸運的話,還存在於代碼註釋中)。
消除強制類型轉換。 泛型的一個附帶好處是,消除源代碼中的許多強制類型轉換。這使得代碼更加可讀,而且減小了出錯機會。
儘管減小強制類型轉換能夠下降使用泛型類的代碼的羅嗦程度,可是聲明泛型變量會帶來相應的羅嗦。比較下面兩個代碼例子。
該代碼不使用泛型:
List li = new ArrayList(); li.put(new Integer(3)); Integer i = (Integer) li.get(0);
該代碼使用泛型:
List<Integer> li = new ArrayList<Integer>(); li.put(new Integer(3)); Integer i = li.get(0);
在簡單的程序中使用一次泛型變量不會下降羅嗦程度。可是對於屢次使用泛型變量的大型程序來講,則能夠累積起來下降羅嗦程度。
6.7 容器中使用泛型
1 import java.util.ArrayList; 2 import java.util.HashMap; 3 import java.util.HashSet; 4 import java.util.LinkedList; 5 import java.util.TreeMap; 6 import java.util.TreeSet; 7 8 public class Test2 { 9 public static void main(String[] args) { 10 11 ArrayList<String> al=new ArrayList<String>(); 12 al.add("hello"); 13 14 LinkedList<Integer> linkedList=new LinkedList<Integer>(); 15 linkedList.add(123);//123進行了自動裝箱 16 17 //存儲自定時對象時,要求Person類重寫hashCode()及equals()方法 18 HashSet<Person> hs=new HashSet<Person>(); 19 20 //Person 對象具有比較規則 ,能夠是內部比較器,也能夠外部比較器 21 TreeSet<Person> treeSet=new TreeSet<Person>(); 22 23 HashMap<String,Integer> hm=new HashMap<String,Integer>(); 24 hm.put("hello", 123); 25 26 HashMap<Person,String> hm2=new HashMap<Person,String>(); 27 Person p1=new Person("marry",20); 28 hm2.put(p1, p1.getName()); 29 30 TreeMap<Person,Integer> tm=new TreeMap<Person,Integer>(); 31 tm.put(p1, p1.getAge()); 32 33 //泛型只在編譯期間起做用 34 }
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
7.集合體系框架總結