1. 程式人生 > >Java集合整理(List and Set and Map)

Java集合整理(List and Set and Map)

這裡寫圖片描述

  • 集合的由來
    • 陣列長度是固定,當新增的元素超過了陣列的長度時需要對陣列重新定義,太麻煩,java內部給我們提供了集合類,能儲存任意物件,長度是可以改變的,隨著元素的增加而增加,隨著元素的減少而減少
  • 陣列和集合的區別
    • 區別1 :
      • 陣列既可以儲存基本資料型別,又可以儲存引用資料型別,基本資料型別儲存的是值,引用資料型別儲存的是地址值
      • 集合只能儲存引用資料型別(物件)集合中也可以儲存基本資料型別,但是在儲存的時候會自動裝箱變成物件
    • 區別2:
      • 陣列長度是固定的,不能自動增長
      • 集合的長度的是可變的,可以根據元素的增加而增長
  • C:陣列和集合什麼時候用
    * 1,如果元素個數是固定的推薦用陣列
    * 2,如果元素個數不是固定的推薦用集合
  • A:迭代器原理
    • 迭代器原理:迭代器是對集合進行遍歷,而每一個集合內部的儲存結構都是不同的,所以每一個集合存和取都是不一樣,那麼就需要在每一個類中定義hasNext()和next()方法,這樣做是可以的,但是會讓整個集合體系過於臃腫,迭代器是將這樣的方法向上抽取出介面,然後在每個類的內部,定義自己迭代方式,這樣做的好處有二,第一規定了整個集合體系的遍歷方式都是hasNext()和next()方法,第二,程式碼有底層內部實現,使用者不用管怎麼實現的,會用即可
  • B:迭代器原始碼解析
    • 查詢iterator()方法
    • 檢視返回值型別是內部類new Itr(),說明Itr這個類實現Iterator介面
    • 查詢Itr這個內部類,發現重寫了Iterator中的所有抽象方法
      Iterator介面部分原始碼:
 * @author  Josh Bloch
 * @see Collection
 * @see ListIterator
 * @see Iterable
 * @since 1.2
 */
public interface Iterator<E> {
    /**
     * Returns {@code true} if the iteration has more elements.
     * (In other words, returns {@code true} if {@link
#next} would * return an element rather than throwing an exception.) * * @return {@code true} if the iteration has more elements */
boolean hasNext(); /** * Returns the next element in the iteration. * * @return the next element in the iteration * @throws NoSuchElementException if the iteration has no more elements */ E next();

Arraylist內部類

 /**
     * Returns an iterator over the elements in this list in proper sequence.
     *
     * <p>The returned iterator is <a href="#fail-fast"><i>fail-fast</i></a>.
     *
     * @return an iterator over the elements in this list in proper sequence
     */
    public Iterator<E> iterator() {
        return new Itr();
    }
 /**
     * An optimized version of AbstractList.Itr
     */
    private class Itr implements Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;

        public boolean hasNext() {
            return cursor != size;
        }

        @SuppressWarnings("unchecked")
        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }


內部類實現了iterator介面,重寫了next,hassNext方法,擴充套件性賊雞兒強,針對不同的集合,都有自己的實現。

  • A:Vector類概述
  • B:Vector類特有功能

    • public void addElement(E obj)
    • public E elementAt(int index)
    • public Enumeration elements()

    • Vector的迭代

            Vector v = new Vector();                //建立集合物件,List的子類
            v.addElement("a");
            v.addElement("b");
            v.addElement("c");
            v.addElement("d");
            //Vector迭代
            Enumeration en = v.elements();          //獲取列舉
            while(en.hasMoreElements()) {           //判斷集合中是否有元素
                System.out.println(en.nextElement());//獲取集合中的元素
            }

*去除ArrayList中重複自定義物件元素
* :案例演示
* 需求:ArrayList去除集合中自定義物件元素的重複值(物件的成員變數值相同)
* :注意事項
* 重寫equals()方法的
List總結:
* A:List的三個子類的特點
ArrayList:
底層資料結構是陣列,查詢快,增刪慢。
執行緒不安全,效率高。
Vector:
底層資料結構是陣列,查詢快,增刪慢。
執行緒安全,效率低。
Vector相對ArrayList查詢慢(執行緒安全的)
Vector相對LinkedList增刪慢(陣列結構)
LinkedList:
底層資料結構是連結串列,查詢慢,增刪快。
執行緒不安全,效率高。

    Vector和ArrayList的區別
        Vector是執行緒安全的,效率低
        ArrayList是執行緒不安全的,效率高
    共同點:都是陣列實現的
    ArrayList和LinkedList的區別
        ArrayList底層是陣列結果,查詢和修改快
        LinkedList底層是連結串列結構的,增和刪比較快,查詢和修改比較慢
    共同點:都是執行緒不安全的

* B:List有三個兒子,我們到底使用誰呢?
查詢多用ArrayList
增刪多用LinkedList
如果都多ArrayList

  • A:Set集合概述及特點
    *此類實現Set介面,由雜湊表(實際為HashMap例項)支援。 對集合的迭代次序不作任何保證; 特別是,它不能保證訂單在一段時間內保持不變。 這個類允許null元素。不存在索引

*17.04_集合框架(HashSet如何保證元素唯一性的原理)
* 1.HashSet原理
* 我們使用Set集合都是需要去掉重複元素的, 如果在儲存的時候逐個equals()比較, 效率較低,雜湊演算法提高了去重複的效率, 降低了使用equals()方法的次數
* 當HashSet呼叫add()方法儲存物件的時候, 先呼叫物件的hashCode()方法得到一個雜湊值, 然後在集合中查詢是否有雜湊值相同的物件
* 如果沒有雜湊值相同的物件就直接存入集合
* 如果有雜湊值相同的物件, 就和雜湊值相同的物件逐個進行equals()比較,比較結果為false就存入, true則不存
* 2.將自定義類的物件存入HashSet去重複
* 類中必須重寫hashCode()和equals()方法
* hashCode(): 屬性相同的物件返回值必須相同, 屬性不同的返回值儘量不同(提高效率)
* equals(): 屬性相同返回true, 屬性不同返回false,返回false的時候儲存
* A:LinkedHashSet的特點
* B:案例演示
* LinkedHashSet的特點
* 可以保證怎麼存就怎麼取
*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

  • A:Map介面概述
    • 檢視API可以知道:
      • 將鍵對映到值的物件
      • 一個對映不能包含重複的鍵
      • 每個鍵最多隻能對映到一個值
  • B:Map介面和Collection介面的不同
    • Map是雙列的,Collection是單列的
    • Map的鍵唯一,Collection的子體系Set是唯一的
    • Map集合的資料結構值針對鍵有效,跟值無關;Collection集合的資料結構是針對元素有效
    • HashMap和Hashtable的區別
      • Hashtable是JDK1.0版本出現的,是執行緒安全的,效率低,HashMap是JDK1.2版本出現的,是執行緒不安全的,效率高
      • Hashtable不可以儲存null鍵和null值,HashMap可以儲存null鍵和null值
  • B:Collections成員方法
  • *
    public static <T> void sort(List<T> list)
        public static <T> int binarySearch(List<?> list,T key)
        public static <T> T max(Collection<?> coll)
        public static void reverse(List<?> list)  //翻轉集合
        public static void shuffle(List<?> list) //隨機置換

基本大致等同於Set Set底層實現依賴的是Map!