泛型List与ArrayList的比较

在讲之前我们先看一下ArrayList的应用:  

ArrayList 是一个使用起来非常方便的集合类,无需进行修改即可用来存储任何引用或值类型。 如:

        ArrayList list1 = new ArrayList();
        list1.Add(1);
        list1.Add(2);

        ArrayList list2 = new ArrayList();
        list2.Add("1");
        list2.Add("2");

问题1: 
  这种方便是需要付出代价的。添加到 ArrayList 中的任何引用或值类型都将隐式地向上强制转换为 Object。如果项是值类型,则必须在将其添加到列表中时进行装箱操作,在检索时进行取消装箱操作。强制转换以及装箱和取消装箱操作都会降低性能;在必须对大型集合进行循环访问的情况下,装箱和取消装箱的影响非常明显。

问题2:

  另一个限制是缺少编译时类型检查;因为 ArrayList 将把所有项都强制转换为 Object,所以在编译时无法防止客户端代码执行以下操作:

        ArrayList list1 = new ArrayList();
        list1.Add(1);
        list1.Add("hehe");

        int result = 0;
        for (int i = 0; i < list1.Count; i++)
        {
            result +=int.Parse(list1[i].ToString());
        }

尽管将字符串和 int组合在一个 ArrayList 中的做法在创建异类集合时是完全合法的,有时是有意图的,但这种做法更可能产生编程错误,并且直到运行时才能检测到此错误。

解决方法:

而泛型很好的解决了这两个问题;:

        List<int> listInt = new List<int>();
        listInt.Add(1);
        listInt.Add(2);

        List<string> listStr = new List<string>();
        listStr.Add("str1");
        listStr.Add("str2");

泛型明确的定义了存储的类型;特别适用于列表项是值类型的情况

发布了88 篇原创文章 · 获赞 16 · 访问量 30万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章