Collections Arrays你会用么?
生活随笔
收集整理的這篇文章主要介紹了
Collections Arrays你会用么?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
title: Collections Arrays你會用么? tags:
- Collections
- Arrays
- toArray
- asList
- jcf categories: jcf date: 2017-12-08 13:20:26
背景
JDK給我們提供了一些工具類 用來操作集合等。
通常來說命名規則就是XXXXs 比如Collections 比如Arrays
看到部分同學使用如下
遍歷時這樣
測試
public class CollectionsTest {(expected = UnsupportedOperationException.class)public void testEmptyCollections() {List<TbUser> userList = Collections.emptyList();userList.add(new TbUser());}public void testToArray() {List<String> list = Lists.newArrayList("1", "2", "3");Object[] objects = list.toArray();}public void testToArray2() {List<String> list = Lists.newArrayList("1", "2", "3");String[] strings = list.toArray(new String[list.size()]);} 復制代碼解讀EmptyList是無法add會拋出
UnsupportedOperationException 復制代碼因為emptyList如下
private static class EmptyList<E>extends AbstractList<E>implements RandomAccess, Serializable {private static final long serialVersionUID = 8842843931221139166L;public Iterator<E> iterator() {return emptyIterator();}public ListIterator<E> listIterator() {return emptyListIterator();}public int size() {return 0;}public boolean isEmpty() {return true;}public boolean contains(Object obj) {return false;}public boolean containsAll(Collection<?> c) { return c.isEmpty(); }public Object[] toArray() { return new Object[0]; }public <T> T[] toArray(T[] a) {if (a.length > 0)a[0] = null;return a;}public E get(int index) {throw new IndexOutOfBoundsException("Index: "+index);}public boolean equals(Object o) {return (o instanceof List) && ((List<?>)o).isEmpty();}public int hashCode() { return 1; }public boolean removeIf(Predicate<? super E> filter) {Objects.requireNonNull(filter);return false;}public void replaceAll(UnaryOperator<E> operator) {Objects.requireNonNull(operator);}public void sort(Comparator<? super E> c) {}// Override default methods in Collectionpublic void forEach(Consumer<? super E> action) {Objects.requireNonNull(action);}public Spliterator<E> spliterator() { return Spliterators.emptySpliterator(); }// Preserves singleton propertyprivate Object readResolve() {return EMPTY_LIST;}} 復制代碼當使用toArray時需要最好傳入指定類型的數組【否則類型不對】
public class ArraysTest {public void testAsList0() {Set<String> set = Sets.newSet("a", "b", "c");List strList = Arrays.asList(set);}public void testAsList1() {Set<String> set = Sets.newSet("a", "b", "c");List<Set<String>> strSetList = Arrays.asList(set);}public void testAsList2() {String[] strs;strs = new String[]{"a", "b", "c"};List strings = Arrays.asList(strs);Assert.assertEquals(strings.size(), 3);}public void testAsList3() {Object strs;strs = new String[]{"a", "b", "c"};List strings = Arrays.asList(strs);Assert.assertEquals(strings.size(), 1);}(expected = UnsupportedOperationException.class)public void testAsList4() {List<String> list = Arrays.asList("1", "2", "3");list.add("4");}(expected = ClassCastException.class)public void testAsList5() {List<Integer> list = new ArrayList<>();list.add(1);List list2 = list;list2.add("1223");for (Integer integer : list) {System.out.println(integer);}}public void testAsList6() {Object strs;strs = new String[]{"a", "b", "c"};List strings = Arrays.asList((String[])strs);Assert.assertEquals(strings.size(), 3);}} 復制代碼解讀
指的注意的是asList接受可變參數 【及其容易引起問題】
比如testAsList2 testAsList3 testAsList6
主要在于聲明等不同就會造成最終list的size完全不同!慎用可變參數!
Arrays.asList返回ArrayList
/*** Returns a fixed-size list backed by the specified array. (Changes to* the returned list "write through" to the array.) This method acts* as bridge between array-based and collection-based APIs, in* combination with {@link Collection#toArray}. The returned list is* serializable and implements {@link RandomAccess}.** <p>This method also provides a convenient way to create a fixed-size* list initialized to contain several elements:* <pre>* List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");* </pre>** @param <T> the class of the objects in the array* @param a the array by which the list will be backed* @return a list view of the specified array*/("varargs")public static <T> List<T> asList(T... a) {return new ArrayList<>(a);} 復制代碼稍不注意就會踩到大坑!這個ArrayList是李鬼 全稱是java.util.Arrays.ArrayList
該'arrayList' 不支持正常的add操作會拋出UnsupportedOperationException 【見testAsList4】
List的泛型完全支持用戶想在Integer的List中放入String 【多么變態的需求】一個朋友圈泛型問題引發的“案子”?不過真的這么做了 在取的時候就容易踩到巨坑!
還是別了吧!
總結
以上是生活随笔為你收集整理的Collections Arrays你会用么?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: at命令
- 下一篇: PowerShell导出共存环境下的Ex