天天看點

Java學習筆記-全棧-Java基礎-08-容器中的重點

泛型

泛型使周遊時不需要強制轉換,幫助建立類型安全的集合。           

複制

通過remove了解“引用”

Collections類都有個remove方法:将對象從容器中移除。

但并非删除該對象,移除之後,該對象依舊還在。因為容器存放的時該對象的引用位址,移除的隻是位址,實際上對象本身還在記憶體中。

“除了基本類型,都是引用資料類型,引用資料類型隻是引用位址,而非該對象本身”

總結

Java學習筆記-全棧-Java基礎-08-容器中的重點
1.Collection接口:
  • 1.List的元素有順序,可重複,包括:
    • a)ArrayList:查詢效率高,增删效率低,線程不安全
    • b)LinkedList:查詢效率低,增删效率高,線程不安全
    • c)Vector:ArrayList的線程安全版,效率低
  • 2.Set的元素無順序,不可重複,包括:
    • a)HashSet:查詢、增删效率高
    • b)TreeSet:用TreeMap的Key實作的,内部需要對存儲的元素進行排序,是以,對應的類需要實作Comparable接口(編寫比較邏輯),這樣才能根據compareTo()方法比較對象之間的大小,才能進行内部排序。
2. Map
  • Map,key-value,key不可重複,value可以,包括
    • a)HashMap:最常用,效率最高
    • b)TreeMap:自動按照key升序排列
3. 操作
  • 使用Iterator周遊容器
  • 類 java.util.Collections 提供了對Set、List、Map操作的方法(排序,填充,查找,打亂等)

重寫equals、hashCode方法(重點)

  • 如下情況,(可能)需要重寫equals/hashCode
    • a)要将自定義的對象放入HashSet中處理
    • b)要将自定義的對象作為HashMap的key
    • c)将自定義對象放入容器中後,可能會調用remove、contains時(實際上使用集合裝對象的時候,約定需要重寫這兩個方法)

原因:

上述三個情況都隐式的涉及到了“對象比較”

  • a\b中:HashSet\HashMap的key都是惟一的(是以内部實作就應該存在比較),若放入自定義對象,可能會出現“應該相同的對象但不相同”的情況,比如自定義對象id=1的有兩個(實際業務我們需要他們相同),但他們在HashSet和HashMap的key中并不相同,是以需要重寫equals(id相等就判斷相等)和HashCode(将hash的對象都設定為ID即可保證他們HashCode一緻)。
  • c中:remove和contains都涉及到對象的識别(即比較),是以需要重寫equals才能識别。
  • 預設的equals比較的是對象記憶體位址,hashCode求的是對象記憶體位址轉換成的數,實際也是記憶體位址。