1 数组的使用
声明数组:就是告诉计算机数组的类型是什么。有两种形式:int[] array、int array[]。
分配空间:告诉计算机需要给该数组分配多少连续的空间,记住是连续的。array = new int[10];
赋值:赋值就是在已经分配的空间里面放入数据。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 数组底层
数组底层:普通的java类是以全限定路径名+类名来作为自己的唯一标示的,而数组则是以若干个[+L+数组元素类全限定路径+类来最为唯一标示的。
这个不同也许在某种程度上说明了数组也普通java类在实现上存在很大的区别,也许可以利用这个区别来使得JVM在处理数组和普通java类时作出区分。
Object[]: class [Ljava.lang.Object; (一维数组)
Object: class java.lang.Object; (普通类)
3 数组性能
一组数据进行求和运算,可将这些数据放到一个数组中,遍历加和,也可将这些数据放到一个list中,遍历求和,数组的性能显而易见。
4 数组长度问题
数组是定长的,一旦初始化声明后是不可改变长度的。那么如何来实现变长数组呢?我们可以利用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中,它主要提供了如下几个方法:
1、size:元素数量
2、toArray:转换为数组,实现了数组的浅拷贝。
3、get:获得指定元素。
4、contains:是否包含某元素。
所以综上所述,asList返回的是一个长度不可变的列表。数组是多长,转换成的列表是多长,我们是无法通过add、remove来增加或者减少其长度的。
原文:https://www.cnblogs.com/sgyg/p/10677044.html