免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
正確認(rèn)識(shí)Arrays.asList方法

Arrays工具類提供了一個(gè)方法asList, 使用該方法可以將一個(gè)變長(zhǎng)參數(shù)或者數(shù)組轉(zhuǎn)換成List 

其源代碼如下:

    /**
     * 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 a the array by which the list will be backed
     * @return a list view of the specified array
     */
    @SafeVarargs
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

 

問(wèn)題發(fā)現(xiàn)

根據(jù)上述方法的描述,我們先來(lái)編寫(xiě)幾個(gè)例子:

/**
 * @author wangmengjun
 *
 */
public class ArrayExample {
    
    public static void main(String[] args) {
        
        /**使用變長(zhǎng)參數(shù)*/
        List<String> array1 = Arrays.asList("Welcome", "to","Java", "world");
        System.out.println(array1);
        
        /**使用數(shù)組*/
        List<String> array2 =  Arrays.asList(new String[] {"Welcome", "to","Java", "world"});
        System.out.println(array2);
    }

}

 

運(yùn)行上述程序,輸出如下內(nèi)容。

[Welcome, to, Java, world]
[Welcome, to, Java, world]

 

心血來(lái)潮,突然想在創(chuàng)建的列表中添加一個(gè)字符串“Cool~~~”,  走一個(gè)。

        /**使用變長(zhǎng)參數(shù)*/
        List<String> array1 = Arrays.asList("Welcome", "to","Java", "world");
        array1.add("Cool~~~");

結(jié)果,遇到一個(gè)UnsupportedOperationException異常:

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(Unknown Source)
	at java.util.AbstractList.add(Unknown Source)
	at test.ArrayExample.main(ArrayExample.java:36)

不可思議,new ArrayList<>(a)產(chǎn)生的列表調(diào)用add方法,竟然遇到問(wèn)題。

原因查找

那么問(wèn)題來(lái)了,到底發(fā)生了什么事情?帶著疑問(wèn),去查看一下Arrays.asList中使用的ArrayList到底長(zhǎng)啥樣?

原來(lái)Arrays的asList方法使用的ArrayList類是一個(gè)內(nèi)部定義的類而不是java.util.ArrayList類。

其源代碼如下:


    /**
     * @serial include
     */
    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

        ArrayList(E[] array) {
            if (array==null)
                throw new NullPointerException();
            a = array;
        }

        public int size() {
            return a.length;
        }

        public Object[] toArray() {
            return a.clone();
        }

        public <T> T[] toArray(T[] a) {
            int size = size();
            if (a.length < size)
                return Arrays.copyOf(this.a, size,
                                     (Class<? extends T[]>) a.getClass());
            System.arraycopy(this.a, 0, a, 0, size);
            if (a.length > size)
                a[size] = null;
            return a;
        }

        public E get(int index) {
            return a[index];
        }

        public E set(int index, E element) {
            E oldValue = a[index];
            a[index] = element;
            return oldValue;
        }

        public int indexOf(Object o) {
            if (o==null) {
                for (int i=0; i<a.length; i++)
                    if (a[i]==null)
                        return i;
            } else {
                for (int i=0; i<a.length; i++)
                    if (o.equals(a[i]))
                        return i;
            }
            return -1;
        }

        public boolean contains(Object o) {
            return indexOf(o) != -1;
        }
    }

 

從這個(gè)內(nèi)部類ArrayList的實(shí)現(xiàn)可以看出,它繼承了抽象類java.util.AbstractList<E>, 但是沒(méi)有重寫(xiě)addremove方法,沒(méi)有給出具體的實(shí)現(xiàn)。

但是,默認(rèn)情況下,java.util.AbstractList類在addset以及remove方法中,直接會(huì)拋出UnsupportedOperationException異常。AbstractList的部分源代碼如下:

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
    /**
     * Sole constructor.  (For invocation by subclass constructors, typically
     * implicit.)
     */
    protected AbstractList() {
    }

    public E set(int index, E element) {
        throw new UnsupportedOperationException();
    }

    /**
     * {@inheritDoc}
     *
     * <p>This implementation always throws an
     * {@code UnsupportedOperationException}.
     *
     * @throws UnsupportedOperationException {@inheritDoc}
     * @throws ClassCastException            {@inheritDoc}
     * @throws NullPointerException          {@inheritDoc}
     * @throws IllegalArgumentException      {@inheritDoc}
     * @throws IndexOutOfBoundsException     {@inheritDoc}
     */
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }

    /**
     * {@inheritDoc}
     *
     * <p>This implementation always throws an
     * {@code UnsupportedOperationException}.
     *
     * @throws UnsupportedOperationException {@inheritDoc}
     * @throws IndexOutOfBoundsException     {@inheritDoc}
     */
    public E remove(int index) {
        throw new UnsupportedOperationException();
    }
}

 

