ArrayList底层数据结构是数组,但数组长度是不可变的,那ArrayList是如何实现长度可变呢?通过反射就可以实现保留当前数组数据的同时动态地扩展数组。可以通过以下代码实现- public static Object goodArrayGrow(Object a){
- Class cl = a.getClass();
- if(!cl.isArray()) return null;
- Class componentType = cl.getComponentType();//获得数组中对象的类型
- int length = Array.getLength(a);//取得原有数组的长度
- int newLength = length*11/10+10;
- Object newArray = Array.newInstance(componentType, newLength);
- System.arraycopy(a, 0, newArray, 0, length);
- return newArray;
- }
复制代码 上面主要通过Array类的静态方法newInstance来获取新数组。对其必须提供两个参数,一个是数组的类型,一个是数组的长度。其中类型是通过Class类的getComponentType方法获得,长度要通过Array类的静态方法getLength获得.
|