1. 程式人生 > 實用技巧 >springboot使用CommonsMultipartResolver上傳報錯java.lang.ClassCastException

springboot使用CommonsMultipartResolver上傳報錯java.lang.ClassCastException

(一)List 和 Set 區別

  1. List, Set 都是繼承自 Collection 介面
  2. List 特點:元素有放入順序,元素可重複。Set 特點:元素無放入順序,元素不可重複(注意:元素雖然無放入順序,但是元素在 set 中的位置是有該元素的 HashCode 決定的,其位置其實是固定的)
  3. List 介面有三個實現類:LinkedList,ArrayList,Vector。Set 介面有兩個實現類:HashSet(底層由 HashMap 實現),LinkedHashSet

(二)List 和 Map 區別

  1. List 特點:元素有放入順序,元素可重複;
  2. Map 特點:元素按鍵值對儲存,無放入順序 ;
  3. List 介面有三個實現類:LinkedList,ArrayList,Vector;
  4. LinkedList:底層基於連結串列實現,連結串列記憶體是散亂的,每一個元素儲存本身記憶體地址的同時還儲存下一個元素的地址。連結串列增刪快,查詢慢;
  5. Map 介面有三個實現類:HashMap,HashTable,LinkedHashMap
  6. Map 相當於和 Collection 一個級別的;Map 集合儲存鍵值對,且要求保持鍵的唯一性;

(三)ArrayList 與 LinkedList 區別

  1. 因為 Array 是基於索引(index)的資料結構,它使用索引在陣列中搜索和讀取資料是很快的。Array 獲取資料的時間複雜度是O(1)
    ,但是要刪除資料卻是開銷很大的,因為這需要重排陣列中的所有資料。
  2. 相對於 ArrayList,LinkedList 插入是更快的。因為 LinkedList 不像 ArrayList 一樣,不需要改變陣列的大小,也不需要在陣列裝滿的時候要將所有的資料重新裝入一個新的陣列,這是 ArrayList 最壞的一種情況,時間複雜度是O(n),而 LinkedList 中插入或刪除的時間複雜度僅為O(1)。ArrayList 在插入資料時還需要更新索引(除了插入陣列的尾部)。
  3. 類似於插入資料,刪除資料時,LinkedList 也優於 ArrayList。
  4. LinkedList 需要更多的記憶體,因為 ArrayList 的每個索引的位置是實際的資料,而 LinkedList 中的每個節點中儲存的是實際的資料和前後節點的位置。
  5. 你的應用不會隨機訪問資料。因為如果你需要 LinkedList 中的第 n 個元素的時候,你需要從第一個元素順序數到第 n 個數據,然後讀取資料。
  6. 你的應用更多的插入和刪除元素,更少的讀取資料。因為插入和刪除元素不涉及重排資料,所以它要比 ArrayList 要快。

(四)ArrayList 與 Vector 區別

  1. 同步性:Vector 是執行緒安全的,也就是說是同步的 ,而 ArrayList 是執行緒不安全的,不是同步的。
  2. 資料增長:當需要增長時,Vector 預設增長為原來一倍 ,而 ArrayList 卻是原來的 50% ,這樣 ArrayList 就有利於節約記憶體空間。
  3. 說明:如果涉及到堆疊,佇列等操作,應該考慮用 Vector,如果需要快速隨機訪問元素,應該使用 ArrayList

(五)HashMap 和 HashTable 的區別

  1. HashMap 幾乎可以等價於 HashTable,除了 HashMap 是非 synchronized 的,並可以接受 null(HashMap 可以接受為 null 的鍵值 (key) 和值 (value),而 HashTable 則不行)。
  2. HashMap 是非 synchronized,而 HashTable 是 synchronized,這意味著 HashTable 是執行緒安全的,多個執行緒可以共享一個 HashTable;而如果沒有正確的同步的話,多個執行緒是不能共享 HashMap 的。Java 5 提供了 ConcurrentHashMap,它是 HashTable 的替代,比  HashTable 的擴充套件性更好。
  3. 另一個區別是 HashMap 的迭代器 (Iterator) 是 fail-fast 迭代器,而 HashTable 的 enumerator 迭代器不是 fail-fast 的。所以當有其它執行緒改變了 HashMap 的結構(增加或者移除元素),將會丟擲 ConcurrentModificationException,但迭代器本身的 remove() 方法移除元素則不會丟擲 ConcurrentModificationException 異常。但這並不是一個一定發生的行為,要看 JVM。這條同樣也是 Enumeration 和 Iterator 的區別。
  4. 由於 HashTable 是執行緒安全的也是 synchronized,所以在單執行緒環境下它比 HashMap 要慢。如果你不需要同步,只需要單一執行緒,那麼使用 HashMap 效能要好過 HashTable。
  5. HashMap 不能保證隨著時間的推移 Map 中的元素次序是不變的。

(六)HashSet 和 HashMap 區別

HashMapHashSet
HashMap 實現了 Map 介面 HashSet 實現了 Set 介面
HashMap 儲存鍵值對 HashSet 僅僅儲存物件
使用 put() 方法將元素放入 map 中 使用 add() 方法將元素放入 set 中
HashMap 中使用鍵物件來計算 hashcode 值 HashSet 使用成員物件來計算 hashcode 值,對於兩個物件來說 hashcode 可能相同,所以 equals() 方法用來判斷物件的相等性,如果兩個物件不同的話,那麼返回 false
HashMap 比較快,因為是使用唯一的鍵來獲取物件 HashSet 較 HashMap 來說比較慢

(七)HashMap 和 ConcurrentHashMap 的區別

  1. 放入 HashMap 的元素是 key-value 對。底層說白了就是雜湊結構。要將元素放入到 HashMap 中,那麼 key 的型別必須要實現 hashcode 方法,預設這個方法是根據物件的地址來計算的,接著還必須覆蓋物件的 equals() 方法。
  2. ConcurrentHashMap 對整個桶陣列進行了分段,而 HashMap 則沒有
  3. ConcurrentHashMap 在每一個分段上都用鎖進行保護,從而讓鎖的粒度更精細一些,併發效能更好,而 HashMap 沒有鎖機制,不是執行緒安全的

(八)HashMap 的工作原理

  HashMap 基於 hashing 原理,我們通過 put() 和 get() 方法儲存和獲取物件。當我們將鍵值對傳遞給 put() 方法時,它呼叫鍵物件的 hashCode() 方法來計算 hashcode,讓後找到 bucket 位置來儲存值物件。當獲取物件時,通過鍵物件的 equals() 方法找到正確的鍵值對,然後返回值物件。HashMap 使用連結串列來解決碰撞問題,當發生碰撞了,物件將會儲存在連結串列的下一個節點中。 HashMap 在每個連結串列節點中儲存鍵值對物件。

(九)ConcurrentHashMap 的工作原理

  ConcurrentHashMap 採用了非常精妙的"分段鎖"策略,ConcurrentHashMap 的主幹是個 Segment 陣列。Segment 繼承了 ReentrantLock,所以它就是一種可重入鎖(ReentrantLock)。在 ConcurrentHashMap,一個 Segment 就是一個子雜湊表,Segment 裡維護了一個 HashEntry 陣列,併發環境下,對於不同 Segment 的資料進行操作是不用考慮鎖競爭的。

轉自:有夢想的鹹魚