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);
        }
    }
}
相关推荐
周杰伦fans21 分钟前
[特殊字符] 代理模式超详细讲解 ——.NET
数据库·c#·代理模式
用户8356290780511 小时前
C# 高效生成 Word 表格:复杂表格创建实战指南
后端·c#
屠夫1 小时前
C# LINQ
c#
纵有疾風起1 小时前
C++——多态
开发语言·c++·经验分享·面试·开源
ANYOLY2 小时前
Redis 面试题库
java·redis·面试
顾林海2 小时前
从0到1搭建Android网络框架:别再让你的请求在"路上迷路"了
android·面试·架构
拉不动的猪2 小时前
前端三大权限场景全解析:设计、实现、存储与企业级实践
前端·javascript·面试
光头闪亮亮3 小时前
电子发票解析工具-c#桌面应用开发-DataGridView表格控件使用详解
c#
uhakadotcom4 小时前
Loguru 全面教程:常用 API 串联与实战指南
后端·面试·github
周杰伦fans4 小时前
C# 中的 `Hashtable`
开发语言·c#