Arrays.asList()和Collections.singletonList()比较

Collections.singletonList(something)不可变的,

Collections.singletonList(something)返回的列表所做的任何更改将导致UnsupportedOperationException

Arrays.asList(something)允许Arrays.asList(something) 更改

此外,由Collections.singletonList(something)返回的List的容量将始终为1,

​ 而Arrays.asList(something)的容量将为已支持数组的大小。

     * 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);}/*** @serial include*/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@Overridepublic void forEach(Consumer<? super E> action) {action.accept(element);}@Overridepublic boolean removeIf(Predicate<? super E> filter) {throw new UnsupportedOperationException();}@Overridepublic void replaceAll(UnaryOperator<E> operator) {throw new UnsupportedOperationException();}@Overridepublic void sort(Comparator<? super E> c) {}@Overridepublic Spliterator<E> spliterator() {return singletonSpliterator(element);}}

附录:

package com.ysyc.invoicecertify.util.mockservice;import java.util.Arrays;
import java.util.List;/**** 本类演示了Arrays类中的asList方法* 通过四个段落来演示,体现出了该方法的相关特性.** (1) 该方法对于基本数据类型的数组支持并不好,当数组是基本数据类型时不建议使用* (2) 当使用asList()方法时,数组就和列表链接在一起了.*     当更新其中之一时,另一个将自动获得更新。*     注意:仅仅针对对象数组类型,基本数据类型数组不具备该特性* (3) asList得到的数组是的没有add和remove方法的** 通过查看Arrays类的源码可以知道,asList返回的List是Array中的实现的* 内部类,而该类并没有定义add和remove方法.另外,为什么修改其中一个,另一个也自动* 获得更新了,因为asList获得List实际引用的就是数组*/
public class AsListTest {public static void main(String[] args) {/* 段落一:基本数据类型使用asList中的问题 *//* 说明:虽然在JDK1.6中能够将基本数据类型的数组转换成List,但还是有个缺陷 */int[] a_int = { 1, 2, 3, 4 };/* 预期输出应该是1,2,3,4,但实际上输出的仅仅是一个引用, 这里它把a_int当成了一个元素 */List a_int_List = Arrays.asList(a_int);foreach(a_int_List);/* 为此我们需要这样遍历其中元素 */foreachForBase(a_int_List);System.out.println("1 END 2 START");/* 段落二:对象类型的数组使用asList,是我们预期的 */Integer[] a_Integer = new Integer[] { 1, 2, 3, 4 };List a_Integer_List = Arrays.asList(a_Integer);foreach(a_Integer_List);System.out.println("2 END 3 START");/* 段落三:当更新数组或者asList之后的List,另一个将自动获得更新 */a_Integer_List.set(0, 0);foreach(a_Integer_List);foreach(a_Integer);System.out.println("3 END 4 START");a_Integer[0] = 5;foreach(a_Integer_List);foreach(a_Integer);/* 段落四:对基本类型数组,通过asList之后的List修改对应的值后,在运行时会报出异常* 但是基本类型数组对应的List是会发生变化的,这是毫无疑问的*/a_int_List.set(0, 0);foreach(a_int_List);foreach(a_int);System.out.println("4 END 5 START");a_int[0] = 5;foreachForBase(a_int_List);foreach(a_int);}/* 打印方法 */private static void foreach(List list) {for (Object object : list) {System.out.print(object + " ");}System.out.println();}private static void foreachForBase(List a_int_List) {int[] _a_int = (int[]) a_int_List.get(0);foreach(_a_int);}private static void foreach(int[] a_int) {for (int i : a_int) {System.out.print(i + " ");}System.out.println();}private static void foreach(Integer[] _a_Integer) {for (int i : _a_Integer) {System.out.print(i + " ");}System.out.println();}
}

