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;
    }

    友情链接

  • 相关阅读:
    【hibernate】自定义转换器
    【hibernate】存储图片
    【hibernate】映射可嵌入式组件
    【hibernate】应用程序级别的视图
    adb shell模拟点击事件(input tap)
    Android UIAutomator 定位
    adb devices连接不上设备
    获取元素属性get_attribute
    wait_activity
    webview定位 & native和webview切换
  • 原文地址:https://www.cnblogs.com/huhx/p/baseusejavaarray2.html
Copyright © 2011-2022 走看看