1. 复制数组有关
1.1 使用 copyOf() 方法对数组进行复制
Arrays.copyOf(dataType[] srcArray,int length);
默认从原数组的第一个元素(索引值为 0)开始复制,目标数组的长度将为 length。如果 length 大于 srcArray.length,则目标数组中采用默认值填充;如果 length 小于 srcArray.length,则复制到第 length 个元素(索引值为 length-1)即止。
1.2 使用 CopyOfRange() 方法对数组进行复制
将指定数组的指定范围复制到新数组中。 范围( from )的初始指数必须在零和original.length之间,包括在内。 original[from]的值被放置在副本的初始元素中(除非from == original.length或from == to )。 原始数组中后续元素的值将被放置在副本中的后续元素中。 范围( to )的最终指数( to )必须大于或等于from ,可能大于original.length ,在这种情况下, false被放置在索引大于或等于original.length - from的副本的所有元素中。 返回的数组的长度将为to - from
Arrays.copyOfRange(dataType[] srcArray,int startIndex,int endIndex)
-
startIndex 表示开始复制的起始索引,目标数组中将包含起始索引对应的元素,另外,startIndex 必须在 0 到 srcArray.length 之间。
-
endIndex 表示终止索引,目标数组中将不包含终止索引对应的元素,endIndex 必须大于等于 startIndex,可以大于 srcArray.length,如果大于 srcArray.length,则目标数组中使用默认值填充
2. 和初始化有关
二维数组的初始化
2.1 静态初始化
int intArray[ ][ ]={{1,2},{2,3},{3,4,5}};
Java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同
2.2 动态初始化
- 直接为每一维分配空间,格式如下:
int a[ ][ ] = new int[2][3]
- 从最高维开始,分别为每一维分配空间:
int a[ ][ ] = new int[2][ ];
a[0] = new int[3];
a[1] = new int[5]
对二维复合数据类型的数组,必须首先为最高维分配引用空间,然后再顺次为低维分配空间。而且,必须为每个数组元素单独分配空间
3. 和转换有关的
//以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组
public Object[] toArray()
//以正确的顺序返回一个包含此列表中所有元素的数组(从第一个到最后一个元素); 返回的数组的运行时类型是指定数组的运行时类型。 如果列表适合指定的数组,则返回其中。 否则,将为指定数组的运行时类型和此列表的大小分配一个新数组
public <T> T[] toArray(T[] a)
3.1 list转数组
一维数组
ArrayList<String> list=new ArrayList<String>();
list.toArray(new String[list.size()]);
二维数组
List<int[]> answer = new ArrayList<>();
(int[][])answer.toArray(new int[answer.size()][]);
3.2 数组转list
String[] s = {"a","b","c"};
List list = java.util.Arrays.asList(s);
这里需要注意,它不支持引用数据类型,使用基本类型数组作为参数会把整个数组当成一个值
int[] nums = new int[2];
List<int[]> ints = Arrays.asList(nums);//看这里的返回值是数组类型的List
这点可以看一下源码
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
首先接收的参数课变长参数,参数类型T
,根据官方文档的描述,T
是数组元素的 class
,因此,这个错误产生的原因可解释为:asList 方法的参数必须是对象或者对象数组,而原生数据类型不是对象。当传入一个原生数据类型数组时,asList 的真正得到的参数就不是数组中的元素,而是数组对象本身!此时List 的唯一元素就是这个数组。
再看return new ArrayList<>(a);
这个方法,起初我以为就是new了一个ArrayList,结果再往下看,这个ArrayList是Arrays的一个内部类
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) {
a = Objects.requireNonNull(array);
}
@Override
public int size() {
return a.length;
}
//...
}
这个内部类中有一个被声明为 final 的数组 a ,所有传入的元素都会被保存在这个数组 a 中,所以扩容操作是不允许的,这也解释了为什么向 myList 添加新元素是不被允许的,从 myList 中删除元素,也会抛出异常java.lang.UnsupportedOperationException
那我们怎么创建一个符合我们要求的能扩容的List呢
public class Test {
public static void main(String[] args) {
String[] myArray = { "Apple", "Banana", "Orange" };
List<String> myList = new ArrayList<String>(Arrays.asList(myArray));
myList.add("Guava");
}
}