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);
        }
    }
}
相关推荐
Lee川15 小时前
优雅进化的JavaScript:从ES6+新特性看现代前端开发范式
javascript·面试
Lee川19 小时前
从异步迷雾到优雅流程:JavaScript异步编程与内存管理的现代化之旅
javascript·面试
晴殇i21 小时前
揭秘JavaScript中那些“不冒泡”的DOM事件
前端·javascript·面试
绝无仅有21 小时前
Redis过期删除与内存淘汰策略详解
后端·面试·架构
绝无仅有21 小时前
Redis大Key问题排查与解决方案全解析
后端·面试·架构
AAA梅狸猫1 天前
Looper.loop() 循环机制
面试
AAA梅狸猫1 天前
Handler基本概念
面试
Wect1 天前
浏览器缓存机制
前端·面试·浏览器
掘金安东尼1 天前
Fun with TypeScript Generics:玩转 TS 泛型
前端·javascript·面试
掘金安东尼1 天前
Next.js 企业级落地
前端·javascript·面试