黑马程序员技术交流社区

标题: asList用法 [打印本页]

作者: 霍明波    时间: 2012-9-23 22:32
标题: asList用法
import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;

public class Test15 {       
        public static void main(String[] args){
               
                int[] a = {1,3,7,9,5,9,4,3,6,1,7};

                List<int[]> list =  Arrays.asList(a);
                list.remove(0);
                list.remove(8);
                ListIterator<int[]> it = list.listIterator();
                while(it.hasNext()){
                        System.out.println(it.next());
                }
        }       
}
写了上面的程序  编译的时候没有问题,运行就报异常,aslis这个方法怎么用,有什么用,返回类型是List,list的方法能不能用,报异常的原因是什么,纠结中。
作者: 程振    时间: 2012-9-23 23:02
首先List<int[]>这种用法不推荐,why?我没见别人用过,所以少用。
修改如下
    Integer[] a = {1,3,7,9,5,9,4,3,6,1,7};
    List<Integer> list = Arrays.asList(a);
    ListIterator<Integer> it = list.listIterator();

对于list.remove(8)
抛出java.lang.UnsupportedOperationException,
因为Arrays.asList(T... a)返回的是一个list view意思是镜像,不可修改。
所以list.remove(8)抛出异常。

你也可以查看源码来找出原因:
因为
1.
    Arrays.asList(a)
2.
    public static <T> List<T> asList(T... a) {
// 这里的ArrayList来自java.util.Arrays.ArrayList.ArrayList(T[] array)
        return new ArrayList<T>(a);
    }

3.  在Arrays$ArrayList.class里面定义有
    private static class ArrayList<E> extends AbstractList<E>

4. 在java.util.AbstractList<E>中,
    public E remove(int index) {
        throw new UnsupportedOperationException();
    }

思路大致就是这,可能有点乱

   
作者: 皮卫凯    时间: 2012-9-23 23:10
List<int[]> list =  Arrays.asList(a);
楼主这句话意思是把a直接写进了List,而且还是固定了int[]的长度为1.
因为asList
public static <T> List<T> asList(T... a)返回一个受指定数组支持的固定大小的列表。(对返回列表的更改会“直接写”到数组。)
楼上的哥们也说了,用到的比较少。
作者: 严海荣    时间: 2012-9-23 23:12
  1. import java.util.Arrays;
  2. import java.util.List;
  3. import java.util.ListIterator;

  4. public class Test15 {        
  5.         public static void main(String[] args){
  6.                
  7.              //  int[] a = {1,3,7,9,5,9,4,3,6,1,7};
  8.                Integer[] a = {1,3,7,9,5,9,4,3,6,1,7};
  9.                 //List<int[]> list =  Arrays.asList(a);//它把a当作一个元素存如集合,此集合就1个元素
  10.                 List<Integer> list = Arrays.asList(a);
  11.                 //  list.remove(0);
  12.                
  13.               //  list.remove(8);
  14.               //  ListIterator<int[]> it = list.listIterator();
  15.               System.out.println(list);
  16.                 ListIterator<Integer> it = list.listIterator();
  17.                while(it.hasNext()){
  18.                        
  19.                         System.out.println(it.next());//打印的是数组的哈希值
  20.                 }
  21.         }        
  22. }
复制代码
数组变成集合,不可以使用集合的增删方法,因为数组的长度是固定的。
所以你的remove()方法是不能使用的。
如果数组中的元素都是对象。那么变成集合时,数组中的元素就直接转成集合中的元素。
如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。
所以你集合中的元素只有数组a,打印出数组的哈希值。
用Integer可以把里面的数自动装箱成对象,然后才能打印出来。
作者: 吴兵    时间: 2012-9-23 23:55
将数组变成集合,不可以使用集合的增删功能,因为长度是固定的,否则就抛出UnsupportedOperationException这个异常只能使用contains,get,indexOf,subList
毕老师视频,第十七天,视频16,09分18秒
作者: 王贵朝    时间: 2012-9-24 07:50
嗯,基本上就是楼上说的这样数组作为集合是不可以用集合的增删方法
作者: 霍明波    时间: 2012-9-24 08:23
那有什么用啊, 感觉这个方法时废柴啊,没有其他用了吗?




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