1 数组的使用 java
声明数组:就是告诉计算机数组的类型是什么。有两种形式:int[] array、int array[]。数组
分配空间:告诉计算机须要给该数组分配多少连续的空间,记住是连续的。array = new int[10];dom
赋值:赋值就是在已经分配的空间里面放入数据。array[0] = 1 、array[1] = 2……其实分配空间和赋值是一块儿进行的,也就是完成数组的初始化。有以下三种形式:工具
int a[] = new int[2]; //默认为0,若是是引用数据类型就为null
int b[] = new int[] {1,2,3,4,5};
int c[] = {1,2,3,4,5};
操做:就是对数组元素进行操做。经过数组名+有效的下标来确认数据。性能
2 数组底层spa
数组底层:普通的java类是以全限定路径名+类名来做为本身的惟一标示的,而数组则是以若干个[+L+数组元素类全限定路径+类来最为惟一标示的。
这个不一样也许在某种程度上说明了数组也普通java类在实现上存在很大的区别,也许能够利用这个区别来使得JVM在处理数组和普通java类时做出区分。
Object[]: class [Ljava.lang.Object; (一维数组)
Object: class java.lang.Object; (普通类)code
3 数组性能对象
一组数据进行求和运算,可将这些数据放到一个数组中,遍历加和,也可将这些数据放到一个list中,遍历求和,数组的性能显而易见。blog
4 数组长度问题ci
数组是定长的,一旦初始化声明后是不可改变长度的。那么如何来实现变长数组呢?咱们能够利用List集合add方法里面的扩容思路来模拟实现。下面是ArrayList的扩容方法:
1 public void ensureCapacity(int minCapacity) { 2 modCount++; 3 int oldCapacity = elementData.length; 4 /** 5 * 若当前须要的长度超过数组长度时进行扩容处理 6 */ 7 if (minCapacity > oldCapacity) { 8 Object oldData[] = elementData; 9 int newCapacity = (oldCapacity * 3) / 2 + 1; //扩容 10 if (newCapacity < minCapacity) 11 newCapacity = minCapacity; 12 //拷贝数组,生成新的数组 13 elementData = Arrays.copyOf(elementData, newCapacity); 14 } 15 }
5 数组转化为list须要注意的地方
asList() 方法是Arrays的静态方法,能够将数组转化为List
public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}
注意这个参数:T…a,这个参数是一个泛型的变长参数,咱们知道基本数据类型是不可能泛型化的,也是就说8个基本数据类型是不可做为泛型参数的。
可是若是将基本类型的数组转换为List也是不会报错的。由于,在传入参数的时候,是数组,数组在java 中会被当作对象,而对象是能够泛型的。
因此咱们的程序是把一个int型的数组做为了T的类型,因此在转换以后List中就只会存在一个类型为int数组的元素了。固然若是将int改成Integer,则长度就会变成5了。
当数组装换成List 时,这个list 并非java.util.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) {
if (array==null)
throw new NullPointerException();
a = array;
}
/** 省略方法 **/
}
这个内部类ArrayList并无提升add的实现方法。在ArrayList中,它主要提供了以下几个方法:
一、size:元素数量
二、toArray:转换为数组,实现了数组的浅拷贝。
三、get:得到指定元素。
四、contains:是否包含某元素。
因此综上所述,asList返回的是一个长度不可变的列表。数组是多长,转换成的列表是多长,咱们是没法经过add、remove来增长或者减小其长度的。