方法注释
/** * 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 @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); } } //普通写法 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