天天看點

【小衆但強大】你了解Java集合架構中的Small Collection嗎?

作者:你的老師父

在Java中,集合是一種非常重要的資料結構。其中,ArrayList、LinkedList、HashSet等集合類被廣泛應用于各個領域。而在實際開發中,我們會經常面對需要從大集合中擷取一個子集或者對這個子集進行一些操作的需求。為了避免對原集合造成幹擾,同時提高程式的效率,Java集合架構提供了許多視圖和小集合的方法,本文将詳細介紹這些方法。

1.視圖(View)

視圖是Java集合架構中的一種特殊集合,它具有與原集合相同的引用,并共享原集合的内容。是以,視圖不需要獨立地存儲元素,進而節省記憶體空間。在Java集合架構中,視圖通常用于提取大型集合的子集,或者對表格資料進行過濾和排序。

SubList(子清單)

SubList是List接口中的一種視圖,它可以從現有的List中擷取一個子清單,并支援以原始清單的方式操作該子清單。下面是使用SubList方法建立子清單的代碼示例:

import java.util.ArrayList;
import java.util.List;

public class SubListExample {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>(10);
        for (int i = 1; i <= 10; i++) {
            list.add(i);
        }
        
        List<Integer> subList = list.subList(2, 7);
        
        System.out.println("Original list: " + list);
        System.out.println("Sublist: " + subList);
        
        subList.set(1, 99);
        subList.remove(Integer.valueOf(5));
        
        System.out.println("Original list after modifying sublist: " + list);
    }
}
           

在上述代碼中,我們首先建立了一個包含1-10數字的ArrayList對象。然後,我們使用List接口中的subList()方法從現有的清單中擷取一個子清單,并将其存儲在一個新的List對象中。接下來,我們列印原始清單和子清單,并對子清單進行一些修改操作。最後,我們再次列印原始清單,以驗證是否正确地修改了子清單。

運作上述代碼,輸出結果如下:

Original list: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Sublist: [3, 4, 5, 6, 7]
Original list after modifying sublist: [1, 2, 3, 99, 6, 7, 8, 9, 10]
           

從輸出結果可以看出,我們成功地從原始清單中擷取了一個子清單,并且能夠通過子清單對原始清單進行修改。

需要注意的是,由于SubList隻是原始清單的一個視圖,是以在對原始清單進行修改時也會影響子清單,反之亦然。是以,需要謹慎使用SubList方法。

SubMap(子映射)

SubMap是Java中的一種特殊映射,它可以從現有的Map中擷取一個子映射,并支援以原始映射的方式操作該子映射。下面是使用SubMap方法建立子映射的代碼示例:

import java.util.HashMap;
import java.util.Map;

public class SubMapExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 1);
        map.put("banana", 2);
        map.put("cherry", 3);
        map.put("durian", 4);
        
        Map<String, Integer> subMap = map.subMap("banana", "durian");
        
        System.out.println("Original map: " + map);
        System.out.println("Submap: " + subMap);
        
        subMap.remove("cherry");
        
        System.out.println("Original map after modifying submap: " + map);
    }
}           

在上述代碼中,我們首先建立了一個包含水果和對應編号的HashMap對象。然後,我們使用Map接口中的subMap()方法從現有的映射中擷取一個子映射,并将其存儲在一個新的Map對象中。接下來,我們列印原始映射和子映射,并對子映射進行了一些修改操作。最後,我們再次列印原始映射,以驗證是否正确地修改了子映射。

運作上述代碼,輸出結果如下:

Original map: {durian=4, apple=1, banana=2, cherry=3}
Submap: {banana=2, cherry=3}
Original map after modifying submap: {durian=4, apple=1, banana=2}
           

從輸出結果可以看出,我們成功地從原始映射中擷取了一個子映射,并且能夠通過子映射對原始映射進行修改。

Unmodifiable(不可修改的視圖)

除了SubList和SubMap之外,Java集合架構還提供了一種特殊的視圖——Unmodifiable。該視圖是不可修改的,即任何對其進行修改的操作都會抛出UnsupportedOperationException異常。它通常用于保護敏感資料或在多個線程之間共享資料。

下面是使用Collections.unmodifiableList()方法建立不可修改的List視圖的代碼示例:

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

public class UnmodifiableExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        list.add("cherry");
        
        List<String> unmodifiableList = Collections.unmodifiableList(list);
        
        System.out.println("Original list: " + list);
        System.out.println("Unmodifiable list: " + unmodifiableList);
        
        try {
            unmodifiableList.remove(0);
        } catch (UnsupportedOperationException e) {
            System.out.println("Caught exception: " + e);
        }
    }
}
           

