轉載請註明出處
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);
}
}