java集合詳解

1、概念

1.集合的由來

  數組長度是固定,當添加的元素超過了數組的長度時須要對數組從新定義,太麻煩,java內部給咱們提供了集合類,能存儲任意對象,長度是能夠改變的,隨着元素的增長而增長,隨着元素的減小而減小。java

2.數組和集合的區別

   區別1 :
   數組既能夠存儲基本數據類型,又能夠存儲引用數據類型,基本數據類型存儲的是值,引用數據類型存儲的是地址值。
   集合只能存儲引用數據類型(對象)集合中也能夠存儲基本數據類型,可是在存儲的時候會自動裝箱變成對象。
   區別2:
   數組長度是固定的,不能自動增加。
   集合的長度的是可變的,能夠根據元素的增長而增加。程序員

3.數組和集合何時用

  1.若是元素個數是固定的推薦用數組
  2.若是元素個數不是固定的推薦用集合算法

4.集合繼承體系圖

2、Collection與List具體方法及實現

1.Collection集合的基本功能及方法

  Collection爲集合的根接口,因此只能實例化他的子類。數組

  Collection coll = new ArrayList();安全

  Colleciton的方法以下:

  boolean add(E e)  //添加元素並返回是否包含指定元素布爾值
  boolean remove(Object o)  //從該集合中刪除指定元素的單個實例
  void clear()  //今後集合中刪除全部元素
  boolean contains(Object o)    //若是此集合包含指定的元素,則返回 true
  boolean isEmpty()    //若是此集合不包含元素,則返回 true
  int size()   //返回此集合中的元素數。數據結構

  boolean addAll(Collection c)
  boolean removeAll(Collection c)
  boolean containsAll(Collection c)
  boolean retainAll(Collection c)併發

  ......框架

  注意:add方法若是是List集合會一直返回true,由於List集合能夠存儲重複元素;函數

若是是Set集合當存儲重複元素的時候就會返回false。測試

2.集合的遍歷之迭代器遍歷

Collection c = new ArrayList();
            c.add("a");
            c.add("b");
            c.add("c");
            c.add("d");
            
            Iterator it = c.iterator();                            
                         //獲取迭代器的引用
            while(it.hasNext()) {                            
                        //集合中的迭代方法(遍歷)
                System.out.println(it.next());
            }

  迭代器原理
  迭代器原理:迭代器是對集合進行遍歷,而每個集合內部的存儲結構都是不一樣的,因此每個集合存和取都是不同,那麼就須要在每個類中定義hasNext()和next()方法,這樣作是能夠的,可是會讓整個集合體系過於臃腫,迭代器是將這樣的方法向上抽取出接口,而後在每一個類的內部,定義本身迭代方式,這樣作的好處有二,第一規定了整個集合體系的遍歷方式都是hasNext()和next()方法,第二,代碼有底層內部實現,使用者不用管怎麼實現的,會用便可。

3.List集合的特有功能概述和測試

A:List集合的特有功能概述

  List list = new ArrayList();
  void add(int index,E element)
  E remove(int index)
  E get(int index)
  E set(int index,E element)

B、List集合存儲學生對象並遍歷

  經過size()和get()方法結合使用遍歷。

List list = new ArrayList();
            list.add(new Student("張三", 18));
            list.add(new Student("李四", 18));
            list.add(new Student("王五", 18));
            list.add(new Student("趙六", 18));
            
            for(int i = 0; i < list.size(); i++) {
                Student s = (Student)list.get(i);
                System.out.println(s.getName() + "," + s.getAge());
            }

4.ConcurrentModificationException併發修改異常

  集合遍歷時添加元素會拋出ConcurrentModificationException併發修改異常。

  解決辦法:

  迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)。

  ListIterator lit = list.listIterator();

  lit.add("javaee");

 3、ArrayList與LinkedList、泛型

1.ArrayList去除集合中字符串的重複值(字符串的內容相同)

