Java基礎--常用API--集合類相關API


一、泛型

  1、泛型的本質是將類型參數化,即將數據類型作為參數。
 

  2、泛型可以在編譯期進行檢查,其所有的強制轉換是隱式且自動的,提高了代碼的安全性。
  

  3、泛型可以用在類(泛型類)、接口(泛型接口)、方法(泛型方法)的創建。
   

  4、泛型的類型參數只能為引用類型,不能為基本類型。

 

二、常用集合類

1、體系分類:

  (1)Collection體系: Set、List、Queue。
    Set:元素無序且不可重復。HashSet,TreeSet。
    List:元素有序且可重復。LinkedList,ArrayList。
    Queue:隊列,先進先出。Deque。

  (2)Map體系:HashMap、TreeMap。

 

2、分類如下

 

3、集合與數組的區別

 

 

三、Collection集合

1、相關方法:

 

2、迭代器

  (1)使用Iterator接口,不能直接new,使用集合的方法去調用。即Iterator it = c.iterator();
 

  (2) java.util.Iterator; 其使用流程為問,取,刪(不必須)。
  

  (3)方法:
    boolean hasNext();問操作,查詢當前集合是否還有元素。
    Object next();取操作,取出集合元素。
    Iterator remove() ;刪操作,刪除集合元素。
   

  (4)使用迭代器過程中,不能使用集合的相關方法去改變集合中的元素,只能使用迭代器的方法。比如現有集合c,迭代器t,則只能使用 t.remove()刪除剛next出來的元素,不能使用 c.remove(),使用的話會拋出異常。

for (Object t :  c ) { //foreach循環
}
//等價於
Iterator it = c.iterator();
while(it.hasNext){
Object obj = it.next();
}

 

四、Set、List集合

1、Set與List集合的區別:

 

2、List:

  (1)ArrayList:底層數據結構是數組,查詢快,增刪慢,線程不安全,效率高,可以存儲重復元素

  (2)LinkedList 底層數據結構是鏈表,查詢慢,增刪快,線程不安全,效率高,可以存儲重復元素

  (3)Vector:底層數據結構是數組,查詢快,增刪慢,線程安全,效率低,可以存儲重復元素

 

3、Set:

  (1)HashSet:底層數據結構采用哈希表實現,元素無序且唯一,線程不安全,效率高,可以存儲null元素(key只能有一個為null),元素的唯一性是靠所存儲元素類型是否重寫hashCode()和equals()方法來保證的,如果沒有重寫這兩個方法,則無法保證元素的唯一性。equals相同的兩個對象,hashcode也要相同。但hashcode相同的兩個對象,equals卻不一定相同。

  (2)LinkedHashSet:底層數據結構采用鏈表和哈希表共同實現,鏈表保證了元素的順序與存儲順序一致,哈希表保證了元素的唯一性。線程不安全,效率高。

  (3)TreeSet:底層數據結構采用二叉樹來實現,元素唯一且已經排好序;唯一性同樣需要重寫hashCode和equals()方法,二叉樹結構保證了元素的有序性。根據構造方法不同,分為自然排序(無參構造,使元素自身具備比較性)和比較器排序(有參構造,使集合自身具備比較性),自然排序要求元素必須實現Compareable接口,並重寫里面的compareTo()方法,元素通過比較返回的int值來判斷排序序列,返回0說明兩個對象相同,不需要存儲;比較器排序需要在TreeSet初始化是時候傳入一個實現Comparator接口的比較器對象,或者采用匿名內部類的方式new一個Comparator對象,重寫里面的compare()方法;

 

4、數組轉集合(List):

  (1)數組只能轉到List集合,不能為Set集合,因為數組可能有重復的值,但Set為不可重復集合。

  (2)List Arrays.asList(T array)方法來將數組轉為集合。但此操作不能對集合進行任何添加刪除操作,即此集合只可讀。否則拋出異常java.lang.UnsupportedOperationException。若想操作集合,則將此集合整體加入到另一個集合中,使用構造方法加入,或者調用addAll()方法。


5、總結:

 

五、隊列與棧

