转载请注明出处
http://blog.csdn.net/pony_maggie/article/details/44786233
ArrayList很好用,可以添加任意类型,动态增长,各种库函数支持,如下是个简单示例:
public class FillingList {
/**
* @param args
* fill只会对已经存在空间填充,所以下面的for循环必不可少
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
List<String> list = new ArrayList<String>();
for (int i = 0; i < 10; i++)
{
list.add("");
}
Collections.fill(list, "hello");
System.out.println(list);
}
}
它存在一个问题,就是不知道add进来的类型
。因为add方法本身接受的是Object类型,当我们取出来列表中的内容使用时,需要强制转换实际的类型,如下所示:
public static void main(String[] args)
{
ArrayList cats = new ArrayList();
for(int i = 0; i < 7; i++)
{
cats.add(new Cat(i));
}
for(int i = 0; i < 7; i++)
{
((Cat)cats.get(i)).print();
}
如果程序员忘记了原来add进来的类型,然后在get的时候,转换成错误的实际类型了,就像下面这样,会怎样呢?
public class CatsAndDogs
{
/**
* @param args
*/
public static void main(String[] args)
{
ArrayList cats = new ArrayList();
for(int i = 0; i < 7; i++)
{
cats.add(new Cat(i));
}
cats.add(new Dog(7));
for(int i = 0; i < 7; i++)
{
((Cat)cats.get(i)).print();
}
for(int i = 0; i < cats.size(); i++)
{
((Cat)cats.get(i)).print();
}
//dog is detected at run time
}
}
答案是编译没有问题,运行时才会报错。这样就会有很大的风险。
所以需要对ArrayList进行封装
public class AutoArrayList extends ArrayList{
private Class itemClass;
public AutoArrayList(Class itemClass){
this.itemClass = itemClass;
}
public Object get(int index){
try{
while(index>=size()){
add(itemClass.newInstance());
}
}catch(Exception e){
e.printStackTrace();
}
return super.get(index);
}
}