List泛型和数组的区别?进者有分

cykb518 2011-05-03 08:39:27
用list很久了,网上也查了很多资料,但是都不是很清楚,大家谈谈这两者之间的区别吧。最好从原理上来谈,比如说,怎么在内存中开辟空间,添加和删除元素的区别?
...全文
983 33 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
cykb518 2011-05-03
  • 打赏
  • 举报
回复
数组如果增加一项的话,必须现在内存中重新开辟一个空间,把前面的放过去,然后再加上追加的这一项。 数组适合定长的操作。但是list泛型增加一项在内存中又是怎么操作的呢?
vrhero 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wangdoublejia 的回复:]
我觉得数组的话效率会比list快
[/Quote]
未必...假如结构不固定,需要经常更改数组维数那就要经常实例化新数组,效率反而低...所以说数组适用于结构较固定的场景...

也因为如此,.NET为集合类提供了ToArray方法,又从3.5开始提供了IEnumerable的扩展方法ToList<T>,以便根据需要在数组与集合之间自由转换...
令狐苦瓜 2011-05-03
  • 打赏
  • 举报
回复
我觉得数组的话效率会比list快
threenewbee 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 vrhero 的回复:]
引用 13 楼 sbc86 的回复:
首先,它们原则上就不同,一个值类型,一个引用类型

用起来还是蛮简单的,根据自己需求来的


瞎扯...谁告诉你的?哪个是值类型?

6楼解释的比较清楚了...List<T>更灵活适用场景更多资源消耗更大,数组在结构比较固定的场景消耗更小...另外有些场景有设计限制,比如与COM或非托管程序或资源的交互很多时候必须使用数组...
[/Quote]
答案经过vrhero把关就有内涵了。
vrhero 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sbc86 的回复:]
首先,它们原则上就不同,一个值类型,一个引用类型

用起来还是蛮简单的,根据自己需求来的

[/Quote]
瞎扯...谁告诉你的?哪个是值类型?

6楼解释的比较清楚了...List<T>更灵活适用场景更多资源消耗更大,数组在结构比较固定的场景消耗更小...另外有些场景有设计限制,比如与COM或非托管程序或资源的交互很多时候必须使用数组...
sbc86 2011-05-03
  • 打赏
  • 举报
回复
首先,它们原则上就不同,一个值类型,一个引用类型

用起来还是蛮简单的,根据自己需求来的

中山网站建设
xuexiaodong2009 2011-05-03
  • 打赏
  • 举报
回复
泛型其实就是长度可以变化的,并且类型固定的数组,相当于链表,但ArrayList存储的类型是object,使用时必须转化为实际的类型。泛型是知道具体类型的
极地_雪狼 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wxr0323 的回复:]
1.数组是固定大小的,不能伸缩。虽然System.Array.Resize这个泛型方法可以重置数组大小,
但是该方法是重新创建新设置大小的数组,用的是旧数组的元素初始化。随后以前的数组就废弃!而集合却是可变长的
2.数组要声明元素的类型,集合类的元素类型却是object.
3.数组可读可写不能声明只读数组。集合类可以提供ReadOnly方法以只读方式使用集合。
4.数组要有整数下标……
[/Quote]
cjfriends 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jejexu 的回复:]
只知道用.也不怎么清楚原理.顶一个
[/Quote]
我也是只知道用,原理什么的似懂非懂的
cjh200102 2011-05-03
  • 打赏
  • 举报
回复
ArrayList 引用或值类型都强制转换为 Object。

两都最大的区别是泛型的类型可自定义。
ArrayList中存放的类型都是Object。
hztltgg 2011-05-03
  • 打赏
  • 举报
回复
这个只是表象吧,而且楼主说的是 list<T> 和 数组 的区别,没有object和readonly的概念。
子夜__ 2011-05-03
  • 打赏
  • 举报
回复
1.数组是固定大小的,不能伸缩。虽然System.Array.Resize这个泛型方法可以重置数组大小,
但是该方法是重新创建新设置大小的数组,用的是旧数组的元素初始化。随后以前的数组就废弃!而集合却是可变长的
2.数组要声明元素的类型,集合类的元素类型却是object.
3.数组可读可写不能声明只读数组。集合类可以提供ReadOnly方法以只读方式使用集合。
4.数组要有整数下标才能访问特定的元素,然而很多时候这样的下标并不是很有用。集合也是数据列表却不使用下标访问。
jeje 2011-05-03
  • 打赏
  • 举报
回复
只知道用.也不怎么清楚原理.顶一个
tashiwoweiyi 2011-05-03
  • 打赏
  • 举报
回复
说实话,我也只是会用,,很多原理也不清楚。。

关注中。
ABCDEF 2011-05-03
  • 打赏
  • 举报
回复
数组就是值对象,它存储数据元素类型的值的一系列位置.
Arraylist和list可以提供添加,删除,等操作的数据.
泛形中的元素类型是固定的.
比如:
arraylist a = new arraylist();
a.add(1);
a.add( "aaaa ");
a.add(new class());
Arraylist中可以添加任何类型的元素.

如果定义的是泛形的话
List <MyClass> myclasslist = new List <MyClass>
MyClassList.add(new MyClass());
泛形中就不能再添加别的类型的.它只能添加MyClass类型的实例.

网上多查查
种草德鲁伊 2011-05-03
  • 打赏
  • 举报
回复
用reflector看一下就明白了,list是基于array实现的
remember_me 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 zthsn 的回复:]

arraylist 实际上里面放的是object,假设你放进去的是一个值类型,他会先把这个值类型转换成object(也就是进行一次装箱),取出来的时候一样进行一次拆箱,而list则不需要
[/Quote]
ArrayList集合可以存入任何类型的数据。存入后,将统一转变为Object类型,那么对于值类型来说,就是进行装箱操作,对应的,读取的时候,也要还原原来的类型,即拆箱操作。

装箱和拆箱操作是非常消耗性能的。
remember_me 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 luoweihua7 的回复:]

mark....
上次面试被问道泛型.答不出来
[/Quote]
晕,怎么能出现这种情况?
remember_me 2011-05-03
  • 打赏
  • 举报
回复
List<T>泛型集合位于System.Collections.Generic;命名空间下。

主要方法 :
Add(T t):T代表的是该集合中允许存入的数据类型。利用Add(T t)方法将指定元素添加进List<T>集合。
Remove(对象名): 通过对象名删除元素
RemoveAt(索引): 通过索引删除元素
Count:返回该集合中的元素的数量
遍历循环
foreach(int i = 0;i < list.Count;i ++)
{
T t = list[i];
}
foreach(T t in list)
{
//执行操作
}
V-Far 2011-05-03
  • 打赏
  • 举报
回复
mark....
上次面试被问道泛型.答不出来
加载更多回复(4)

62,242

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