java 集合框架

本文爲集合框架總的整理,方便之後快速查看,大部分爲連接指引(別人寫的好,本身則不必寫了),有一些是看別人博客以爲看不懂(一上來就灌輸一大堆概念)不夠友好而本身寫的。html

-------------------------------------------------------------------------------------------------------------------------------------java

1.ArrayListhttp://www.javashuo.com/article/p-vtixszls-bh.html程序員

2.LinkedListhttp://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 }
View Code

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 }
View Code
運行結果

向下類型轉換時產生錯誤,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 }
View Code

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 }
View Code

(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 }
View Code

(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 }
View Code
 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 }
View Code

------------------------------------------------------------------------

 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 }
View Code

再建立一個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 }
View Code

建立一個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 }
View Code

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     }
View Code

 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

7.集合體系框架總結

相關文章
相關標籤/搜索