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

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

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

    tbwshc

    Arrays.asList方法 學習記錄

    Arrays工具類提供了一些比較實用的方法,比如sort, binarySearch, fill等。其中還有一個asList方法,此方法能夠將一個變長參數或者數組轉換成List。
      但是,這個生成的List,它是固定長度的,如果對其進行add或者remove的操作,會拋出UnsupportedOperationException,為什么會這樣呢?
      帶著疑問,查看一下Arrays的源碼,可以得到問題的結果。
      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類中的重新定義的內部類。
      具體的實現如下:
      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;
      }
      }
      從這個內部類ArrayList的實現可以看出,它繼承了類AbstractList,但是沒有重寫add和remove方法,沒有給出具體的實現。查看一下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產生的List是不可添加或者刪除,否則會產生UnsupportedOperationException,就可以得到解釋了。
      如果我們想把一個變長或者數據轉變成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);
      /*
      * 自己實現一個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;
      }
      }
      輸出結果:
      [Larry, Moe, Curly]
      [[Spring, Summer, Autumn, Winter]]
      [Larry, Moe, Curly, Hello]

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


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


    網站導航:
     
    主站蜘蛛池模板: 日韩精品久久久久久免费 | 亚洲欧洲中文日韩av乱码| 国产一级高清免费观看| 九月婷婷亚洲综合在线| 亚洲国产精品久久久天堂| 91亚洲国产在人线播放午夜| 亚洲综合无码无在线观看| 老司机福利在线免费观看| 中文字幕乱码系列免费| 午夜福利不卡片在线播放免费| 国产一级一片免费播放i| 精品一区二区三区免费毛片| 69视频在线是免费观看| 亚洲A丁香五香天堂网| 亚洲人成网男女大片在线播放| 永久免费无码网站在线观看个| 欧洲人免费视频网站在线| 成人爽A毛片免费看| 亚洲av无码成人黄网站在线观看| 亚洲国产精品成人精品小说| 中文在线免费看视频| 亚洲不卡中文字幕无码| 十八禁无码免费网站| 亚洲毛片αv无线播放一区| 亚洲av乱码中文一区二区三区| 99久久国产免费中文无字幕| 亚洲最大中文字幕| 又大又粗又爽a级毛片免费看| 色在线亚洲视频www| 国产最新凸凹视频免费| 久久综合久久综合亚洲| 91免费国产自产地址入| 亚洲狠狠综合久久| 在线观看黄片免费入口不卡| 2022中文字字幕久亚洲| 亚洲AV一区二区三区四区| 亚洲精品国产高清不卡在线| 91在线手机精品免费观看| 日本系列1页亚洲系列| 大学生美女毛片免费视频| 亚洲制服丝袜精品久久|