3年经验,还不知道Collections.singletonList

Collections中的singletonList()和emptyList()方法在Java开发中经常被用于创建只包含一个元素或空的集合。singletonList()通过SingletonList内部类实现,避免了额外内存分配,而emptyList()则提供了直接返回不可变空列表的方式,减少了对象创建。这些静态工厂方法在提升代码效率和避免不必要的资源消耗方面起到了积极作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

Collections是java集合中的静态方法类,类中定义了集合中常用方法。这里来和大家一起看看里面常用的方法。

Collections.singletonList()

这个方法主要用于只有一个元素的优化,减少内存分配,无需分配额外的内存,可以从SingletonList内部类看得出来,由于只有一个element,因此可以做到内存分配最小化,相比之下ArrayList的DEFAULT_CAPACITY=10个。

    /**
     * Returns an immutable list containing only the specified object.
     * The returned list is serializable.
     *
     * @param  <T> the class of the objects in the list
     * @param o the sole object to be stored in the returned list.
     * @return an immutable list containing only the specified object.
     * @since 1.3
     */
    public static <T> List<T> singletonList(T o) {
        return new SingletonList<>(o);
    }

下面是SingletonList静态类的定义

    private static class SingletonList<E>
        extends AbstractList<E>
        implements RandomAccess, Serializable {

        private static final long serialVersionUID = 3093736618740652951L;

        private final E element;

        SingletonList(E obj)                {element = obj;}

        public Iterator<E> iterator() {
            return singletonIterator(element);
        }

        public int size()                   {return 1;}

        public boolean contains(Object obj) {return eq(obj, element);}

        public E get(int index) {
            if (index != 0)
              throw new IndexOutOfBoundsException("Index: "+index+", Size: 1");
            return element;
        }

        // Override default methods for Collection
        @Override
        public void forEach(Consumer<? super E> action) {
            action.accept(element);
        }
        @Override
        public boolean removeIf(Predicate<? super E> filter) {
            throw new UnsupportedOperationException();
        }
        @Override
        public void replaceAll(UnaryOperator<E> operator) {
            throw new UnsupportedOperationException();
        }
        @Override
        public void sort(Comparator<? super E> c) {
        }
        @Override
        public Spliterator<E> spliterator() {
            return singletonSpliterator(element);
        }
    }

上面的源码中可以看到,静态类中并没有重新add、delete、set等方法。所以通过Collections.singletonList初始化的List是不能执行上述方法的。

Collections.emptyList()

Collections.emptyList在日常开发中也比较常用,如果一个方法需要返回一个空List,并且后续不用再新增元素进去,我们完全可以直接返回Collections.emptyList()而不是new ArrayList;这样不用每次都去创建一个新对象。

    public static final <T> List<T> emptyList() {
        return (List<T>) EMPTY_LIST;
    }

EMPTY_LIST如下

    public static final List EMPTY_LIST = new EmptyList<>();

Collections中其他类似方法

public static <T> Set<T> singleton(T o);
 
public static <T> List<T> singletonList(T o);
 
public static <K,V> Map<K,V> singletonMap(K key, V value);
 
// 或者直接调用常量 EMPTY_LIST
public static final <T> List<T> emptyList();
 
//或者直接调用常量 EMPTY_MAP
public static final <K,V> Map<K,V> emptyMap();
 
//或者直接调用常量 EMPTY_SET
public static final <T> Set<T> emptySet()

总结

Collections中定义好方法,我们完全可以直接使用。Collections.emptyList()可能并不比new ArrayList节省多少空间。但是毕竟开发了几年了,写代码不能像刚开始写Hello world那时一样吧。

### TLS 版本配置与兼容性 #### TLS 版本的历史与发展 TLS 协议自推出以来经历了多个版本的发展。2008发布的 TLS 1.2 是一个重要里程碑,它引入了更强大的加密算法,如 AES 和 SHA-256[^2]。尽管握手过程较长,但在 TLS 1.3 发布之前,TLS 1.2 成为了最广泛使用的版本。 #### 应用中的 TLS 版本配置需求 对于某些应用程序来说,在同环境下可能需要支持同的 TLS 版本来满足特定的服务接口要求或者保持向后兼容性。例如,当应用需对接那些仅接受较高版本 TLS 的外部服务时,或是为了确保能在较老版本的操作系统上正常工作(比如 Android),开发者就必须显式地设置所要启用的 TLS 版本[^1]。 #### 使用 OkHttp 进行 TLS 版本修改 在基于 OkHttp 构建的应用程序里调整 TLS 设置可以通过创建并指定 `ConnectionSpec` 来实现。下面是一个简单的例子来展示如何强制使用 TLS 1.2: ```java import okhttp3.OkHttpClient; import okhttp3.ConnectionSpec; public class TlsConfigExample { public static OkHttpClient createClient() { ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) .tlsVersions(ConnectionSpec.MODERN_TLS.tlsVersions()) .build(); return new OkHttpClient.Builder() .connectionSpecs(Collections.singletonList(spec)) .build(); } } ``` 这段代码构建了一个只允许现代 TLS (即至少为 TLS 1.2)连接规格的对象,并将其应用于新的 HTTP 客户端实例中。 #### 测试和验证 TLS 配置 为了确认 Tomcat 或其他服务器已经正确设置了所需的 TLS 版本,可以利用工具来进行 SSL/TLS 兼容性的检测。这通常涉及到发送请求给目标站点并通过网络分析器查看响应头信息或直接读取日志文件以判断实际协商成功的协议版本。另外也可以通过编程方式获取当前 JVM 中默认上下文对象 (`SSLContext`) 所采用的安全参数作为辅助手段[^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱琴孩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值