<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    tbwshc

    Arrays.asList方法 學(xué)習(xí)記錄

    Arrays工具類提供了一些比較實用的方法,比如sort, binarySearch, fill等。其中還有一個asList方法,此方法能夠?qū)⒁粋€變長參數(shù)或者數(shù)組轉(zhuǎn)換成List。
      但是,這個生成的List,它是固定長度的,如果對其進行add或者remove的操作,會拋出UnsupportedOperationException,為什么會這樣呢?
      帶著疑問,查看一下Arrays的源碼,可以得到問題的結(jié)果。
      Java代碼
      /**
      * 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 Collection.toArray. The returned list is
      * serializable and implements {@link RandomAccess}.
      *
      *
      This method also provides a convenient way to create a fixed-size
      * list initialized to contain several elements:
      *
      * List stooges = Arrays.asList("Larry", "Moe", "Curly");
      *
      *
      * @param a the array by which the list will be backed.
      * @return a list view of the specified array.
      * @see Collection#toArray()
      */
      public static List asList(T... a) {
      return new ArrayList(a);

      方法asList返回的是new ArrayList(a)。但是,這個ArrayList并不是java.util.ArrayList,它是一個Arrays類中的重新定義的內(nèi)部類。
      具體的實現(xiàn)如下:
      Java代碼
      /**
      * @serial include
      */
      private static class ArrayList extends AbstractList
      implements RandomAccess, java.io.Serializable
      {
      private static final long serialVersionUID = -2764017481108945198L;
      private Object[] a;
      ArrayList(E[] array) {
      if (array==null)
      throw new NullPointerException();
      a = array;
      }
      public int size() {
      return a.length;
      }
      public Object[] toArray() {
      return (Object[])a.clone();
      }
      public E get(int index) {
      return (E)a[index];
      }
      public E set(int index, E element) {
      Object oldValue = a[index];
      a[index] = element;
      return (E)oldValue;
      }
      public int indexOf(Object o) {
      if (o==null) {
      for (int i=0; i
      if (a[i]==null)
      return i;
      } else {
      for (int i=0; i
      if (o.equals(a[i]))
      return i;
      }
      return -1;
      }
      public boolean contains(Object o) {
      return indexOf(o) != -1;
      }
      }
      從這個內(nèi)部類ArrayList的實現(xiàn)可以看出,它繼承了類AbstractList,但是沒有重寫add和remove方法,沒有給出具體的實現(xiàn)。查看一下AbstractList類中對add和remove方法的定義,如果一個list不支持add和remove就會拋出UnsupportedOperationException。
      Java代碼
      public abstract class AbstractList extends AbstractCollection implements List {
      /**
      * Sole constructor. (For invocation by subclass constructors, typically
      * implicit.)
      */
      protected AbstractList() {
      }
      /**
      * Appends the specified element to the end of this List (optional
      * operation).
      *
      * This implementation calls add(size(), o).
      *
      * Note that this implementation throws an
      * UnsupportedOperationException unless add(int, Object)
      * is overridden.
      *
      * @param o element to be appended to this list.
      *
      * @return true (as per the general contract of
      * Collection.add).
      *
      * @throws UnsupportedOperationException if the add method is not
      * supported by this Set.
      *
      * @throws ClassCastException if the class of the specified element
      * prevents it from being added to this set.
      *
      * @throws IllegalArgumentException some aspect of this element prevents
      * it from being added to this collection.
      */
      public boolean add(E o) {
      add(size(), o);
      return true;
      }
      /**
      * Inserts the specified element at the specified position in this list
      * (optional operation). Shifts the element currently at that position
      * (if any) and any subsequent elements to the right (adds one to their
      * indices).
      *
      * This implementation always throws an UnsupportedOperationException.
      *
      * @param index index at which the specified element is to be inserted.
      * @param element element to be inserted.
      *
      * @throws UnsupportedOperationException if the add method is not
      * supported by this list.
      * @throws ClassCastException if the class of the specified element
      * prevents it from being added to this list.
      * @throws IllegalArgumentException if some aspect of the specified
      * element prevents it from being added to this list.
      * @throws IndexOutOfBoundsException index is out of range (index <
      * 0 || index > size()).
      */
      public void add(int index, E element) {
      throw new UnsupportedOperationException();
      }
      /**
      * Removes the element at the specified position in this list (optional
      * operation). Shifts any subsequent elements to the left (subtracts one
      * from their indices). Returns the element that was removed from the
      * list.
      *
      * This implementation always throws an
      * UnsupportedOperationException.
      *
      * @param index the index of the element to remove.
      * @return the element previously at the specified position.
      *
      * @throws UnsupportedOperationException if the remove method is
      * not supported by this list.
      * @throws IndexOutOfBoundsException if the specified index is out of
      * range (index < 0 || index >= size()).
      */
      public E remove(int index) {
      throw new UnsupportedOperationException();
      }
      }
      至此,為什么Arrays.asList產(chǎn)生的List是不可添加或者刪除,否則會產(chǎn)生UnsupportedOperationException,就可以得到解釋了。
      如果我們想把一個變長或者數(shù)據(jù)轉(zhuǎn)變成List, 而且tb期望這個List能夠進行add或者remove操作,那該怎么做呢?
      我們可以寫一個類似的方法,里面直接采用java.util.ArrayList即可。
      比如:
      Java代碼
      import java.util.ArrayList;
      import java.util.Collections;
      import java.util.List;
      public class MyArrays {
      public static List asList(T... a) {
      List list = new ArrayList();
      Collections.addAll(list, a);
      return list;
      }
      }
      測試代碼如下:
      Java代碼
      import java.util.ArrayList;
      import java.util.Arrays;
      import java.util.List;
      public class Test {
      @SuppressWarnings("unchecked")
      public static void main(String[] args) {
      List stooges = Arrays.asList("Larry", "Moe", "Curly");
      print(stooges);
      List> seasonsList = Arrays.asList(retrieveSeasonsList());
      print(seasonsList);
      /*
      * 自己實現(xiàn)一個asList方法,能夠添加和刪除。
      */
      List list = MyArrays.asList("Larry", "Moe", "Curly");
      list.add("Hello");
      print(list);
      }
      private static void print(List list) {
      System.out.println(list);
      }
      private static List retrieveSeasonsList() {
      List seasonsList = new ArrayList();
      seasonsList.add("Spring");
      seasonsList.add("Summer");
      seasonsList.add("Autumn");
      seasonsList.add("Winter");
      return seasonsList;
      }
      }
      輸出結(jié)果:
      [Larry, Moe, Curly]
      [[Spring, Summer, Autumn, Winter]]
      [Larry, Moe, Curly, Hello]

    posted on 2013-07-15 17:08 chen11-1 閱讀(242) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲Av无码国产情品久久 | 最近中文字幕完整版免费高清| 91免费福利视频| 国产精品成人免费一区二区 | 国产成人亚洲精品91专区高清 | 永久免费av无码入口国语片| 亚洲av高清在线观看一区二区| 亚洲欧洲中文日韩久久AV乱码| 亚洲免费人成在线视频观看| 中文字幕在线观看免费| 国产精品亚洲片在线观看不卡| 亚洲成a人片毛片在线| 日本高清高色视频免费| 亚洲av福利无码无一区二区 | 国内精品99亚洲免费高清| 国产成人精品曰本亚洲79ren| 亚洲特级aaaaaa毛片| 一个人免费高清在线观看| 亚洲色偷偷综合亚洲av78 | 亚洲欧洲日韩综合| 青青青国产在线观看免费| 亚洲欧洲国产精品久久| 妞干网在线免费视频| 高清免费久久午夜精品| 亚洲中文字幕久久精品无码喷水| 亚洲制服丝袜在线播放| 在线观看人成视频免费| www成人免费视频| 久久亚洲中文字幕精品有坂深雪| 美美女高清毛片视频黄的一免费| 日韩精品人妻系列无码专区免费| 在线a亚洲v天堂网2018| 女人隐私秘视频黄www免费| 亚洲免费在线视频| 日韩精品视频免费观看| 中文在线观看国语高清免费| 亚洲午夜电影一区二区三区| 狠狠亚洲狠狠欧洲2019| 两性刺激生活片免费视频| 人妖系列免费网站观看| 亚洲日韩中文字幕|