A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邓江红 中级黑马   /  2014-4-1 23:12  /  1911 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

数组、Array、ArrayList的异同,并举个例子说明

2 个回复

倒序浏览
之前有写过数组和array类:
C#数组和Array类的关系:

在C#中Array类是所有数组的基类,MSDN上的解释为:“提供一些方法,用于创建、处理、搜索数组并对数组进行排序,从而充当公共语言运行时中所有数组的基类。”,

最常见的属性是:

        Length        获得一个 32 位整数,该整数表示 Array 的所有维数中元素的总数。
下面的代码将 numbers 数组的长度(为 5)赋给名为 LengthOfNumbers 的变量:

int[] numbers = {1, 2, 3, 4, 5};
int LengthOfNumbers = numbers.Length;
最常用的方法:
CreateInstance(Type,Int32[])        创建使用从零开始的索引、具有指定 Type 和维长的多维 Array。 维的长度在一个 32 位整数数组中指定。Array intArray1 = Array.CreateInstance(typeof(int),5)
for(int i=0;i<5,i++)

{

intArray1.SetValues(33,i);
}

该方法第一个参数为创建数组的数据类型,第二个参数定义数组的大小。SetValues()设置数组元素的值,当然对应GetValues()方法用于获取数组元素的值。

C# 还提供 foreach 语句。该语句提供一种简单、明了的方法来循环访问数组的元素。例如,下面的代码创建一个名为 numbers 的数组,并用 foreach 语句循环访问该数组:

int[] numbers = {4, 5, 6, 1, 2, 3, -2, -1, 0};
foreach (int i in numbers)
{
   System.Console.WriteLine(i);
}
由于有了多维数组,可以使用相同方法来循环访问元素,例如:

int[,] numbers = new int[3, 2] {{9, 99}, {3, 33}, {5, 55}};
foreach(int i in numbers)
{
   Console.Write("{0} ", i);
}
该示例的输出为:

9 99 3 33 5 55
不过,由于有了多维数组,使用嵌套 for 循环可以更好地控制数组元素。

至于arraylist的话:
ArrayList 类:使用大小可按需动态增加的数组。

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
ArrayList和Hashtable
为什么要用ArrayList(List)和Hashtable(字典Dictionary)
这是由于数组的长度是固定的,数组里存储的数据类型是单一的。
ArratList元素的增加、插入、删除、清空、排序、反转

ArrayList一些常用的方法

ArrayList list=new ArrayList();
list.Add();//添加单个元素
list.AddRange();//添加集合
list.Insert();//插入元素
list.InsertRange();//插入集合
插入数据:Insert();
使用语法:
集合名.Insert(位置,值);

删除数据:Remove()、RemoveAt()、Clear()
Remove方法
list.Remove(数据)//根据元素的值进行删除
删除集合中与"数据"相同的数据
当集合中不存在这个数据时,直接忽略
方法执行从左至右删掉第一个出现的数据,其后数据不考虑

list.RemoveAt(数据);//根据元素的索引进行删除
ps.RemoveAt方法
删掉指定索引的数据,其后数据一次向前移动
当索引超出范围后,抛异常
list.Clear();//清空集合中所有数据






集合的长度为什么可以任意的改变?

当我们向集合中添加进去一个元素后,这个集合会向内存中申请4个空间,当集合中的元素个数超过在内存中开的空间个数后,集合再次向内存申请多开辟一倍的空间

ArrayList list=new ArrayList();
list.Add(1);
Console.readLine(list.Count);
Console.readline(list.Capacity);
Console.readkey();

ArrayList方法
引用System.Collection命名空间
手动添加(必须记住命名空间)
光标停在代码中,快捷键或鼠标右键(必须记住类名)
学习集合可以注意归纳一下可用的方法
添加数据:Add()、AddRange()--添加数组用add
使用Add可以添加数据,并且与数组一样可以使用“下标”(索引)访问数据
使用下标访问的数据是object类型的,必要时需要进行转换,必须满足里氏转换原则
为什么要把Add参数设为object类型呢?为了通用
AddRange将数组或集合当中的数据批量的一个一个的加进去
数组或集合中有多少个数据,新集合中就添加了多少个数据,类型等一一对应
但Add同样可以将数组或集合作为数据加入,但此时加入数组或集合作为一个项添加过去
只有找到该项,才能通过“下标”访问到其中的数据


集合可以看做数组
可以将集合看作为“长度可变的,具有很多方法的数组”








第二个集合Hashtable方法
Hashtable俗称键值对集合,功能类似于字典,你能通过拼音去找汉字或者通过偏旁部首找汉字,总而言之,通过一个标示拿到对应的数据。
键值对集合里存的都是一对一对的键跟值,在字典里通过拼音找汉字,在Hashtable里通过键找值。
注意:Hashtable有两个单词组成,Hash和table,table首字母要小写。
Hashtable的命名空间跟ArrayList一样,都在System.Collections里
Hashtable ht=new Hashtable();
ht.Add(键,值);//键跟值的类型都是object类型,所以可以随意写
当遍历键值对集合的时候,我们用foreach循环进行遍历。
foreach(var item in ht.Keys)
{

}

补充:
用foreach遍历之后,输出的顺序是杂乱无章的。
item:就是指你遍历ht集合当中的每一个元素,当遍历的是键的时候,那么item指的也是键
var(推断类型:根据变量的值推断变量的类型)
var v1="张三";
var v2=10;
var v3=3.14;
var v4=true;
获取当前变量的类型
string type=v1.GetType();

一般在使用变量的时候,有的时候不能确定变量的初值,这个变量有可能是用户给你输入的。
当用这样用var的时候,
var v1;
v1="abc";
程序报错,指出当定义v1的时候必须给v1赋初值。
C#是一门强类型语言(什么叫做强类型语言:就是在这门语言当中必须对变量的类型有一个明确的定义)
JS是一门弱类型语言(定义变量的时候,全部用var)
需要注意的地方:
1、键值对集合当中,键必须是唯一的
2、 另外一种给集合添加数据的方式
ht[1]="Hello world";

判断一个集合是否包含某一个键的方法:
ht.ContainsKey(键)

Hashtable大家主要掌握的内容:
1、怎样给键值对集合添加数据,通过foreach循环遍历键值对







泛型集合:List集合和Dictionary
List<T>---->ArrayList
Dictionary---->Hashtable



我们为什么不建议使用ArrayList?
因为ArrayList的对象在添加数据的时候,就会发生装箱的操作(将值类型转换为引用类型),会影响系统性能,所以在写程序的时候要避免装箱或者拆箱,所以说咱们不喜欢用ArrayList,咱们用List泛型集合。
List和ArrayList方法什么的基本上都一样,但是有一点不一样,ArrayList添加的数据时object类型,而对于List泛型集合来说,当你规定好了它是什么类型之后,以后添加数据的类型只能是之前定义的类型。(这样就避免了拆、装箱,系统的性能也就提高了)而且用List还有一个好处,不需要引用命名空间。

Dictionary
之前讲的Hashtable的键和值都是object类型,但是Dictionary集合的键和值都是特定的类型



foreach (KeyValuePair<int,string> kv in dic)
  {
       Console.WriteLine("{0}----{1}",kv.Key,kv.Value);
  }



评分

参与人数 1技术分 +2 收起 理由
czwanglei + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马