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

Arrays.asList()和Collections.singletonList()比较相关推荐

  1. 持有对象---Arrays.asList()和Collections.addAll()的性能比较

    import java.util.ArrayList;  import java.util.Arrays;  import java.util.Collections;  import java.ut ...

  2. Java集合工具类的一些坑,Arrays.asList()、Collection.toArray()...

    Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特 ...

  3. Arrays.asList()

    Arrays.asList() Arrays.asList()在平时开发中比较常见,可以使用它将一个数组转换成为一个List集合 String[] myArray = {"a",& ...

  4. java stream toarray_Java集合工具类的一些坑,Arrays.asList()、Collection.toArray()...

    Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特 ...

  5. Java Arrays.asList()方法详解

    本文是对Arrays.asList()方法从源码角度进行分析,解析使用中的一些困惑. 首先看Arrays.asList()的源码 public static <T> List<T&g ...

  6. 将数组转换成集合Arrays.asList,不可进行add和remove操作的原因

    直接上代码: import java.util.Arrays; import java.util.List;public class Test {public static void main(Str ...

  7. Java 关于使用Arrays.asList()数组转集合的问题

    在使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合的相关方法,他的add/remove/clear方法都会抛出UnsupportedOperationException异 ...

  8. 数组转集合问题Arrays.asList()

    数组转集合问题Arrays.asList() 1. 源码: Arrays.class public static <T> List<T> asList(T... a) {//A ...

  9. Arrays.aslist用法及陷阱

    原文出处http://blog.csdn.net/chenleixing/article/details/43775127 大家都知道这个方法是将数组转成list,是JDK中java.util包中Ar ...

最新文章

  1. java 闭包与回调
  2. SpringBoot-400-Bad-Request(Request-header-is-too-large)
  3. 运用家居收纳储物空间 小空间变出大身材
  4. Python学习(四)
  5. SpringBoot注解大全
  6. 网络交换机功能和原理详解
  7. 将ubuntu配置为路由器_“名酒为王”时代来临但资源将尽,看泸州老窖如何进行“名酒资源再配置”丨深度观察...
  8. linux定时任务每两天执行,Linux定时任务 crontab每秒执行 实现2种方法
  9. python万年历实验报告_Python实现的简单万年历例子分享
  10. CentOS7中搭建cobbler自动装机服务
  11. 【Prims】--【telerik】DataGridView 控件
  12. java 按分割为数组中_[Java教程]JS中,split()用法(将字符串按指定符号分割成数组)...
  13. JavaWeb文件上传(1)--基础
  14. 2019-2020新闻自动挂机阅读脚本应用开发
  15. 2021-02-07 USR-WIFI232-B2 串口转WIFI模块
  16. 4.文件读取操作_read函数
  17. blockchain-explorer(pg版) 区块浏览器部署及配置详解
  18. 雷霆战机android代码,雷霆战机代码
  19. 使用阿里云实现简单的直播
  20. DC综合的一些基本概念

热门文章

  1. arm tbh_TBH的完整形式是什么?
  2. if mybatis tk 多个_面试题:mybatis 中的 DAO 接口和 XML 文件里的 SQL 是如何建立关系的?...
  3. node js 开发网站_使用Node JS开发网站
  4. Java SimpleTimeZone inDaylightTime()方法及示例
  5. 如何在python中获取浮点数的十六进制值?
  6. 面试官:重写 equals 时为什么一定要重写 hashCode?
  7. 升级了 Windows 11 正式版,有坑吗?
  8. 面经分享:历时半个月,终于拿到了蚂蚁金服的offer!
  9. Windows重装Anaconda3失败解决方案【重装失败10来次首次成功的案例!】
  10. Android 禁止屏幕旋转 旋转屏幕时保持Activity内容