正是因?yàn)?strong>java.util.Arrays類的內(nèi)部類ArrayList沒(méi)有重寫(xiě)add和remove方法,所以,當(dāng)我們調(diào)用其add方法時(shí),其實(shí)就是調(diào)用了AbstractList類的add方法,結(jié)果就是直接拋出UnsupportedOperationException異常。

同理,在調(diào)用remove方法,或者調(diào)用與add、remove方法相關(guān)聯(lián)的其它方法(如addAll)同樣會(huì)遇到UnsupportedOperationException異常。

addAll的例子

/**
 * @author wangmengjun
 *
 */
public class ArrayExample {

    public static void main(String[] args) {

        /**使用變長(zhǎng)參數(shù)*/
        List<String> array1 = Arrays.asList("Welcome", "to", "Java", "world");
        array1.addAll(Arrays.asList("AAA", "BBB"));
    }

}

 

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(Unknown Source)
	at java.util.AbstractList.add(Unknown Source)
	at java.util.AbstractCollection.addAll(Unknown Source)
	at test.ArrayExample.main(ArrayExample.java:36)

 

set的例子:

/**
 * @author wangmengjun
 *
 */
public class ArrayExample {

    public static void main(String[] args) {

        /**使用變長(zhǎng)參數(shù)*/
        List<String> array1 = Arrays.asList("Welcome", "to", "Java", "world");
        System.out.println(array1);
        
        //將Java替換成hello
        array1.set(2, "hello");
        System.out.println(array1);
    }

}

正是由于Arrays的內(nèi)部類ArrayList重寫(xiě)了set方法,所以上述程序能夠正常運(yùn)行,不會(huì)再拋出UnsupportedOperationException異常。

結(jié)果如下:

[Welcome, to, Java, world]
[Welcome, to, hello, world]

 

使用場(chǎng)景

從上述的例子和簡(jiǎn)單分析來(lái)看,Arrays工具類提供了一個(gè)方法asList, 使用該方法可以將一個(gè)變長(zhǎng)參數(shù)或者數(shù)組轉(zhuǎn)換成List 

但是,生成的List的長(zhǎng)度是固定的;能夠進(jìn)行修改操作(比如,修改某個(gè)位置的元素);不能執(zhí)行影響長(zhǎng)度的操作(如add、remove等操作)。會(huì)拋出UnsupportedOperationException異常。

Arrays.asList比較適合那些已經(jīng)有數(shù)組數(shù)據(jù)或者一些元素,而需要快速構(gòu)建一個(gè)List,只用于讀取操作,而不進(jìn)行添加或刪除操作的場(chǎng)景。

如果,想要根據(jù)已知數(shù)組數(shù)據(jù),快速獲取一個(gè)可進(jìn)行增刪改查的列表List,一個(gè)比較簡(jiǎn)單的方法如下:

重新使用java.util.ArrayList包裝一層。

/**
 * @author wangmengjun
 *
 */
public class ArrayExample {

    public static void main(String[] args) {

        /**使用變長(zhǎng)參數(shù)*/
        List<String> array1 = new ArrayList<>(Arrays.asList("Welcome", "to", "Java", "world"));
        System.out.println(array1);

        array1.add("Cool~~~");
        System.out.println(array1);

    }

}

結(jié)果如下:

[Welcome, to, Java, world]
[Welcome, to, Java, world, Cool~~~]

 

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
java中的Arrays.asList()底層原理分析
細(xì)數(shù) List 的10個(gè)坑,保證你一定遇到過(guò)!
將java中數(shù)組轉(zhuǎn)換為ArrayList的方法實(shí)例(包括ArrayList轉(zhuǎn)數(shù)組)
Java提高篇(三六)-----Java集合細(xì)節(jié)(二):asList的缺陷
集合異常java.lang.UnsupportedOperationException
Java基礎(chǔ):關(guān)于Arrays.asList(String[] arr)轉(zhuǎn)換得到的數(shù)組為何不能增刪的問(wèn)題
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服