C#面试常考随笔6:ArrayList和 List的主要区别?

在 C# 中,ArrayListList<T>(泛型列表)都可用于存储一组对象。推荐优先使用List<T>,因为它具有更好的类型安全性、性能和语法简洁性,并且提供了更丰富的功能。只有在需要与旧代码兼容或存储不同类型对象的特殊情况下,才考虑使用ArrayList

1. 类型安全性

  • ArrayList :它是一个非泛型集合,可以存储任意类型的对象。这意味着在ArrayList中可以混合存储不同类型的数据,例如整数、字符串、自定义对象等。但这种灵活性会带来类型安全问题,因为在从ArrayList中获取元素时,需要进行显式的类型转换,如果类型转换不正确,会在运行时抛出InvalidCastException异常。
cs 复制代码
using System;
using System.Collections;

class Program
{
    static void Main()
    {
        ArrayList arrayList = new ArrayList();
        arrayList.Add(1);
        arrayList.Add("hello");

        // 需要显式类型转换
        int num = (int)arrayList[0]; 
        string str = (string)arrayList[1]; 
    }
}
  • List<T>:是泛型集合,在创建时需要指定存储元素的类型。这保证了集合中只能存储指定类型的对象,编译器会在编译时进行类型检查,避免了运行时的类型转换错误,提高了代码的类型安全性。
cs 复制代码
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> intList = new List<int>();
        intList.Add(1);
        // 下面这行代码会在编译时出错,因为不能将字符串添加到整数列表中
        // intList.Add("hello"); 

        int num = intList[0]; 
    }
}

2. 性能

  • ArrayList :由于它可以存储任意类型的对象,实际存储的是对象的引用,在添加值类型(如intdouble等)时,会发生装箱操作(将值类型转换为引用类型);在获取值类型元素时,又会发生拆箱操作。装箱和拆箱会带来一定的性能开销,并且会占用更多的内存。
  • List<T> :对于值类型,List<T>直接存储值,避免了装箱和拆箱操作,因此在处理值类型时性能更好。对于引用类型,虽然List<T>ArrayList都存储引用,但List<T>由于不需要进行类型检查和转换,性能也相对较高。

3. 语法简洁性

  • ArrayList:由于需要显式的类型转换,代码会变得冗长且容易出错,尤其是在频繁操作集合元素时。
  • List<T>:不需要进行显式的类型转换,代码更加简洁易读,提高了开发效率。

4. 功能特性

  • ArrayList:是早期版本的集合类,提供的功能相对基础,并且缺乏一些泛型集合所具有的高级特性。
  • List<T> :作为泛型集合,提供了更多的扩展方法和功能,例如可以使用LINQ(Language Integrated Query)进行数据查询和操作,这使得数据处理更加方便和高效。
cs 复制代码
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        List<int> intList = new List<int> { 1, 2, 3, 4, 5 };
        // 使用 LINQ 查询偶数
        var evenNumbers = intList.Where(n => n % 2 == 0); 
        foreach (var num in evenNumbers)
        {
            Console.WriteLine(num);
        }
    }
}
相关推荐
月之圣痕2 小时前
c#清理释放内存
c#
wt_cs2 小时前
身份认证C#集成方案-数字时代身份证实名认证利器
开发语言·c#
JiangJiang3 小时前
🧠 useMemo + memo + useContext 性能优化实战:从无感重渲染到丝滑体验
前端·react.js·面试
啊吧啊吧曾小白3 小时前
作用域、闭包与this指向问题
前端·javascript·面试
幼儿园园霸柒柒3 小时前
第七章:7.2求方程a*x*x+b*x+c=0的根,用3个函数,分别求当:b*b-4*a*c大于0、等于0和小于0时的根并输出结果。从主函数输入a、b、c的值
c语言·开发语言·算法·c#
周星星日记4 小时前
12.vue3中组件实现原理(下)之emit和slots
前端·vue.js·面试
zayyo4 小时前
JavaScript的对象访问器
前端·javascript·面试
夜寒花碎4 小时前
自定义迭代器和生成器
前端·javascript·面试
周星星日记4 小时前
11.vue3中组件实现原理(中)
前端·vue.js·面试
_一条咸鱼_5 小时前
深入剖析 Vue 过滤器模块(十三)
前端·javascript·面试