java.util.Arrays提供大量的工具方法来操作数组,这些方法全是静态方法。
1 便捷创建List
public static <T> List<T> asList(T... a)
返回一个受指定数组支持的固定大小的列表。
public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
典型用法:List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
2 二分查找
有多个重载的方法。比如,
public static int binarySearch(long[] a,long key)
public static int binarySearch(Object[] a, int fromIndex, int toIndex, Object key)
public static <T> int binarySearch(T[] a,int fromIndex,int toIndex,T key,Comparator<? super T> c)
二分查找要求数组是有序的,并且数组中的元素是可以比较大小的。
3 复制数组
有多个重载的版本。
(1)public static <T> T[] copyOf(T[] original, int newLength)
复制指定的数组,截取或用 null 填充(如有必要),以使副本具有指定的长度。这个方法会把original数组复制成一个新数组,其中length是新数组的长度。如果length小于original数组的长度,则新数组就是原数组的前面length个元素,如果length大于original数组的长度,则新数组就是原数组的所有元素,后面补充0,false或者null。
(2)public static <T> T[] copyOfRange(T[] original, int from, int to)
与上面的方法类似,只是这个方法只复制original数组的from索引到to索引的元素。
System.arraycopy方法
System类的arraycopy方法签名如下:
public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
Arrays类中所有复制数组的方法底层都是调用System.arraycopy方法,这是一个本地静态方法。对于基本类型数组,该方法实现了深复制;然而对于对象数组而言,System.arraycopy方法只是浅复制。也就是说这个方法只是将原来的数组对象本身复制一份,并没有将该数组中各个数据元素所指向的对象复制一份。也就是说,新的数组中的各个数组元素仍然和原数组中的各个元素指向的是同一个对象。这样的话就会产生一个问题:修改新数组中的某个数组元素所指向的对象的属性的话,那么以前的那个数组对应的数组元素的对象也被修改了。
看例子:
import java.util.Arrays; class Student { private static int count = 1000; private int id = count++; private String name = "No." + id; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student [>; } } public class ArraycopyTest { public static void main(String[] args) { Student[] old = new Student[] { new Student(), new Student(), new Student(), }; Student[] fresh = new Student[5]; System.arraycopy(old, 0, fresh, 0, old.length); System.out.println(" old:" + Arrays.toString(old)); System.out.println("fresh:" + Arrays.toString(fresh)); fresh[2].setName("Obama"); fresh[2].setId(9999); System.out.println(" old:" + Arrays.toString(old)); System.out.println("fresh:" + Arrays.toString(fresh)); } }