黑马程序员技术交流社区

标题: java集合测试选择题,帮解答下亲门。 [打印本页]

作者: 黑马生涯    时间: 2015-5-21 12:24
标题: java集合测试选择题,帮解答下亲门。
关于将int数组使用系统提供的API转成集合后,不可以进行的操作是(  )
a)增加集合中的元素
b)迭代集合
c)修改集合中的元素
d)获取集合中元素的个数
作者: l763631191    时间: 2015-5-21 12:28
A                                             
作者: huangjinlangzi    时间: 2015-5-21 14:37
将数组变成集合,不可以使用集合的增删方法;
因为数组的长度是固定的;

作者: as604049322    时间: 2015-5-21 15:06

  1. public static <T> List<T> asList(T... a) {
  2.         return new ArrayList<>(a);
  3.     }

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

  12.         ArrayList(E[] array) {
  13.             a = Objects.requireNonNull(array);
  14.         }

  15.         @Override
  16.         public int size() {
  17.             return a.length;
  18.         }

  19.         @Override
  20.         public Object[] toArray() {
  21.             return a.clone();
  22.         }

  23.         @Override
  24.         @SuppressWarnings("unchecked")
  25.         public <T> T[] toArray(T[] a) {
  26.             int size = size();
  27.             if (a.length < size)
  28.                 return Arrays.copyOf(this.a, size,
  29.                                      (Class<? extends T[]>) a.getClass());
  30.             System.arraycopy(this.a, 0, a, 0, size);
  31.             if (a.length > size)
  32.                 a[size] = null;
  33.             return a;
  34.         }

  35.         @Override
  36.         public E get(int index) {
  37.             return a[index];
  38.         }

  39.         @Override
  40.         public E set(int index, E element) {
  41.             E oldValue = a[index];
  42.             a[index] = element;
  43.             return oldValue;
  44.         }

  45.         @Override
  46.         public int indexOf(Object o) {
  47.             E[] a = this.a;
  48.             if (o == null) {
  49.                 for (int i = 0; i < a.length; i++)
  50.                     if (a[i] == null)
  51.                         return i;
  52.             } else {
  53.                 for (int i = 0; i < a.length; i++)
  54.                     if (o.equals(a[i]))
  55.                         return i;
  56.             }
  57.             return -1;
  58.         }

  59.         @Override
  60.         public boolean contains(Object o) {
  61.             return indexOf(o) != -1;
  62.         }

  63.         @Override
  64.         public Spliterator<E> spliterator() {
  65.             return Spliterators.spliterator(a, Spliterator.ORDERED);
  66.         }

  67.         @Override
  68.         public void forEach(Consumer<? super E> action) {
  69.             Objects.requireNonNull(action);
  70.             for (E e : a) {
  71.                 action.accept(e);
  72.             }
  73.         }

  74.         @Override
  75.         public void replaceAll(UnaryOperator<E> operator) {
  76.             Objects.requireNonNull(operator);
  77.             E[] a = this.a;
  78.             for (int i = 0; i < a.length; i++) {
  79.                 a[i] = operator.apply(a[i]);
  80.             }
  81.         }

  82.         @Override
  83.         public void sort(Comparator<? super E> c) {
  84.             Arrays.sort(a, c);
  85.         }
  86.     }
复制代码

作者: as604049322    时间: 2015-5-21 15:13
Arrays.asList()返回的是Arrays的内部类,这个类没有复写add和remove方法,而父类AbstractList的增删操作直接抛出UnsupportedOperationException()异常。
  1. public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
  2.    
  3.     protected AbstractList() {
  4.     }

  5.     public boolean add(E e) {
  6.         add(size(), e);
  7.         return true;
  8.     }

  9.     public void add(int index, E element) {
  10.         throw new UnsupportedOperationException();
  11.     }

  12.     public E remove(int index) {
  13.         throw new UnsupportedOperationException();
  14.     }
  15. }
复制代码

作者: 王建伟    时间: 2015-5-21 15:19
as604049322 发表于 2015-5-21 15:13
Arrays.asList()返回的是Arrays的内部类,这个类没有复写add和remove方法,而父类AbstractList的增删操作直 ...

list不是可以变长的吗?很迷惑啊。。。。
作者: qinhaihang    时间: 2015-5-21 16:02
明显是A选项
作者: sss18310878521    时间: 2015-5-21 16:10
答案是a,你说的集合应该是ArrayList,因为它的底层结构就是数组,既然是数组,那么它的长度就不能被修改,(这跟我们平常所说的集合长度可以自由增长不一样,因为这个是由数组转过来的)
作者: zdh    时间: 2015-5-21 16:12
a嘛~~!!!!
作者: as604049322    时间: 2015-5-21 16:48
王建伟 发表于 2015-5-21 15:19
list不是可以变长的吗?很迷惑啊。。。。

list只是一个接口,,能不能自动变长,取决于子类的实现,但Arrays.asList方法返回的对象不是java.util.ArrayList,是Arrays的内部类,可以参考一下我刚研究的:
教你如何一句代码将数组转为可变长度的集合
http://bbs.itheima.com/thread-198008-1-1.html
(出处: 黑马程序员IT技术论坛)

作者: as604049322    时间: 2015-5-21 16:49
sss18310878521 发表于 2015-5-21 16:10
答案是a,你说的集合应该是ArrayList,因为它的底层结构就是数组,既然是数组,那么它的长度就不能被修改, ...

其实ArrayList的底层本身就是数组,,可以参考源码,,,或看楼上回复
作者: 你们敬爱的人    时间: 2015-5-21 17:19
数组定长.   A
作者: 纯情花心男    时间: 2015-5-21 18:29
这道题我做错了,哎
作者: shao122791159    时间: 2015-5-21 19:44
A为整洁
作者: 马鹏涛    时间: 2015-5-21 19:55
果断是A啊
作者: rick1991chen    时间: 2015-5-21 20:16
diaodiaodiao学习到了,虽然没看懂
作者: rick1991chen    时间: 2015-5-21 20:23
rick1991chen 发表于 2015-5-21 20:16
diaodiaodiao学习到了,虽然没看懂

里面的集合还没有看到,绞尽脑汁都看不懂




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2