结果:

Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integerat java.util.Arrays$ArrayList.set(Arrays.java:3847)at com.ysyc.invoicecertify.util.mockservice.AsListTest.main(AsListTest.java:56)
[I@762efe5d 
1 2 3 4 
1 END 2 START
1 2 3 4 
2 END 3 START
0 2 3 4 
0 2 3 4 
3 END 4 START
5 2 3 4 
5 2 3 4 
Disconnected from the target VM, address: '127.0.0.1:54490', transport: 'socket'Process finished with exit code 1





Collections.singletonList方法的使用

方法注释

    /*** 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*/

应用

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

//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@Overridepublic void forEach(Consumer<? super E> action) {action.accept(element);}@Overridepublic boolean removeIf(Predicate<? super E> filter) {throw new UnsupportedOperationException();}@Overridepublic void replaceAll(UnaryOperator<E> operator) {throw new UnsupportedOperationException();}@Overridepublic void sort(Comparator<? super E> c) {}@Overridepublic Spliterator<E> spliterator() {return singletonSpliterator(element);}}
//普通写法List<MyBean> beans= MyService.getInstance().queryBean(param);if (CollectionUtils.isEmpty(beans)) {beans= new ArrayList<>();MyBean bean= new MyBean(param);beans.add(bean);}
//优化写法List<MyBean> beans= MyService.getInstance().queryBean(param);if (CollectionUtils.isEmpty(beans)) {MyBean bean= new MyBean(param);beans= Collections.singletonList(bean);}

其他特殊容器类

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()
  • 需要注意的是,以上6个方法返回的容器类均是immutable,即只读的,如果调用修改接口,将会抛出UnsupportedOperationException



Collections.singletonList返回只有一个元素的不可变的List,以及其他状态的特殊集合

Collections.singletonList,返回只有一个元素的集合,省内存,因为默认的List在JDK1.8之后初始化后add元素之后的size=10
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 邮件类库,[3.3]-扩展类库:基于PHPMailer的邮件发送 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...

3.3.1 扩展类库&#xff1a;基于PHPMailer的邮件发送此扩展可用于发送邮件。3.3.2 安装和配置从 PhalApi-Library 扩展库中下载获取 PHPMailer 包&#xff0c;如使用&#xff1a;$ git clone https://git.oschina.net/dogstar/PhalApi-Library.git然后把 PHPMailer 目录复制到 …

spring boot报FileSizeLimitExceededException异常的解决方法

开发spring boot程序时&#xff0c;遇到了如下错误&#xff1a; The field file exceeds its maximum permitted size of 1048576 bytes. 原因&#xff1a; Spring Boot工程嵌入的tomcat限制了请求的文件大小&#xff0c;官方文档中这样描述&#xff1a; Spring Boot embraces…

js表单提交 php,JavaScript提交表单的几种方法

在我们工作中我们会经常使用到form表单&#xff0c;相信大家再熟悉不过了&#xff0c;那么提交表单有很多种方法&#xff0c;JavaScript提交表单的方法又是如何呢&#xff0c;今天就带大家介绍下JavaScript提交表单的几种方法&#xff01;第一种方式&#xff1a;表单提交&#…

前后端分离中的权限管理思路

在传统的前后端不分的开发中&#xff0c;权限管理主要通过过滤器或者拦截器来进行&#xff08;权限管理框架本身也是通过过滤器来实现功能&#xff09;&#xff0c;如果用户不具备某一个角色或者某一个权限&#xff0c;则无法访问某一个页面。 但是在前后端分离中&#xff0c;…

陈顺志 php,芦芽山之情

芦芽山之情循着潺潺的水声&#xff0c;穿过颗颗红桦树&#xff0c;踩着红色的木板桥&#xff0c;听着山谷中传来的一声声清脆的鸟鸣&#xff0c;闻着扑鼻的在空气中酝酿着的雨露的清新&#xff0c;我们向芦芽山上走去。青山 白雾我们仿佛踏入了梦境的天地&#xff0c;山在雾中…

前、后端分离权限控制设计与实现

简述 近几年随着react、angular、vue等前端框架兴起&#xff0c;前后端分离的架构迅速流行。但同时权限控制也带来了问题。 网上很多前、后端分离权限仅仅都仅仅在描述前端权限控制、且是较简单、固定的角色场景&#xff0c;满足不了我们用户、角色都是动态的场景。且仅仅前端…

风云php,t.php · 风云酷小子/js - Gitee.com

$ch curl_init();curl_setopt($ch, CURLOPT_URL, "http://zx.rcpx.cc/els/html/courseStudyItem/courseStudyItem.updateTimestepByUserTimmer.do");curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// post数据curl_setopt($ch,…

前后端分离必备的接口规范,十分接地气

1. 前言 随着互联网的高速发展&#xff0c;前端页面的展示、交互体验越来越灵活、炫丽&#xff0c;响应体验也要求越来越高&#xff0c;后端服务的高并发、高可用、高性能、高扩展等特性的要求也愈加苛刻&#xff0c;从而导致前后端研发各自专注于自己擅长的领域深耕细作。 然…

ubuntu php设置,关于ubuntu php环境设置详解-PHP问题

ubuntu php设置办法&#xff1a;起首更新源列表&#xff1b;而后关上“终端窗口”&#xff0c;输出饬令“sudo apt-get install php5”来装置php&#xff1b;接着装置设置装备摆设好apache环境&#xff0c;并装置php5-gd模块&#xff1b;最初创立“info.php”文件便可。Ubuntu …

springboot前后端分离后权限原理浅谈

1. 需求描述 最近在梳理springboot前后端分离后的权限管理问题。前段时间&#xff0c;已经把shiro的实现和spring security 的实现进行了初步的了解。如果深入细节&#xff0c;一个篇幅怕是不够。本文仅对权限管理的一些通用原理进行探讨。 2. 权限分类 在前后端分离之后&am…

js异步请求php数据,原生JS发送异步数据请求实例详解

这篇文章主要为大家详细介绍了原生JS发送异步数据请求的相关资料&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下在做项目的时候&#xff0c;有时候需要用到异步数据请求&#xff0c;但是如果这个时候没有框架的依赖&#xff0c;就需要用到原生JS进行…

MyBatis-Plus——增删查改

开发环境 IDEA JDK&#xff1a;1.8 Spring Boot:2.6.2 Maven:3.3.9 MySQL:8.0.23 数据库准备 CREATE DATABASE mybatis_plus_db;DROP TABLE IF EXISTS person; CREATE TABLE person(id BIGINT(20) NOT NULL COMMENT 主键ID, name VARCHAR(30) NULL DEFAULT NULL COMMENT 姓…

让程序员最爽的ThreadLocal使用姿势

一、常见场景 ​ 1、ThreadLocal作为线程上下文副本&#xff0c;那么一种最常见的使用方式就是用来方法隐式传参&#xff0c;通过提供的set()和get()两个public方法来实现在不同的方法中的参数传递。对于编程规范来说&#xff0c;方法定义的时候是对参数个数是有限制的&#x…

php 堆和栈示例,php中堆和栈的使用

这篇文章介绍的内容是关于php中堆和栈的使用&#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下一、关于堆和栈的概念及区别这里参考上篇博客&#xff1a; 浅谈堆和栈的区别通过这篇文章&#xff0c;我们可以知道广义的堆和栈到底…

一场事故告诉你zookeeper和nacos谁更适合做注册中心

前言 ​ 在分布式系统中&#xff0c;注册中心充当着重要角色&#xff0c;是服务发现、客户端负载均衡中不可缺少的一员。注册中心除了能够实现基本的功能外&#xff0c;他的稳定性、可用性和健壮性对整个分布式系统的流畅运行影响重大。dubbo作为国内一款主流的分布式系统&…

mysql 排他,mysql 共享锁 排他锁 防插入锁

试验1事务1&#xff1a;#!/usr/bin/pythonimport timeimport MySQLdb;conn MySQLdb.connect(host"localhost",port3306,user"root",passwd"asdf",db"test",unix_socket"/data/mysql_3306/mysql.sock")cursor conn.cursor(…

MySQL操作之JSON数据类型操作详解

MySQL操作之JSON数据类型操作详解 这篇文章主要介绍了MySQL操作之JSON数据类型操作详解&#xff0c;内容较为详细&#xff0c;具有收藏价值&#xff0c;需要的朋友可以参考。 概述 mysql自5.7.8版本开始&#xff0c;就支持了json结构的数据存储和查询&#xff0c;这表明了my…

Mysql执行计划含义,mysql执行计划介绍

烂sql不仅直接影响sql的响应时间&#xff0c;更影响db的性能&#xff0c;导致其它正常的sql响应时间变长。如何写好sql&#xff0c;学会看执行计划至关重要。下面我简单讲讲mysql的执行计划&#xff0c;只列出了一些常见的情况&#xff0c;希望对大家有所帮助。测试表结构&…

Http GET 请求参数中文乱码

Http GET 请求参数中文乱码 两种解决方式 第1种&#xff1a;代码里转换 String name request.getParamter("name"); String nameUtf8 new String(name.getBytes("ISO8859-1"), "UTF-8");第2种&#xff1a;修改Tomcat配置 TOMCAT_HOME/conf…

matlab randomsample,randperm和randsample函数用法对比

构建替代数据的时候&#xff0c;一种常见的思路是打乱原数据的排列次序&#xff0c;通过随机置换原数据的排列次序从而产生和原数据系列统计特征(如均值、方差、分布)一致的随机数据。具体到Matlab中&#xff0c;此思路的实现会涉及到两个命令&#xff1a;randperm和randsample…