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);
        }
    }
}
相关推荐
胡清波1 小时前
# vue 的 Diff 算法
前端·面试
Jackson_Mseven1 小时前
面试官:useEffect 为什么总背刺?我:闭包、ref 和依赖数组的三角恋
前端·react.js·面试
Accpdaiyekun2 小时前
C# 操作mongodb 多次查询快还是使用管道查询速度快
mongodb·c#·lua
绝无仅有2 小时前
对接三方SDK开发过程中的问题排查与解决
后端·面试·架构
Dm_dotnet2 小时前
C#:wpf ui 4.0 是如何实现页面导航的?
c#
圆滚滚肉肉4 小时前
后端MVC(控制器与动作方法的关系)
后端·c#·asp.net·mvc
前端小巷子4 小时前
跨域问题解决方案:开发代理
前端·javascript·面试
天涯学馆4 小时前
JavaScript 跨域、事件循环、性能优化面试题解析教程
前端·javascript·面试
晴殇i4 小时前
CSS 迎来重大升级:Chrome 137 支持 if () 条件函数,样式逻辑从此更灵活
前端·css·面试
Java技术小馆4 小时前
POST为什么发送两次请求
java·面试·架构