zoukankan      html  css  js  c++  java
  • C#动态数组ArrayList和List<T>的比较

    C#中一维动态数组(即列表)分ArrayList和List<T>两种,其容量可随着我们的需要自动进行扩充

    一、ArrayList类(少用)

      ArrayList位于System.Collections命名空间中,所以我们在使用时,需要导入此命名空间

      ArrayList里边的数据类型是object,它类似于向量,可以存储不同的数据类型在一个数组里边(转换为了object)

      下面是ArrayList的声明:

    ArrayList list = new ArrayList();     //声明一个ArrayList动态数组

      

    二、List<T>类

      List<T>位于System.Collections.Generic命名空间中,所以我们在使用时,需要导入此命名空间

      List<T>类是 ArrayList 类的泛型(类似于C++中的模板,但不完全相同)等效类并增强了功能,里边是具体的某种类型T,它类似于[]类型的数组,不同的是[]是定长的,而List<T>是长度可变的数组

      泛型的好处:它为使用c#语言编写面向对象程序增加了极大的效力和灵活性,不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换,所以性能得到提高

      在决定使用List<T>还是使用ArrayList类(两者具有类似的功能)时,记住List<T>类在大多数情况下执行得更好并且是类型安全的。如果对List<T>类的类型T使用引用类型,则两个类的行为是完全相同的。但是,如果对类型T使用值类型,则需要考虑实现和装箱问题,在.NET2.0以上List<T>可完全代替ArrayList,也就是说ArrayList已经被淘汰

       用微软的话讲:

        “添加到ArrayList中的任何引用或值类型都将隐式地向上强制转换为Object。如果项是值类型,则必须在将其添加到列表中时进行装箱操作,在检索时进行取消装箱操作。强制转换以及装箱和取消装箱操作都会降低性能;在必须对大型集合进行循环访问的情况下,装箱和取消装箱的影响非常明显。”

     

      1、List<T>的声明

      List<T> list = new List<T>();  

      T为动态数组中元素类型,现在以int类型作为例子

    List<int> list = new List<int>();    //声明一个元素是int类型的动态数组list

      2、List<T>的初始化

      List<T> list =new list<T> (IEnumerable<T> collection);

         以一个集合作为参数初始化List<>,T为动态数组中元素类型,现在以int类型作为例子

    int[] temArr = {1,2,3,4,5,6,7};    
    List<int> list = new List<int>(temArr); //用集合里的整数初始化元素是int类型的动态数组list

      3、List<T>的常用方法

     

        3.1 添加元素

        (1)结尾添加一个元素

    list.Add(8);   //将数字8添加到动态数组list结尾处

        (2)结尾添加一组元素

    int[] temArr = {8,9,10,11,12};
    list.AddRange(temArr);  //在动态数组list结尾添加temArr集合中的元素

        (3)在指定位置添加一个元素

    /*函数原型是Insert(int index,T item);*/
    list.Insert(1, 20);  //在动态数组list的第二个位置(下标为1)处插入20

        3.2 删除元素 

        (1)删除一个指定值

    list.Remove(20);   //删除动态数组list中的元素20

        (2)从指定位置删除一个元素    

    list.RemoveAt(1);  //删除动态数组list中下标为1的元素

        (3)从指定位置起删除多个元素

    /*函数原型RemoveRange(int index, int count);*/
    /*       从下标index开始,删除count个元素         */
    list.RemoveRange(1, 5);   //从下标1的元素开始连续删除5个元素

        3.3 遍历List<T>中元素 

    foreach (int m in list)
    {
        Console.WriteLine(m);    //遍历打印出动态数组list中的元素
    }    

         3.4 判断某个元素是否在该List<T>中(很实用)

    //判断20是否在动态数组list中,不在则加入
    if (list.Contains(20))
    {
        Console.WriteLine("There is 20 in the list");
    }
    else
    {
        list.Add(20);
        Console.WriteLine("Add 20 successfully.");
    }

        3.5 给List<T>里面元素排序

    list.Sort();    //对动态数组list中的元素按从小到大(升序)排序
    list. Reverse();  //把动态数组list里面元素顺序反转

        3.6 清空List<T>里面的元素

    list.Clear();

        3.7 获得List<T>中元素个数

    //输出动态数组list中的元素个数
    int count = list.Count();
    Console.WriteLine("The num of elements in the list: "+count);
  • 相关阅读:
    @RequestParam注解使用:Name for argument type [java.lang.String] not available, and parameter name information not found in class file either.
    cglib动态代理导致注解丢失问题及如何修改注解允许被继承
    springboot Autowired BeanNotOfRequiredTypeException
    git根据用户过滤提交记录
    不同包下,相同数据结构的两个类进行转换
    How to use Jackson to deserialise an array of objects
    jooq实践
    java如何寻找main函数对应的类
    Python--matplotlib
    Python 和 Scikit-Learn
  • 原文地址:https://www.cnblogs.com/eniac12/p/4394984.html
Copyright © 2011-2022 走看看