1、隊列:

  (1)先進先出原則(FirstInputFirstOutput)。 

  (2)java.util.Queue.。JDK提供Queue接口,LinkedList是其實現類,這是由於Queue頻繁增刪。offer添加,poll取出。

  (3)方法:

    boolean offer(T t); 入隊方法,添加到隊尾。
    T poll();出隊方法,用於獲取隊首元素。
    T peek();不出隊方法,用於獲取隊首元素。
    遍歷方法是一次性的,每次都是出隊操作。

Queue<String> queue = new LinkedList<String>();
queue.offer("1");
queue.offer("2");
System.out.println(queue); //[1,2]
String str = queue.poll();
System.out.println(queue);//[2]
str = queue.peek();
System.out.println(queue);//[2]

 

2、雙端隊列與棧:

  (1)Deque為Queue的子接口。為雙端隊列,即兩端均可以進行offer與poll操作。

  (2)若將其限制為只准一端進行offer與poll操作,那么即為棧(Stack)的數據結構。其中入棧push,出棧pop。棧遵循先進后出原則(FirstInputLastOutput),用於記錄一組可回溯的操作,比如撤銷與前進操作。

  (3)方法:
    void push(T t); 入棧操作,壓入一個元素。
    T pop() ;出棧操作,取出棧頂元素。
    T peek(); 取出棧頂元素,但不出棧。
    遍歷也是一次性的。

Deque<String> stack = new LinkedList<String>();
stack.push("1");
stack.push("2");
System.out.println(stack);//[2,1],后進先出
String str = stack.peek();
System.out.println(stack);//[2,1]
str = stack.pop();
System.out.println(stack);//[1]

 

六、Map

  1、 Map 沒有繼承 Collection 接口。

    Map用於保存具有映射關系的數據,Map里保存着兩組數據:key和value,它們都可以使任何引用類型的數據,但key不能重復。所以通過指定的key就可以取出對應的value。 Map是接口,通常使用其實現類HashMap來創建它。也可以通過LinkedHashMap來創建它,可以保證存入與取出的順序一致。

  2、Map 接口提供 3 種集合的視圖.

    Map 的內容可以被當作一組 key 集合(Set keySet()),一組 value 集合(Collection values),或者一組 key-value 映射(Set entrySet())。

    想要獲取map中的元素,由於map沒有迭代器,但Collection有迭代器,所以需將map集合轉換為set集合,然后就可以使用迭代器了。之所以轉為set集合,是因為map集合具備着鍵的唯一性。set集合底層用的就是map方法。

方法:
1、Set keySet(); //將map中的鍵存入Set集合,迭代后只能通過get(key)方法取值。(無序存放)

2、Set<Map.Entry<K, V>> entrySet();  //取的是鍵與值的映射關系,返回的是Entry接口,

迭代后可以用e.getKey()取鍵,用e.getValue()取value。返回一個entry接口。

注:entrySet(推薦使用)速度比keySet快。

實例(keySet):
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Test{
    public static void main(String[] args){
    //實例化一個map集合
        Map<String, String> map = new HashMap<String, String>();
       //添加數據 
        map.put("1", "zhangsan");
        map.put("2", "lisi");
        map.put("3", "wangermazi");
    //使用keySet去將map轉為set
        Set<String> keySet = map.keySet();
    //使用迭代器
        Iterator<String> it = keySet.iterator();
        while (it.hasNext()) {
            String key = it.next();
      //通過get(key)取value值
            String value = map.get(key);
            System.out.println("key:" + key + "->value: " + value);
        }
    }
/*
輸出
key:1->value: zhangsan
key:2->value: lisi
key:3->value: wangermazi
*/
}

