java基础 — 数组的基础使用

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);
}//需要获取资料的朋友请加Q君样:290194256*

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

private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable {
    
    
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;
}//需要获取资料的朋友请加Q君样:290194256*

对于这个生成的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();
}//需要获取资料的朋友请加Q君样:290194256*
 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));
}//需要获取资料的朋友请加Q君样:290194256*

程序输出的结果如下:

[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;
}//需要获取资料的朋友请加Q君样:290194256*

在这里插入图片描述
在这里插入图片描述
最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:290194256*

猜你喜欢

转载自blog.csdn.net/weixin_53341657/article/details/112912741