public static ArrayList getSingle(ArrayList list) {
                ArrayList newList = new ArrayList();            
                                             //建立一個新集合
                Iterator it = list.iterator();                    
                                            //獲取迭代器
                while(it.hasNext()) {                            
                                            //判斷老集合中是否有元素
                    String temp = (String)it.next();            
                                                        //將每個元素臨時記錄住
                    if(!newList.contains(temp)) {                
                                                      //若是新集合中不包含該元素
                        newList.add(temp);                        
                                                       //將該元素添加到新集合中
                    }
                }
                return newList;                                    
                                                      //將新集合返回
            }

2.LinkedList的特有功能

1.LinkedList類特有功能

  public void addFirst(E e)及addLast(E e)
  public E getFirst()及getLast()
  public E removeFirst()及public E removeLast()
  public E get(int index);

3.泛型

1.泛型概述

  Java 泛型(generics)是 JDK 5 中引入的一個新特性, 泛型提供了編譯時類型安全檢測機制,該機制容許程序員在編譯時檢測到非法的類型。

  泛型的本質是參數化類型,也就是說所操做的數據類型被指定爲一個參數。

2.泛型的特徵

 B:泛型好處
  提升安全性(將運行期的錯誤轉換到編譯期)
  省去強轉的麻煩
C:泛型基本使用
  <>中放的必須是引用數據類型
D:泛型使用注意事項
  先後的泛型必須一致,或者後面的泛型能夠省略不寫(1.7的新特性菱形泛型)

4、set集合及之類

1.HashSet原理

咱們使用Set集合都是須要去掉重複元素的, 若是在存儲的時候逐個equals()比較, 效率較低,哈希算法提升了去重複的效率, 下降了使用equals()方法的次數
當HashSet調用add()方法存儲對象的時候, 先調用對象的hashCode()方法獲得一個哈希值, 而後在集合中查找是否有哈希值相同的對象
若是沒有哈希值相同的對象就直接存入集合
若是有哈希值相同的對象, 就和哈希值相同的對象逐個進行equals()比較,比較結果爲false就存入, true則不存

2.將自定義類的對象存入HashSet去重複

類中必須重寫hashCode()和equals()方法
hashCode(): 屬性相同的對象返回值必須相同, 屬性不一樣的返回值儘可能不一樣(提升效率)
equals(): 屬性相同返回true, 屬性不一樣返回false,返回false的時候存儲

3.LinkedHashSet的概述和使用

  底層是鏈表實現的,是set集合中惟一一個能保證怎麼存就怎麼取的集合對象。

  由於是HashSet的子類,因此也是保證元素的惟一性,與HashSet的原理同樣。

4.TreeSet

1.特色
  TreeSet是用來排序的, 能夠指定一個順序, 對象存入以後會按照指定的順序排列
2.使用方式
a.天然順序(Comparable)
  TreeSet類的add()方法中會把存入的對象提高爲Comparable類型
  調用對象的compareTo()方法和集合中的對象比較
  根據compareTo()方法返回的結果進行存儲
 b.比較器順序(Comparator)
  建立TreeSet的時候能夠制定 一個Comparator
  若是傳入了Comparator的子類對象, 那麼TreeSet就會按照比較器中的順序排序
  add()方法內部會自動調用Comparator接口中compare()方法排序
  調用的對象是compare方法的第一個參數,集合中的對象是compare方法的第二個參數
c.兩種方式的區別
  TreeSet構造函數什麼都不傳, 默認按照類中Comparable的順序(沒有就報錯ClassCastException)
  TreeSet若是傳入Comparator, 就優先按照Comparator

5、Map集合

1.集合框架

A:Map接口概述
  將鍵映射到值的對象
  一個映射不能包含重複的鍵
  每一個鍵最多隻能映射到一個值
B:Map接口和Collection接口的不一樣
  Map是雙列的,Collection是單列的
  Map的鍵惟一,Collection的子體系Set是惟一的
  Map集合的數據結構值針對鍵有效,跟值無關;Collection集合的數據結構是針對元素有效

2.HashMap和LinkedHashMap

相關文章
相關標籤/搜索