Arrays的一点了解
在手册中我们可以看到该类继承自Object类
此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。
除非特别注明,否则如果指定数组引用为 null,则此类中的方法都会抛出 NullPointerException。
1 asList
//asList int[] is={8,3,49,83,9,4}; int[] iss={8,3,49,83,9,4}; List<int[]> list= Arrays.asList(is); // list.add(iss); 这句会报 java.lang.UnsupportedOperationException System.out.println(list.size()); // list.size()=1
why?什么这个list不能够通过有add的方法添加呢,我们可以看一下Arrays这个类的源码
public static <T> List<T> asList(T... a) { return new ArrayList<>(a); //这里我们可以看到返回的是一个ArrayList但是这个Arraylist是Arrays的一个静态内部类 } //如下所示,便是Arrays中的Arraylist 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) { if (array==null) throw new NullPointerException(); a = array; } public int size() { return a.length; } public Object[] toArray() { return a.clone(); } public <T> T[] toArray(T[] a) { int size = size(); if (a.length < size) return Arrays.copyOf(this.a, size, (Class<? extends T[]>) a.getClass()); System.arraycopy(this.a, 0, a, 0, size); if (a.length > size) a[size] = null; return a; } public E get(int index) { return a[index]; } public E set(int index, E element) { E oldValue = a[index]; a[index] = element; return oldValue; } public int indexOf(Object o) { if (o==null) { for (int i=0; i<a.length; i++) if (a[i]==null) return i; } else { for (int i=0; i<a.length; i++) if (o.equals(a[i])) return i; } return -1; } public boolean contains(Object o) { return indexOf(o) != -1; } }
我们可以看到,这个类其实根本就不是我们平常见的那个ArrayList类,也没有add这个方法,自然就不能用add这个方法添加元素了,不但没有add这个方法,好多其他的ArrayList该有的方法也都没有,所以对于Arrays.adList()这个方法返回的这个List我们要小心喽
2 equals
//equals 数组内元素顺序要一致才返回true boolean[] a={true,false}; boolean[] b={true,false}; boolean[] c={false,true}; boolean[] d={}; boolean[] e={}; System.out.println(Arrays.equals(c, b)); //false System.out.println(Arrays.equals(a, b)); //true System.out.println(Arrays.equals(d, e)); //true
3 copyOf( )\copyOfRange() 这2个方法时调用 System.arraycopy()实现的,实现的事件略有差异
int[] is2=Arrays.copyOf(is, 20); for(int i=0;i<is2.length;i++){ System.out.print(" "+is2[i]); } System.out.println(); //换下行
4 fill() 通过该遍历数组并赋值来实现的,通过参数不同实现不同效果
//fill() int[] is4=new int[4]; Arrays.fill(is4, 4); //is4的值全为4 int[] is5=new int[4]; Arrays.fill(is5, 1, 2, 4); //is5[1]=4
5 sort()
//sort 排序 对不同的类型都可以排序 主要就是升序
Arrays.sort(is); for(int i=0;i<is.length;i++){ System.out.print(" "+is[i]); } System.out.println(); //换下行
6 hashCode() 直接返回一个基于数组内容的哈希码
System.out.println("hashCode()="+Arrays.hashCode(is));
先来看一眼源码,在jdk1.5以后这里为我们提供了一种返回哈希码的方式,如下即可,各个类型略有不同,推荐大家看下源码了解一下
public static int hashCode(int a[]) { if (a == null) return 0; int result = 1; for (int element : a) result = 31 * result + element; return result; }
7 toString() 就是个普通的toString() (Ps:皮这一下很开心的)
//7 toString System.out.println(Arrays.toString(is));