Java同步包装器

在这里插入图片描述

通过 Collections.synchronizedList() 方法将一个普通的 ArrayList 包装成了线程安全的 List:

import java.util.*;

public class SynchronizedWrapperExample {
    public static void main(String[] args) {
        // 创建一个非线程安全的 ArrayList
        List<String> list = new ArrayList<>();

        // 使用同步包装器将其包装成线程安全的 List
        List<String> synchronizedList = Collections.synchronizedList(list);

        // 线程安全的添加操作
        synchronizedList.add("Item1");
        synchronizedList.add("Item2");

        // 线程安全的迭代操作
        synchronized (synchronizedList) {
            Iterator<String> iterator = synchronizedList.iterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }
        }
    }
}

### ### Java 视图与包装器的作用及使用方法 在 Java 中,视图和包装器是两个重要的概念,用于对数据进行组织和操作。视图提供了一种逻辑上的分组和展示方式,而包装器则用于封装和转换数据[^1]。 #### 视图(View) 视图是对已有集合或映射的逻辑抽象,它不存储实际的数据,而是通过某种方式访问底层结构中的数据。例如,`Map` 接口的 `keySet()` 方法返回一个实现 `Set` 接口的对象,这个对象的方法对原映射进行操作。这种集合称为视图。由于视图本身并不保存独立的数据副本,因此对视图所做的修改会反映到底层的原始数据结构中,反之亦然[^3]。 一个典型的例子是 `Arrays.asList()` 方法,该方法返回一个包装了普通数组的 `List` 包装器。需要注意的是,这个返回的对象不是一个真正的 `ArrayList` 实例,而是一个视图对象,带有访问底层数组的 `get` 和 `set` 方法。这意味着任何试图改变数组大小的操作(如调用 `add` 或 `remove`)都会抛出 `UnsupportedOperationException` 异常[^4]。 ```java String[] str = new String[10]; List<String> list = Arrays.asList(str); // 返回一个视图对象 list.set(2, "aaa"); // 合法操作 System.out.println(list.get(2)); // 输出: aaa // list.add("new element"); // 会抛出 UnsupportedOperationException ``` #### 包装器(Wrapper) 包装器用于将基本类型转换为对象或者对现有对象进行额外的功能增强。Java 提供了一系列的包装类,比如 `Integer`、`Double` 等等,它们可以用来创建包含基本类型的对象实例。此外,某些集合工具类也提供了轻量级的包装器来扩展集合的行为。 以 `Collections.nCopies(int n, T o)` 为例,该方法生成一个不可变的列表,其中每个元素都是给定对象的一个引用。实际上,在内部只进行了单次赋值操作,所有位置都指向同一个对象实例。这种方式节省了内存空间,并且适用于需要大量相同元素的情况[^4]。 ```java List<String> set = Collections.nCopies(100, "default"); System.out.println(set.get(0) == set.get(10)); // 输出: true ``` #### 使用场景与注意事项 - **视图**通常用于简化对复杂数据结构的操作,同时避免不必要的复制开销。 - **包装器**广泛应用于泛型编程中,因为 Java 泛型要求使用对象而非原始类型。 - 当使用像 `Arrays.asList()` 这样的视图方法时,应意识到它不会支持那些会导致底层固定大小数组发生变化的操作。 - 对于线程安全的需求,需确保外部同步机制到位,尤其是当多个线程可能并发访问视图或包装器时。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值