實例(entrySet):
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HelloWorld{
    public static void main(String[] args){
        //實例化一個map集合
        Map<String, String> map = new HashMap<String, String>();
        //添加數據
        map.put("1", "zhangsan");
        map.put("2", "lisi");
        map.put("3", "wangermazi");
        //使用entrySet去將map轉為set
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        //使用迭代器
        Iterator<Map.Entry<String, String>> it = entrySet.iterator();
        while (it.hasNext()) {
//獲取Map.Entry關系對象me。
            Map.Entry<String, String> me = (Map.Entry) it.next();
//通過關系對象去獲取key與value
            System.out.println(me.getKey()+ "-> " + me.getValue());
        }
    }
/*
輸出
1-> zhangsan
2-> lisi
3-> wangermazi
*/
}

 

  3、HashTable與HashMap的區別:

    (1)HashMap: 基於哈希表實現。使用HashMap要求添加的鍵類明確定義了hashCode()和equals()[可以重寫hashCode()和equals()],為了優化HashMap空間的使用,您可以調優初始容量和負載因子。由鏈表與數組組合實現。首先根據hashcode計算一個哈希值,再根據hash算法計算一個值,此值代表的是數據在數組中的存儲位置。當定位到同一個數組位置上時,會通過鏈表的形式將值保存。即使用數組保存數據的位置,使用鏈表保存每個數組位置的值。JDK8后,當鏈表的存儲的數據個數大於8時,將自動轉為紅黑樹保存。

 

  4、TreeMap:

    非線程安全基於紅黑樹實現。TreeMap沒有調優選項,因為該樹總處於平衡狀態。適用於按自然順序或自定義順序遍歷鍵(key)。

 

七、Collections工具類

1、Collections是java.util下的一個類,是針對集合類的一個工具類,提供了一系列的靜態方法,實現對集合的查找、排序、替換、線程安全化等操作。

 

2、Collection是java.util下的一個接口,是各種集合結構的父接口,實現它的接口主要為Set與List,提供了一些關於集合的操作,比如插入、刪除、判斷元素是否存在、以及遍歷。

常用方法:
    Collections.sort(list);    //list集合進行元素的自然排序
    Collections.sort(list, new ComparatorBylen());  //按指定比較器排序 
    Collections.max(list);      //返回list字典順序最大的元素
    int index = Collections.binarySearch(coil,"c");  //二分查找,返回下標(角標,從0開始)
    Collections.reverse(list);  //反轉排序
    Collections.shuffle(list);  //隨機將list中的元素進行位置的置換

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

//自己構造一個比較器,重寫compare方法
class ComparatorBylen implements Comparator<String> {
        public int compare(String s1, String s2) {
            int temp = s1.length() - s2.length();
            return temp == 0? s1.compareTo(s2) : temp;
        }
}

public class Test{
    public static void main(String[] args){
//實例化一個list集合
        List<String> coil = new ArrayList();
       //添加數據 
coil.add("c");
        coil.add("bw");
        coil.add("a");
        System.out.println(coil);     

//對元素進行自然排序
        Collections.sort(coil);
        System.out.println(coil);

//調用自己建的比較器進行排序
        Collections.sort(coil, new ComparatorBylen());
        System.out.println(coil);

//返回list中字典順序最大的元素
        System.out.println(Collections.max(coil));

//二分查找,返回下標(角標,從0開始)
        System.out.println(Collections.binarySearch(coil,"c"));

//逆向輸出
        Collections.reverse(coil);
        System.out.println(coil);

//隨機對list中元素進行位置的互換
        Collections.shuffle(coil);
        System.out.println(coil);
    }
/*
輸出
[c, bw, a]
[a, bw, c]
[a, c, bw]
c
1
[bw, c, a]
[c, a, bw]
*/
}

 

八、總結

1、按線程是否安全分類:

  (1)LinkedList、ArrayList、HashSet是非線程安全的,Vector是線程安全的;

  (2)HashMap是非線程安全的,HashTable是線程安全的;

  (3)StringBuilder是非線程安全的,StringBuffer是線程安全的。

2、按數據結構分類:

  (1)ArrayXxx:底層數據結構是數組,查詢快,增刪慢

  (2)LinkedXxx:底層數據結構是鏈表,查詢慢,增刪快

  (3)HashXxx:底層數據結構是哈希表。依賴兩個方法:hashCode()和equals()

  (4)TreeXxx:底層數據結構是二叉樹。兩種方式排序:自然排序和比較器排序

 

 

參考:

https://blog.csdn.net/feiyanaffection/article/details/81394745


免責聲明!

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



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