JavaSE集合基礎總覽

Java集合

Java集合,也稱之爲容器。基本上你寫所有的Java程序,都必須要用到一個包。該API基本都位於java.util工具類包中,是JavaSE中的重中之重。
簡單可以總結爲“1136”,分別是一個圖,一個類,三個知識點,六個接口。下面逐個剖析。

1.一個圖


備註:

  • 實現Collection接口的,基本都是按個的方式存入的集合類。
  • 實現Map接口的,基本都是按照鍵值對的方式存入的集合類。
  • 這兩個接口都定義了該類型集合的基本方法。
  • Collectionz中,兩個對象互相equalsw爲true,即爲重複。(或者說,是hashCode中相等)

(1)六個接口:Collection接口

 1 import java.util.*;
 2 
 3 public class CollectionTest {
 4     public static void main(String[] args) {
 5         // 父類引用,指向子類對象
 6         // 爲求方便更換其他子類的實現
 7         Collection c = new ArrayList<>();
 8         // 可以放入不同類型的對象
 9         c.add("hello");
10         c.add("f1");
11         c.add(new Integer(100));
12         System.out.println(c.size());   // 3
13         System.out.println(c);  // [hello,f1,100]
14     }
15 }

 

(2)六個接口:Iterator接口

大部分容器類,都必須實現Collection接口,而實現該接口必須實現其的iterator方法。
iterator方法的作用就是,所有實現Collection接口方法的容器子類,不管其具體的實現、使用的數據結構,其必須提供一個iterator方法用以進行統一的遍歷數據方式。
(舉個栗子,我不管你饅頭店具體是怎麼去做饅頭,存儲饅頭的,反正你做饅頭必須要實現賣饅頭的方法,我去到按照金錢交易的方式一定能得到饅頭)
所以:

  • 所有實現了Collection接口的容器類都有一個iterator方法,用以返回一個實現了Iterator接口的對象。
  • Iterator對象稱爲迭代器,用以方便的實現對容器內元素的遍歷操作
  • Iterator對象的的remove方法是在迭代中刪除元素的唯一的安全方法
  • 也可以使用增強的for循環遍歷容器數據,但是因爲不方便操作,除了簡單的遍歷讀取外,不建議使用。 示例:
     1 import java.util.*;
     2 
     3 public class IteratorTest {
     4     public static void main(String[] args) {
     5         Collection c = new HashSet<>();
     6         c.add(new Name("f1", "l1"));
     7         c.add(new Name("f2", "l2"));
     8         c.add(new Name("f3", "l3"));
     9         Iterator i = c.iterator();
    10         while (i.hasNext()) {
    11             //next()的返回值爲Object,需要轉換爲相應類型
    12             Name = n = (Name) i.next();
    13             System.out.println(n.getName());
    14             // 因爲set沒有順序,所以返回[f2,f1,f3,l1,l2,l3]
    15         }
    16     }
    17 }

     

(3)六個接口:Set接口

  • Set接口是Collection的子接口,Set接口沒有提供額外的方法,但是實現Set接口的容器類中的元素是沒有順序的,且不可重複
  • Set容器可以與數學中“集合”的概率相對應。
  • Java API中所提供的Set容器類有HashSet、TreeSet等。
    示例:
     1 import java.util.*;
     2 
     3 /**
     4  * 求交集 去重
     5  */
     6 public class SetTest {
     7     public static void main(String[] args) {
     8         Set s1 = new HashSet<>();
     9         Set s2 = new HashSet<>();
    10         s1.add("a");s1.add("b");s1.add("c");
    11         s2.add("d");s2.add("a");s2.add("b");
    12         //Set和List容器類都具有Constructor(Constructor c)
    13         //構造方法用以初始化容器類
    14         Set sn = new HashSet<>(s1);
    15         sn.retainAll(s2);
    16         Set su = new HashSet<>(s1);
    17         su.addAll(s2);
    18         System.out.println(sn);// [a,b]
    19         System.out.println(su);// [d,a,c,b]
    20     }
    21 }

     

(4)六個接口:List接口

  • List接口是Collection的子接口,實現List接口的容器類中的元素是有序的,且可重複的
  • List容器中的元素都對應一個整數型的序號記載其在容器的位置,可以根據序號存取容器中的元素。
  • Java API所提供的List容器類有ArrayList、LinkeList等。

一個類:Collections類

  • 該類位於java.util.Collections,提供了一些靜態方法實現了基於List容器的一些常用算法。
  • sort (對List容器內的元素進行排序)
  • shuffle (對List容器內的對象進行隨機排序)
  • reverse (對List容器內的對象進行逆序排序)
  • fill (用一個特定的對象重寫整個List容器)
  • copy (將src List容器內容拷貝到dest List容器)
  • binarySearch (對於順序的List容器,採用二分法查找的方式查找特定對象)
    其餘的方法可以具體去看API文檔,再給個示例:
     1 import java.util.*;
     2 /**
     3  * 舉例部分Collections的算法排序,具體看API
     4  */
     5 public class Collections {
     6     public static void main(String[] args) {
     7         List l1 = new LinkedList<>();
     8         for (int i = 0; i <= 9; i++) {
     9             l1.add("a" + i);
    10         }
    11         /**
    12          * 目前l1的值排序爲: [a0,a1,a2,a3,a4,a5,a6,a7,a8,a9]
    13          */
    14         Collections.reverse(l1);// 逆序排序
    15         System.out.println(l1);// [a9,a8,a7,a6,a5,a4,a3,a2,a1,a0]
    16         Collections.shuffle(l1);// 隨機排序
    17         System.out.println(l1);// [a1,a3,a8,a9,a4,a6,a5,a2,a0,a7]
    18         Collections.sort(l1);// 正序排序
    19         System.out.println(l1);// [a0,a1,a2,a3,a4,a5,a6,a7,a8,a9]
    20         System.out.println(Collections.binarySearch(l1, "a5"));// 6
    21     }
    22 }

     

(5)六個接口:Comparable接口

  • 問題:Collections類的方法算法根據什麼來確定容器中對象的“大小”順序?
  • 所有可以“排序”的類,都實現了java.lang.Comparable接口,Comparable接口只有一個方法,compareTo,該方法:
    • 返回0表示this == obj
    • 返回正數表示this > obj
    • 返回負數表示this < obj
  • 實現了Comparable接口的類通過重寫compareTo方法從而確定該類對象的排序的具體方式。

(6)六個接口:Map接口

  • 實現Map接口的類用來存儲鍵值對。
  • Map接口的實現類有HashMap和TreeMap等。Map類中存儲的鍵值對通過鍵來標識,所以鍵值 不能重複。

泛型

  • 起因:
    • JDK1.4以前類型不明確
      • 裝入集合的類型都被當作Object對待,從而失去了自己的實際類型。
      • 從集合中取出時往往需要轉型,效率低,容易發生錯誤。
  • 解決辦法:
    • 在定義集合的時候同時定義集合中對象的類型。
      • 可以在定義Collection的時候指定。
      • 也可以在循環時用Iteration指定。
  • 好處:
    • 增強程序的可讀性和穩定性。

總結

  • 一個圖
  • 一個類
    • Collections
  • 三個知識點
    • For - 增強的for循環
    • Generic - 泛型
    • Auto-boxing/unboxing - 自動打包、解包
  • 六個接口(如上)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章