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);
        }
    }
}
相关推荐
a努力。5 分钟前
国家电网Java面试被问:最小生成树的Kruskal和Prim算法
java·后端·算法·postgresql·面试·linq
NAGNIP41 分钟前
一文搞懂机器学习中的学习理论!
算法·面试
CCPC不拿奖不改名2 小时前
数据处理与分析:数据可视化的面试习题
开发语言·python·信息可视化·面试·职场和发展
柒.梧.2 小时前
SSM常见核心面试问题深度解析
java·spring·面试·职场和发展·mybatis
xiaowu0804 小时前
C#调用 C++ DLL 加载地址方式选择
开发语言·c++·c#
ssshooter4 小时前
复古话题:Vue2 的空格间距切换到 Vite 后消失了
前端·vue.js·面试
UrbanJazzerati5 小时前
Python自动化统计工具实战:Python批量分析Salesforce DML操作与错误处理
后端·面试
Q741_1477 小时前
海致星图招聘 数据库内核研发实习生 一轮笔试 总结复盘(1) 作答语言:C/C++ 链表 二叉树
开发语言·c++·经验分享·面试·笔试
Chan167 小时前
微服务 - Higress网关
java·spring boot·微服务·云原生·面试·架构·intellij-idea
码农学院8 小时前
使用腾讯翻译文本
服务器·数据库·c#