在上述代碼中,我們首先建立了一個包含水果名稱的ArrayList對象。然後,我們使用Collections.unmodifiableList()方法建立了一個不可修改的List視圖,并将其存儲在一個新的List對象中。接下來,我們列印原始清單和不可修改的清單,并嘗試對不可修改的清單進行修改操作。由于該清單是不可修改的,是以該操作會抛出UnsupportedOperationException異常。

運作上述代碼,輸出結果如下:

Original list: [apple, banana, cherry]
Unmodifiable list: [apple, banana, cherry]
Caught exception: java.lang.UnsupportedOperationException
           

從輸出結果可以看出,我們成功地建立了一個不可修改的List視圖,并且任何對其進行修改的操作都會抛出異常。

2. 小集合(Small Collection)

小集合是Java集合架構中的另一種特殊集合,它根據元素個數的大小而被稱為“小集合”。相比于大型集合,小集合通常具有更高的效率和更低的記憶體占用,因為它們不需要額外的空間來存儲元素。在Java集合架構中,常見的小集合包括SingletonSet、SingletonList和EmptySet等。

SingletonSet(單例集合)

SingletonSet是Java中的一種特殊集合,它隻包含一個元素,并且該元素不能被更改或删除。下面是使用Collections.singleton()方法建立SingletonSet的代碼示例:

import java.util.Collections;
import java.util.Set;

public class SingletonSetExample {
    public static void main(String[] args) {
        Set<String> singletonSet = Collections.singleton("apple");
        
        System.out.println("Singleton set: " + singletonSet);
    }
}
           

在上述代碼中,我們使用Collections.singleton()方法建立了一個包含“apple”元素的SingletonSet對象,并将其存儲在一個新的Set對象中。接下來,我們列印SingletonSet對象。

運作上述代碼,輸出結果如下:

Singleton set: [apple]
           

從輸出結果可以看出,我們成功地建立了一個包含一個元素的SingletonSet對象。

需要注意的是,由于SingletonSet隻能包含一個元素,是以任何嘗試向其中添加或删除元素的操作都會抛出UnsupportedOperationException異常。

SingletonList(單例清單)

SingletonList是Java中的一種特殊清單,它隻包含一個元素,并且該元素不能被更改或删除。下面是使用Collections.singletonList()方法建立SingletonList的代碼示例:

import java.util.Collections;
import java.util.List;

public class SingletonListExample {
    public static void main(String[] args) {
        List<String> singletonList = Collections.singletonList("apple");
        
        System.out.println("Singleton list: " + singletonList);
    }
}
           

在上述代碼中,我們使用Collections.singletonList()方法建立了一個包含“apple”元素的SingletonList對象,并将其存儲在一個新的List對象中。接下來,我們列印SingletonList對象。

運作上述代碼,輸出結果如下:

Singleton list: [apple]
           

從輸出結果可以看出,我們成功地建立了一個包含一個元素的SingletonList對象。

與SingletonSet類似,由于SingletonList隻能包含一個元素,是以任何嘗試向其中添加或删除元素的操作都會抛出UnsupportedOperationException異常。

EmptySet(空集合)

EmptySet是Java中的一種特殊集合,它不包含任何元素。下面是使用Collections.emptySet()方法建立EmptySet的代碼示例:

import java.util.Collections;
import java.util.Set;

public class EmptySetExample {
    public static void main(String[] args) {
        Set<String> emptySet = Collections.emptySet();
        
        System.out.println("Empty set: " + emptySet);
    }
}
           

在上述代碼中,我們使用Collections.emptySet()方法建立了一個空集合,并将其存儲在一個新的Set對象中。接下來,我們列印EmptySet對象。

運作上述代碼,輸出結果如下:

Empty set: []
           

從輸出結果可以看出,我們成功地建立了一個空集合。

需要注意的是,由于EmptySet不包含任何元素,是以任何嘗試向其中添加或删除元素的操作都會抛出UnsupportedOperationException異常。

3.總結

Java集合架構中的視圖和小集合提供了一種靈活而高效的方式來處理大型資料集合。SubList和SubMap方法可以幫助我們從現有集合中擷取子集或映射,并以原始集合的方式操作它們。Unmodifiable視圖提供了一種保護敏感資料或在多個線程之間共享資料的方式。SingletonSet和SingletonList提供了一種隻包含一個元素的集合或清單,并具有高效和低記憶體占用的優點。EmptySet提供了一種不包含任何元素的集合。