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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 自学小番薯 于 2015-3-3 12:38 编辑

很多数据一维数组或者多维数组就可以储存,为什么还需要另外造个集合这种容器来储存?
菜鸟刚看到集合,故有此幼稚疑惑?
还望大神来科普下~~~



看到很多人说,集合拥有增、删、改、查的功能,操作集合里的元素的功能更强大。
既然如此,为什么不直接淘汰数组呢?
集合既不基于数组,也不与数组有联系,拥有数组的所有功能,并且能完成更高级的需求。数组存在的意义在什么地方呢?
还望大神指点。







35 个回复

倒序浏览
数组虽然也可以存储对象,但长度是固定的,集合长度是可变的;数组中只能存储同一类型的基本数据,集合则可以存储不同类型的对象..
回复 使用道具 举报
新事物产生一定是旧事物有局限无法满足新需要。比如说,数组一旦创建,容量就固定了,我想扩展怎么办?
回复 使用道具 举报
zfgrinm 发表于 2015-3-3 11:59
数组虽然也可以存储对象,但长度是固定的,集合长度是可变的;数组中只能存储同一类型的基本数据,集合则可 ...

由你说来,集合不但拥有数组的功能,而且能完成更高级的需求
既然集合如此强大,为什么不把数组淘汰掉呢?
回复 使用道具 举报
fantacyleo 发表于 2015-3-3 12:02
新事物产生一定是旧事物有局限无法满足新需要。比如说,数组一旦创建,容量就固定了,我想扩展怎么办? ...

正如我回答上楼的,既然集合如此强大,为何不直接把数组淘汰掉好了
知识体系越少,对于新手来说,掌握起来就容易些了啊
回复 使用道具 举报
自学小番薯 发表于 2015-3-3 12:05
由你说来,集合不但拥有数组的功能,而且能完成更高级的需求
既然集合如此强大,为什么不把数组淘汰掉呢 ...

不能这么说。学了方程,就不要算术解法了?
回复 使用道具 举报
fantacyleo 发表于 2015-3-3 12:02
新事物产生一定是旧事物有局限无法满足新需要。比如说,数组一旦创建,容量就固定了,我想扩展怎么办? ...

可以建立一个新的数组取代这个数组.
回复 使用道具 举报
1,集合是可变长度的,对比String与StringBuffer或StringBuilder
2,数组本身除了获取角标对应元素外,基本没有操作自己元素方法,而集合本身封装了对自己元素的操作方法,增删改查,获取,判断等,而集合因为存储元素的算法不同,使得集合拥有自己的特性。比如ArrayList底层用的就是数组,相当于数组的升级版,有序的即有角标,遍历快即查询快、修改快,增加即插入慢,因为插入后,在其后的元素全部要顺延;这些基础视频中毕老师都介绍的很详细
总之 ,集合的出现是为了更方便的操作元素。
回复 使用道具 举报
zfgrinm 发表于 2015-3-3 12:18
可以建立一个新的数组取代这个数组.

你没把复制原来的数组元素到新数组的开销考虑进去
回复 使用道具 举报
fantacyleo 发表于 2015-3-3 12:11
不能这么说。学了方程,就不要算术解法了?

你这回答不在点子上啊,方程是建立在算法的基础上啊,没算法何来的方程。

目前我的理解是,集合不基于数组,拥有数组的功能并优于数组,数组就是多余的。除非数组拥有某些优点而集合没有。

就好比手机操作系统,IOS  安卓淘汰曾经的塞班  MEGO等等系统。
回复 使用道具 举报
fantacyleo 发表于 2015-3-3 12:23
你没把复制原来的数组元素到新数组的开销考虑进去

那应该怎么扩展呢,能想到的只有利用反射建立新数组取代原数组,求指教啊...
回复 使用道具 举报
z47057554 发表于 2015-3-3 12:21
1,集合是可变长度的,对比String与StringBuffer或StringBuilder
2,数组本身除了获取角标对应元素外,基本 ...

既然集合这么强大,数组还留着有什么用呢?
难道数组拥有集合所没有的优点?比如高效,安全之类的?
回复 使用道具 举报
自学小番薯 发表于 2015-3-3 12:26
你这回答不在点子上啊,方程是建立在算法的基础上啊,没算法何来的方程。

目前我的理解是,集合不基于数 ...

这和谁基于谁没关系。要说基于,集合也基于数组啊。栈、队列、List、Set、Map都可以用数组实现。

数组当然有它自己的优势,存储结构简单,内存开销小;依据下标访问元素速度快。
回复 使用道具 举报 1 0
zfgrinm 发表于 2015-3-3 12:29
那应该怎么扩展呢,能想到的只有利用反射建立新数组取代原数组,求指教啊... ...

一般是设置一个初始容量,然后根据存储元素的数量动态扩张或收缩,其实这就是ArrayList的实现原理了。比如初始容量16,当存储了16个元素后,就新建一个容量为32的新数组,把旧数组复制到新数组,并return新数组。
回复 使用道具 举报
fantacyleo 发表于 2015-3-3 12:43
一般是设置一个初始容量,然后根据存储元素的数量动态扩张或收缩,其实这就是ArrayList的实现原理了。比 ...

那代码上是怎么实现的啊,哪里有具体的代码实现这功能呢,想学习学习
回复 使用道具 举报
fantacyleo 发表于 2015-3-3 12:43
一般是设置一个初始容量,然后根据存储元素的数量动态扩张或收缩,其实这就是ArrayList的实现原理了。比 ...

我印象中ArrayList是扩展50%的,Vector是扩展100%的吧
回复 使用道具 举报
自学小番薯 发表于 2015-3-3 12:31
既然集合这么强大,数组还留着有什么用呢?
难道数组拥有集合所没有的优点?比如高效,安全之类的?
...

杀鸡焉用牛刀
回复 使用道具 举报
zfgrinm 发表于 2015-3-3 12:54
那代码上是怎么实现的啊,哪里有具体的代码实现这功能呢,想学习学习

我是学习国外大学的公开课时看到的,那是用C语言实现的。但思路肯定一样。你可以搜一下java怎么实现动态数组。当然,这种动态数组不能像普通数组那样用下标操作元素了,实质上就是变成一个类似ArrayList的类,你要创建对象、调用方法来增删改查。
回复 使用道具 举报
因为不管在哪个编程语言中,数组是一种最基本的数据结构,很多数据结构都是从数组演变而来的。Java中也是一样,很多的功能都必须依靠数组来实现,因为它简单直观,存储方式最简单明了。

点评

Lisp是个反例,没有built-in数组,要自己实现。  发表于 2015-3-3 13:31
回复 使用道具 举报
fantacyleo 发表于 2015-3-3 13:15
我是学习国外大学的公开课时看到的,那是用C语言实现的。但思路肯定一样。你可以搜一下java怎么实现动态 ...

涨知识了,谢了啊
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马