zoukankan      html  css  js  c++  java
  • java基础---->数组的基础使用(二)

      这里对List(jdk 1.7)列表里面的一些方法做一些简单的分析,以避免有些函数的误用。手写瑶笺被雨淋,模糊点画费探寻,纵然灭却书中字,难灭情人一片心。

    List中注意的方法

    一、Arrays.asList(T...arrays)方法

    @Test
    public void listAsLists() {
        List<String> strings = Arrays.asList("huhx", "linux", "liuling");
        System.out.println(strings.size());
        strings.add("tomhu"); // 会报出异常
        System.out.println(strings);
    }

    这里面对于Arrays.asList返回的列表,对这个列表的修改、删除和添加操作都是不合法的,也就是抛出异常。首先我们看一下源码:

    @SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

      非常要注意的是这里面的ArrayList不是我们常用的java.util里面的ArrayList,它是Arrays里面的一个内部类。但是他和java.util包中的ArrayList一样是继承自AbstractList<E>类。

    private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable {
            private static final long serialVersionUID = -2764017481108945198L;
            private final E[] a;
    }

      对于这个生成的ArrayList,里面并没有重写父类的add、remove和set方法。所以我们上述调用add方法,实际会调用父类AbstractList的add方法。而对于这些操作列表的方法,AbstractList都是抛出UnsupportedOperationExceptionn异常的。代码如下:

    public E set(int index, E element) {
        throw new UnsupportedOperationException();
    }
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }
     public E remove(int index) {
        throw new UnsupportedOperationException();
    }

    对于正版的ArrayList,也就是java.util包下面的。由于它重写了这些操作方法,自然是不会抛出异常的。

    二、list转换数组方法toArray()

    @Test
    public void listAsArrays() {
        List<String> lists = new ArrayList<>();
        lists.add("linux");
        lists.add("huhx");
    
        // size = length
        String[] arrays = new String[lists.size()];
        String[] strings = lists.toArray(arrays);
        System.out.println(Arrays.toString(arrays) + Arrays.toString(strings));
    
        // size > length
        String[] arrays1 = new String[1];
        String[] strings1 = lists.toArray(arrays1);
        System.out.println(Arrays.toString(arrays1) + Arrays.toString(strings1));// size < length
    
        // size < length
        String[] arrays2 = new String[3];
        String[] strings2 = lists.toArray(arrays2);
        System.out.println(Arrays.toString(arrays2) + Arrays.toString(strings2));
    }

    程序输出的结果如下:

    [linux, huhx][linux, huhx]
    [null][linux, huhx]
    [linux, huhx, null][linux, huhx, null]

    我们看一下toArray的源码,这里面的ArrayList是java.util包中的那个。其实就是使用底层的数组复制。

    public <T> T[] toArray(T[] a) {
        if (a.length < size)
            // Make a new array of a's runtime type, but my contents:
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
        System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }

    友情链接

  • 相关阅读:
    ....
    CodeForces 375A(同余)
    POJ 2377 Bad Cowtractors (最小生成树)
    POJ 1258 AgriNet (最小生成树)
    HDU 1016 Prime Ring Problem(全排列)
    HDU 4460 Friend Chains(bfs)
    POJ 2236 Wireless Network(并查集)
    POJ 2100 Graveyard Design(尺取)
    POJ 2110 Mountain Walking(二分/bfs)
    CodeForces 1059B Forgery(模拟)
  • 原文地址:https://www.cnblogs.com/huhx/p/baseusejavaarray2.html
Copyright © 2011-2022 走看看