天天看点

【小众但强大】你了解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提供了一种不包含任何元素的集合。