泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用。例如,我们并不希望为聚集String和File对象分别设计不同的类。下面来解释一下泛型数组ArrayList(泛型数组来解释一下这个原理):
java没有增加泛型类之前:
在java增加泛型类之前,泛型设计是通过继承实现的。ArrayList类只维护一个Object引用的数组:
public class ArrayList{
private Object[] elementData;
...
public Object get(int i ){...}
public void add(Object o){...}
}
那么问题来了,ArrayList的get和set方法必须进行类型转换,例如:
ArrayList arr = new ArrayList();
String name = (String)arr.get(0);
而且可能出现错误:
arr.add(new File("..."))
上述代码编译和运行都不会报错,然而如果我们把它get取出来之后强制转化为String类型,就会产生一个运行时出错误。
增加泛型类之后:
声明数组:
ArrayList<Integer> arr = new ArrayList<>();
这样他维护的实力类型就确定了,都是Integer类型。
ArrayList的一大优点是,他的大小可变,当他的存储空间不能在存储新的数据时,他会自动创建一个新的更大的数组,把当前数组的值拷贝过去,原来的比较小的空间就等待GC回收空间了。
ArrayList的一些方法:
ArrayList<E>() //都遭一个空数组列表
ArrayList<E>(int initialCapacity) //指定数组长度
void ensureCapacity(int capacity) //查看是够有足够的空间
void trimToSize() //将数组列表的存储容量消减到当前尺寸