2021年8月11日


今天的內容

1.ArrayList【重點】

2.LinkedList【開發不用,但是面試會問】

3.Object【所有的超類】

4.Set接口

1.ArrayList

首先看官方API

Collection下面有一個子接口叫List

List接口下面有一個實現類叫ArrayList

ArrayList底層是數組

ArrayList也是容器,可以放數據

源碼分析

/**
    * Default initial capacity.
    默認的變量,變量值是10   默認的初始化的容量
    */
   private static final int DEFAULT_CAPACITY = 10;
/**
    * Shared empty array instance used for empty instances.
    聲明了一個空的數組EMPTY_ELEMENTDATA 變量
    */
   private static final Object[] EMPTY_ELEMENTDATA = {};
/**
    * Shared empty array instance used for default sized empty instances. We
    * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
    * first element is added.
    默認容量的空數組
    */
   private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
    * The size of the ArrayList (the number of elements it contains).
    *
    * @serial
    數組的有效的容量 size 默認值是0
    */
   private int size;
/**
    * Constructs an empty list with the specified initial capacity.
    *
    * @param initialCapacity the initial capacity of the list
    * @throws IllegalArgumentException if the specified initial capacity
    *         is negative
    構造方法,在實例化的時候調用有參數的構造
    */
   public ArrayList(int initialCapacity) {
       if (initialCapacity > 0) {
           this.elementData = new Object[initialCapacity];
      } else if (initialCapacity == 0) {
           this.elementData = EMPTY_ELEMENTDATA;
      } else {
           throw new IllegalArgumentException("Illegal Capacity: "+
                                              initialCapacity);
      }
  }
/**
    * Constructs an empty list with an initial capacity of ten.
    無參數的構造方法
    構造了一個初始化容量為10的空的數組
    */
   public ArrayList() {
       this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
  }


//擴容的方法。當數組的容量不夠的話,會自動擴容
private void grow(int minCapacity) {
       // overflow-conscious code
    //oldCapacity 是老的容量
       int oldCapacity = elementData.length;//10個容量 數組里面只能放10個元素
    //newCapacity新的容量 (oldCapacity >> 1);叫位元算符
    // int newCapacity = oldCapacity + oldCapacity * 0.5;
    //int newCapacity = 1.5 * oldCapacity;//擴容的是原來數組的1.5倍
    //原來的數據是10   擴容以后的容量是15  
       int newCapacity = oldCapacity + (oldCapacity >> 1);
       if (newCapacity - minCapacity < 0)
           newCapacity = minCapacity;
       if (newCapacity - MAX_ARRAY_SIZE > 0)
           newCapacity = hugeCapacity(minCapacity);
       // minCapacity is usually close to size, so this is a win:
    //擴容完以后,進行數組的賦值
    //[1,2,3,4,5,6,7,8,9,10] 原來的數組
    //[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] 在賦值一個數組這個數組容量是15
    //進行數組的擴容了,新的數組還有有老數組中的數據
//所以使用copy方法
       elementData = Arrays.copyOf(elementData, newCapacity);
  }

面試題:
ArrayList處理數據的特征:
增數據刪數據比較慢。為什么?
      增加數據效率低:
      1.有可能會涉及到數組的擴容,涉及到數組的copy
      2.添加數據到指定位置的時候,會導致從添加數據位置開始整體后移
      刪除數據效率低:
      從刪除數據開始,數據整體前移一位
   查找快。為什么?
       用的索引進行查找的
       好比一本書,有目錄。你要找某一章節,這個章節有頁碼數,直接翻到頁碼數
       頁碼數就是這個索引
       cpu是通過訪問內存地址(數組+下標)直接定位到集合中的元素的
       
       就好比我找咱們的學員,直接通過名字進行查找。所以效率比較高
       開發中一般使用ArrayList,開發中查詢偏多
       
       
       查找是1,增刪是n,對於ArrayList來說

1png

2.LinkedList

父接口是List

它和ArrayList是親兄弟。但是開發中使用ArrrayList而不用LinkedList

雙向鏈表:自行車的車鏈子

LinkedList是隊列

隊列:先進先出

棧:先進后出 有底的

面試經常問

ArrayList和LinkedList的特點和區別

ArrayList和LinkedList 都是List接口的實現類

ArrayList在查詢數據的時候比較快,但是增刪慢

LinkedList查詢的時候慢,增刪的時候快

linkedList底層是雙向鏈表結構

查找慢:是因為使用了二分法查找的算法

[1,2,3,4,5,6,7,8,9,10] 比如找3這個數,

[1,2,3,4,5] [6,7,8,9,10] 一分為2

[1,2,3,4,5] 再一分為2

[1,2,3] [4,5]

[1,2,3] 再一分為2

[1,2] [3] 哦找到了 3

查詢的時候進行了n次 使用LinkedList查找的時候進行了n次,他不是一次就出來了

增刪快:因為LinkedList底層是一個節點內部類。

開發中咱們只使用ArrayList,而不用LinkedList。因為咱們以后的網站查詢使用的較多。增刪較少,使用ArrayList的時候幾乎不影響效率的

上午講的東西和開發無關,和面試有關,沒有聽懂的沒有關系,學到后期咱們會專門對源碼進行分析,因為你現在 的水平還達不到看源碼的程度。

3.Object類

Object類是所有類的基類

toString();

equals();

Object類下面的equals方法比較的是兩個對象的地址,比較嚴格

public boolean equals(Object obj) {
return (this == obj);
}
==比較的是內存地址和內容,比較嚴格

String類下面的equals比較的是內容。充分說明了一點。String類肯定重寫了Object

下面的equals方法。

public boolean equals(Object anObject) {
//也是先看兩個地址是否一致,如果兩個對象的地址一致,肯定內容也一致了
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        //強轉 "好像睡覺" = value
        // "好像睡覺" = anotherString.value
        String anotherString = (String)anObject;
        int n = value.length;//字符串的長度 9
        if (n == anotherString.value.length) {
            //為什么要先比較兩個字符串的長度呢?
            //比較兩個字符串的時候,如果長度不同,這個兩個字符串肯定不相等
            //如果兩個字符串長度相等的話,緊接着比較字符串的內容
            char v1[] = value;//[好,像,睡,覺]
            char v2[] = anotherString.value;//[好,像,睡,覺]
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    //如果這兩個字符串字符數組通過循環挨個比較。如果有一個字符不相等,就返回的是false
                    return false;
                i++;
            }
            //內容一致的話也是一個true
            return true;
        }
    }
    return false;
}

int hashCode();

hashCode方法獲取的是對象的hash值,也被散列碼,實際上是一個十進制int類型的數值

這個值就是對象的內存地址(十六進制的)轉為10進制的數據 官方手冊:

如果根據equals(Object)方法兩個對象相等,則在兩個對象中的每個對象上調用hashCode方法必須產生相同的整數結果。

面試題:

為什么重寫了equals方法的時候,必須重寫hashCode方法?

兩個對象使用equals方法進行比較的時候,如果對象一樣的話,hash碼可能不一樣

咱們要保證你的hash碼也必須是一樣的。

hash碼一樣對象肯定一樣的

4.Set集合

Set父接口是Collection

Set和List是親兄弟

List集合的特征是:有序的,可以重復的

Set特征是:無序的,不可重復的

Set接口下面有兩個實現類:

HashSet TreeSet

Set接口中沒有獨特的方法,就是Collection接口下面的方法

Set在開發中用的也比較少




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM