黑马程序员技术交流社区

标题: 菜鸟疑惑,java有数组了为什么还制造个集合出来? [打印本页]

作者: 自学小番薯    时间: 2015-3-3 11:53
标题: 菜鸟疑惑,java有数组了为什么还制造个集合出来?
本帖最后由 自学小番薯 于 2015-3-3 12:38 编辑

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



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








作者: zfgrinm    时间: 2015-3-3 11:59
数组虽然也可以存储对象,但长度是固定的,集合长度是可变的;数组中只能存储同一类型的基本数据,集合则可以存储不同类型的对象..
作者: fantacyleo    时间: 2015-3-3 12:02
新事物产生一定是旧事物有局限无法满足新需要。比如说,数组一旦创建,容量就固定了,我想扩展怎么办?
作者: 自学小番薯    时间: 2015-3-3 12:05
zfgrinm 发表于 2015-3-3 11:59
数组虽然也可以存储对象,但长度是固定的,集合长度是可变的;数组中只能存储同一类型的基本数据,集合则可 ...

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

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

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

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

作者: fantacyleo    时间: 2015-3-3 12:23
zfgrinm 发表于 2015-3-3 12:18
可以建立一个新的数组取代这个数组.

你没把复制原来的数组元素到新数组的开销考虑进去
作者: 自学小番薯    时间: 2015-3-3 12:26
fantacyleo 发表于 2015-3-3 12:11
不能这么说。学了方程,就不要算术解法了?

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

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

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

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

既然集合这么强大,数组还留着有什么用呢?
难道数组拥有集合所没有的优点?比如高效,安全之类的?

作者: fantacyleo    时间: 2015-3-3 12:40
自学小番薯 发表于 2015-3-3 12:26
你这回答不在点子上啊,方程是建立在算法的基础上啊,没算法何来的方程。

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

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

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

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

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

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

杀鸡焉用牛刀
作者: fantacyleo    时间: 2015-3-3 13:15
zfgrinm 发表于 2015-3-3 12:54
那代码上是怎么实现的啊,哪里有具体的代码实现这功能呢,想学习学习

我是学习国外大学的公开课时看到的,那是用C语言实现的。但思路肯定一样。你可以搜一下java怎么实现动态数组。当然,这种动态数组不能像普通数组那样用下标操作元素了,实质上就是变成一个类似ArrayList的类,你要创建对象、调用方法来增删改查。

作者: alvis2015    时间: 2015-3-3 13:17
因为不管在哪个编程语言中,数组是一种最基本的数据结构,很多数据结构都是从数组演变而来的。Java中也是一样,很多的功能都必须依靠数组来实现,因为它简单直观,存储方式最简单明了。
作者: zfgrinm    时间: 2015-3-3 13:37
fantacyleo 发表于 2015-3-3 13:15
我是学习国外大学的公开课时看到的,那是用C语言实现的。但思路肯定一样。你可以搜一下java怎么实现动态 ...

涨知识了,谢了啊
作者: 菜鸟一号    时间: 2015-3-3 15:21
数组可以存放基本数据类型和对象,集合只能存对象。数组还支持索引
作者: 绝望    时间: 2015-3-3 15:47
我觉得可以肯定的是集合比数组的功能要强大,就算java某一天想舍弃数组,也很难做到了,编程语言为了向后兼容一定会牺牲很多东西的
作者: sofeel    时间: 2015-3-3 18:38
自学小番薯 发表于 2015-3-3 12:31
既然集合这么强大,数组还留着有什么用呢?
难道数组拥有集合所没有的优点?比如高效,安全之类的?
...

数组是定量的容器,
数组是容器的始祖。

缓冲技术,实现了数组的动态创建。
因而,发展出了新的容器,StringBuffer,StringBuilder.
缓冲技术的容器很强大了,可以什么都存。当然包括对象。
那么,它能直接操作对象吗?不行。想要使用它其中的元素,只有转成字符串。因为这是他的使命,出现就是为了增强数组和字符串。

未完成的任务只能交给新的兄弟们,他们是集合,可以存储并操作对象。
数组完全淘汰了吗?
List用的是什么结构?数组结构。动态的数组而已。
集合新增加了数据结构,tree和hash.它们的底层用没用到数组,没瞧过源码,不敢妄断。

综上:
数组是容器的基石。



作者: 女神从来不加班    时间: 2015-3-3 19:59
数组是定长的 集合不是 而且集合的方法更多 更方便一些
作者: 夏季熬成了秋    时间: 2015-3-3 22:04
集合要比数组的功能强大,是个更大的容器。
作者: Oo不弃    时间: 2015-3-4 10:10
如果需要表示矩阵的话用二维数组还是比较方便吧?
作者: liaowenhua    时间: 2015-3-4 17:00
数组和集合都是用来数据的,但是两者有区别:数组存放的是同一类型的数据(对象),而集合能存放不同类型的数据(对象);数组长度是固定的,集合的长度是可变的
作者: 自学小番薯    时间: 2015-3-4 19:23
sofeel 发表于 2015-3-3 18:38
数组是定量的容器,
数组是容器的始祖。

涨姿势了   太感谢你的科普~~~
作者: sofeel    时间: 2015-3-4 20:03
自学小番薯 发表于 2015-3-4 19:23
涨姿势了   太感谢你的科普~~~

呵呵  数组很有用吧
作者: ko889910    时间: 2015-3-4 22:11
楼主知道什么是数据结构吗 数据存放在不同的数据结构中对算法效率有相当大的影响 相同的数据放在不同的数据结构中 对他们做相同的处理 处理器运算耗费的时间可能相差几倍甚至几十倍
作者: 自学小番薯    时间: 2015-3-4 23:52
ko889910 发表于 2015-3-4 22:11
楼主知道什么是数据结构吗 数据存放在不同的数据结构中对算法效率有相当大的影响 相同的数据放在不同的数据 ...

看来牵涉到越底层的东西,那些计算机基础就起作用了
以后一定要把计算机的专业课给补上
作者: 白春秋    时间: 2015-3-5 21:36
本帖最后由 白春秋 于 2015-3-5 21:42 编辑

数组和集合都是容器,但是说装的东西不同:数组既可以存储基本数据类型又可以存对象,但是必须是同一类型的,而且长度是固定的;集合只能存储对象,长度是可变的。因此集合和数组都有各自特有的功能,可以互相弥补对方的局限,不可替代
作者: ZZGFF    时间: 2015-3-5 22:29
ArrayList 就是基于数组  ArrayList源代码就是用数组实现的。
作者: ㏒假™面具    时间: 2015-3-6 03:16
数组可以存储基本数据类型和引用数据类型,collection集合只能存储引用数据类型
作者: 无力去闹    时间: 2015-3-6 18:12
看了这么多 确实涨姿势了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2