C#基础知识-数组_ArrayList_List(九)
之前两篇文档讲述了C#中的面向对象的概念,其实这个概念对于很多种语言都是通用的,只不过每种语言具体实现的过程方法不一样,比如Java、C++、python等,这些都是很流行的面向对象的语言在编程语言排行榜中都是属于前几名的。面向对象中比较难以理解的就是多态的概念,多态我将留到后面的章节去讲,现在继续先学习好基本的一些语法理解好语意才能更好的理解。
数组
数组顾名思义就是一组同类数据元素的集合,数组不单单是数字的集合,可以是多种类型的,但是集合中元素必须是同一种数据类型,那么什么是同类数据的元素呢?在第一篇中有介绍C#中15中最常用的数据类型(类型还可以自己扩展),每种类型有最大值最小值,每一个值就相当于是一个元素了,打个比如int类型的数组那就只可以存储int的类型的元素,如果在int类型中存储string类型,那么编译器或报错,数组在C#中是最早出现的,在内存中是连续存储的,所以它的索引速度非常快,下面来看一下如果声明一个数组。
这里使用int类型:
//创建一个大小为3的数组
int[] intArray = new int[];
//赋值
intArray[] = ;
intArray[] = ;
intArray[] = ;
//修改
intArray[]=;
但是在数组中存在一些不足的地方,比如在数组的两个数据之间插入数据是很麻烦,在插入数组后面的所有元素都要往后退一位,而且在声明数组的时候必须指定数组的长度,数组的长度过长,会造成内存的浪费,过长也会造成数据溢出的错误,针对数组的这些缺点,又推出了ArrayList对象来克服这些缺点。
ArrayList
在命名空间System.Collection中,ArrayLis存储的对象元素是动态去分配的,根据需求去进行相应的扩容和收缩空间,所以在声明ArrayLis对象时并不需要去指定它的长度。
//声明一个ArrayList对象
ArrayList arrayList = new ArrayList(); //新增数据
arrayList.Add();
arrayList.Add("Leon"); //修改数据
arrayList[] = ; //删除
arrayList.Remove(); //插入数据
arrayList.Insert(, );
从上面的例子中ArrayList好像是解决上面数组遗留下来的问题,当时当你实际编译的时候就会遇到异常了,如果有在编译器上实习输入代码编译的同学会发现,arrayList.Add( )这个方法接受的是一个object的类型,那么当我在arrayList[0],这个位置赋值的时候就会出现一个装箱拆箱所带来的性能损耗,而且在我第二次使用Add时插入的是一个string类型的变量,那么同一个数组中出现两种不一样的数据类型,并且在编译的时候是正常的,所以在编译时不能检查类型,在运行中就会出现错误。装箱拆箱实际上就是object类型和其它类型之间的数据转换所带来的性能损耗,具体过程可以在网上查下资料。
泛型List
因为ArrayList存在不安全类型与装箱拆箱的缺点,所以后面微软又推出了泛型,List类和ArrayList类的用法相似,但是最关键的地方在于 List声明集合的时候必须要指定数据对象的类型。
//声明List集合对象
List<string> listString = new List<string>(); //增加
listString.Add("leon"); //修改
listString[] = "newLeon"; //删除数据
listString.RemoveAt();
这里可以看到,List和ArrayList的用法差不多,区别就在于List在声明的时候必须要指定数据对象的类型,这样如果尝试在listString中插入int类型的值编译器就会报错,在编译时就可以避免一个类型安全的问题,和装箱拆箱带来的性能损耗。
小结:
数组的存储容量是固定的,每次只能对一个值去进行操作,而且在两个值之间插入一个元素的话很麻烦,不方便操作。
ArrayList中虽然定义好的一套方法可以很方便的去操作数组,很好的删除、插入元素,但是由于装箱拆箱的过程会浪费很多资源,而且编译时没有提供一个安全类型的检查,使得在一个有int类型的数组中允许插入其它类型的,比如string,这样虽然在编译时不会报错,但是在运行时会发生异常。
泛型List,泛型int类型是强类型,在编译时会检查类型,并且减少装箱拆箱带来的损耗。
这里注意数组可以是多维度的但是,ArrayList和List始终只具有一个维度。
C#基础知识-数组_ArrayList_List(九)的更多相关文章
- C语言基础知识-数组和字符串
C语言基础知识-数组和字符串 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组概述 在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来的方式我们称为数组 ...
- [C# 基础知识系列]专题九: 深入理解泛型可变性
引言: 在C# 2.0中泛型并不支持可变性的(可变性指的就是协变性和逆变性),我们知道在面向对象的继承中就具有可变性,当方法声明返回类型为Stream,我们可以在实现中返回一个FileStream的类 ...
- java 基础知识-数组的7种算法(排序、求和、最值、遍历...)
遍历 遍历就是把这个数组的每个元素 显示出来 遍历的方法就是先定义这个数组的大小,然后用FOR循环来完成数组,例如 double[] score = new double[5]; Scanner in ...
- javascript基础知识-数组
1.javascript创建数组时无需声明数组大小或者在数组大小变化时重新分配 2.javascript数组是无类型的 3.数组元素不一定要连续 4.针对稀疏数组,length比所有元素的索引都要大 ...
- Java基础知识学习(九)
GUI开发 先前用Java编写GUI程序,是使用抽象窗口工具包AWT(Abstract Window Toolkit).现在多用Swing.Swing可以看作是AWT的改良版,而不是代替AWT,是对A ...
- java基础知识—数组
1.数组:是一个变量,存储相同数据类型的一组数据. 2.数据的优点:减少代码量.易查找. 3.数组的使用步骤: 1)声明数组:int scores []: 2)开辟空间:scores = new in ...
- PHP 基础知识-数组
PHP 的数组主要分为: 索引数组 - 带有数字索引的数组 关联数组 - 带有指定键的数组 多维数组 - 包含一个或多个数组的数组 索引数组: 有两种创建索引数组的方法: 索引是自动分配的(索 ...
- javaScript 基础知识汇总(九)
1.Rest 参数 与 Spread 操作符 当我们在代码中遇到“..."时,它不是Rest参数就是Spread操作符 区分方法: 若...出现在函数的参数列表,那它表示的就是Rest参数, ...
- JAVA基础知识总结:九
二.面向对象特性之继承 1.什么是继承? 如果两个或者两个以上的类具有相同的属性和方法,我们可以抽取一个类出来,在抽取出来的类中声明各个类中公共的部分 被抽取出来的类-------父类,基类,超类 两 ...
随机推荐
- Postman接口测试之POST、GET请求方法
一.基础知识 1.HTTP的五种请求方法:GET, POST ,HEAD,OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法. GET请求:请求指定的页面信息,并返回实体 ...
- Java FileInputStream与FileReader的区别
在解释Java中FileInputStream和FileReader的具体区别之前,我想讲述一下Java中InputStream和Reader的根本差异,以及分别什么时候使用InputStream和R ...
- php中的各种header整理
<?php header('HTTP/1.1 200 OK'); // ok 正常访问 header('HTTP/1.1 404 Not Found'); //通知浏览器 页面不存在 heade ...
- centos虚拟机设置静态ip
1.虚拟机网络配置设置为桥接模式 2.设置配置文件: vi /etc/sysconfig/network-scripts/ifcfg-ens33 DEVICE=ens33 HWADDR=:0c::c3 ...
- Hibernate学习笔记(三)—— Hibernate的事务控制
Hibernate是对JDBC的轻量级封装,其主要功能是操作数据库.在操作数据库过程中,经常会遇到事务处理的问题,接下来就来介绍Hibernate中的事务管理. 在学习Hibernate中的事务处理之 ...
- 本地安全策略命令行secedit设置本地账户安全策略
我们日常运行的控制台程序secpol.msc里面的内容,实质可以通过命令行完成,下面演示通过secedit命令来设置本地账号密码策略,启用密码复杂性和强制长度至少8位操作办法. ==> 新建文本 ...
- springboot(一):入门
什么是springboot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不 ...
- [转] Java @interface 自定义注解
[From] http://blog.csdn.net/afterlife_qiye/article/details/53748973 1. 注解的好处 注解可以替代配置文件完成对某些功能的描述,减少 ...
- 【总结】ettercap工具之DNS劫持
在arp欺骗成功基础上开始进行dns劫持,,, 1.修改/etc/ettercap/etter.dns文件内容,如下图所示. 将所有域名解析到192.168.1.250地址上,,, 2.etterca ...
- esper(4-3)-Non-Overlapping Context
语法 create context context_name start start_condition end end_condition 如: // 9点到17点此context才可用(以引擎的时 ...