黑马程序员技术交流社区

标题: 对Arrays的理解: [打印本页]

作者: 飞飞小狮子    时间: 2015-8-8 21:10
标题: 对Arrays的理解:
对Arrays的理解:
对其的static <T> List<T> asList(T... a)de理解

1:参数的理解
T...a:这是一个可变的参数,分两种情况传入参数
          A:传入一个一个内容,例如asList(“1”,“2”);
        B:传入一个数组 例如: String [] arr=new String[]{"1","2"};asList(arr);
                数组又分为两种:1》数组中的元素为基本数据类型,会把整个数组作为一个元素放入集合中2》数组中的元素为引用类型,会把每一个数组
                                中的元素作为对象放入集合list中;
例子:
      public static void main(String[] args) {
                //数组中存放引用类型的
                // TODO Auto-generated method stub
                String [] arr=new String [3];
                arr[0]="li";
                arr[1]="ki";
                List<String> list=Arrays.asList(arr);
                System.out.println("数组存引用类型时候转成集合后的集合的元素个数:"+list.size());
                //list.add("12");
                Iterator<String> it=list.iterator();
                while(it.hasNext()){
                String s=it.next();
                        System.out.println(s);
                       
                }
                //数组中存放基本数值类型
                int [] arr1=new int []{1,2,3};
                List<int []> li=Arrays.asList(arr1);
                System.out.println("数组存基本类型时候转成集合后的集合的元素个数:"+li.size());
                //list.add("12");
                Iterator<int[]> it1=li.iterator();
                while(it1.hasNext()){
                int[] s=it1.next();
                        System.out.println(s);
                       
                }
                结果:

                数组存引用类型时候转成集合后的集合的元素个数:3
                        li
                        ki
                        null
                数组存基本类型时候转成集合后的集合的元素个数:       
                        1
                        [I@6d9dd520


2:
        Arrays的asList()返回的List是Arrays的内部类Arrays.ArrayList,此处的ArrayList与集合框架中的Arraylist
        有很大的不同;
        通过Arrays的源码可以得知:该ArrayList是Arrays的静态内部类,并且继承了AbstractList,但是并没有
        重写AbstractList中的add,delete,等方法(基本都是有关修改集合中元素的方法)而集合框架中的ArrayList
        则重写了AbstractList中所有的方法,所以通过asList()得到的集合List不能使用add,delete方法,否则会报错
        java.lang.UnsupportedOperationException;

3:为啥定义内部类?
        此处把ArrayList定义成内部类,因为该类只在Arrays中有他的特殊的使用作用;所以定义成内部类。
        同时也省了在类中定义get,set方法,方便使用;
        还有成内部类有很好的封装性和隐藏性。
4:为啥定义成静态的那 ?
        因为Arrays是工具类,其方法是静态的方法,在静态方法中调用了new ArrayList();
        若ArrayList定义成非静态的,那创造Arraylist时候必须有外部类对象的存在,因为
        内部类的对象持有引用out.this 指向外部类对象,这也是为啥内部类可以直接访问外部类的原因,
        而静态方法时候,根本没有外部类的对象。所以会编译失败。所以定义成静态的内部类。这样就可以了 。
       


源码:
public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
   

    /**
     * @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;
        }
    }

作者: 探险家丶    时间: 2015-8-8 21:12
写的不错,赞一个。
作者: 薛瑞宾    时间: 2015-8-8 21:14
挺全,赞一个
作者: 3174918418    时间: 2015-8-8 21:29
顶一个, 看完我更明白了
作者: 飞飞小狮子    时间: 2015-8-8 21:31
探险家丶 发表于 2015-8-8 21:12
写的不错,赞一个。

还可以,一般般
作者: 飞飞小狮子    时间: 2015-8-8 21:34
3174918418 发表于 2015-8-8 21:29
顶一个, 看完我更明白了

就是自己的理解,写的不对的,多多批评指正,共同进步。
作者: 飞飞小狮子    时间: 2015-8-8 21:35
薛瑞宾 发表于 2015-8-8 21:14
挺全,赞一个

谢谢,希望可以交流观点。
作者: 薛瑞宾    时间: 2015-8-9 22:02
飞飞小狮子 发表于 2015-8-8 21:35
谢谢,希望可以交流观点。

恩恩,有啥问题互相交流




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