黑马程序员技术交流社区

标题: 数组和集合有什么区别? [打印本页]

作者: 何清林    时间: 2014-3-8 00:57
标题: 数组和集合有什么区别?
本帖最后由 何清林 于 2014-3-8 15:33 编辑

数组和集合有什么区别?


作者: My_work    时间: 2014-3-8 01:42
一、数组声明了它容纳的元素的类型,而集合不声明。
二、数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,       集合提供更多的成员方   法,能满足更多的需求。
三、数组不论是效率还是类型检查都是最好的。
四、数组是一种可读/可写数据结构,没有办法创建一个只读数组。然而可以使用集合中提供的只读方式来实现,该方法将返回一个集合的只读版本。

作者: victorsun    时间: 2014-3-8 10:06
首先,在定义数组时一般都声明了其中的数据类型以及数组的长度,比如String[10] str,而集合是不声明其类型与长度的而是根据所存放对象的多少来决定其长度,其次数组和集合遍历的方式有所不同,数组是按照下表来访问元素,而集合则是用Iterator遍历器来访问其中对象的。
作者: 胡建伟    时间: 2014-3-8 11:04
数组中可以存储基本数据类型,集合只能存储对象;
数组虽然可以存储对象,但长度是固定的,集合长度是可变的
作者: 三眼皮    时间: 2014-3-8 11:24
我感觉最大的去区别就是,数组有固定的长度, 而且数组存储的内容是同种类型的,一旦定义就必须规定长度,而且不可变。而集合可以不限制长度,存储的内容也不限制类型。具体来讲数组与其它容器类的区别体现在三个方面:效率、类型识别和可以持有primitives。之间也可以转换,JAVA中将一个数组转换为一个集合
Person[] p = new Student[8];
ArrayList list = new ArrayList();
list = listArrays.asList(p);


作者: 三眼皮    时间: 2014-3-8 11:25
晕,上面第一句应该是Person[] = new Person[8],饿晕了,该吃饭了
作者: 何清林    时间: 2014-3-8 12:22
My_work 发表于 2014-3-8 01:42
一、数组声明了它容纳的元素的类型,而集合不声明。
二、数组是静态的,一个数组实例具有固定的大小,一旦 ...

谢谢,明白了
作者: syw02014    时间: 2014-3-8 14:33
    数组是JAVA语言内置的数据类型,它是一个线性的序列,所以它可以快速的访问其他的元素。但是速度是要有代价的,当你创建了一个数组之后,它的容量就固定了,而且在其生命周期里是不能改变的。还有一点,JAVA里面的数组是会做边界检查的,所以当你越界访问时,会抛出RuntimeException,所以不用担心在C或C++因为不做边界检查而出现的问题了,当然边界检查是以牺牲效率为代价的。数组与其它容器类的区别体现在三个方面:效率、类型识别和可以持有primitives。   
    JAVA里面提供的其他容器还包括List,Set和Map。他们处理对象的时候就好像这些这些对象都没有自己的类型一样,容器将它所含的元素都看成是JAVA中所有类的根类Object类型的,这样我们只需创建一种容器,就能把所有的类型的对象全部放进去。但是当取出的时候,那就需要我们自己进行类型转换了,不过在JAVA Tiger版里面新引入了“泛型”的概念,结合容器类一起使用就可以解决类型转换的问题,关于“泛型”这就不详细讲解了。
作者: 橸瑩膤漃寞林    时间: 2014-3-8 14:59
数组是同一种数据类型的集合。其实数组就是一个容器。
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。


作者: 欧阳疯    时间: 2014-3-8 17:15
1.数组是固定大小的,不能伸缩。虽然System.Array.Resize这个泛型方法可以重置数组大小,
但是该方法是重新创建新设置大小的数组,用的是旧数组的元素初始化。随后以前的数组就废弃!而集合却是可变长的
2.数组要声明元素的类型,集合类的元素类型却是object.
3.数组可读可写不能声明只读数组。集合类可以提供ReadOnly方法以只读方式使用集合。
4.数组要有整数下标才能访问特定的元素,然而很多时候这样的下标并不是很有用。集合也是数据列表却不使用下标访问。
很多时候集合有定制的下标类型,对于队列和栈根本就不支持下标访问!
作者: pifuhanshu    时间: 2014-3-9 18:55
数组是JAVA语言内置的数据类型,它是一个线性的序列,所以它可以快速的访问其他的元素。但是速度是要有代价的,当你创建了一个数组之后,它的容量就固定了,而且在其生命周期里是不能改变的。还有一点,JAVA里面的数组是会做边界检查的,所以当你越界访问时,会抛出RuntimeException,所以不用担心在C或C++因为不做边界检查而出现的问题了,当然边界检查是以牺牲效率为代价的。数组与其它容器类的区别体现在三个方面:效率、类型识别和可以持有primitives。      JAVA里面提供的其他容器还包括List,Set和Map。他们处理对象的时候就好像这些这些对象都没有自己的类型一样,容器将它所含的元素都看成是JAVA中所有类的根类Object类型的,这样我们只需创建一种容器,就能把所有的类型的对象全部放进去。但是当取出的时候,那就需要我们自己进行类型转换了,不过在JAVA Tiger版里面新引入了“泛型”的概念,结合容器类一起使用就可以解决类型转换的问题,关于“泛型”这就不详细讲解了。从上面的角度来看,这种做法很不错,但是就是苦了primitives,如果是常量的话,可以把primitive转换成wrapper类然后放进容器里面,如果是变量的话,那就只能放在你自己的类里了。与其他容器类相比,数组会在编译的时候作类型检查,从而防止你插入错误类型的对象,或者在提取对象的时候把对象的类型给搞错了,JAVA在编译和运行的时候都能阻止你将一个不恰当的消息传给对象。至于效率,数组无疑是要高于其他容器类的,因为有些容器类的实现就是基于数组的,比如ArrayList。不论从类型检查还是效率的角度来考虑,我们首选数组来作为容器都是没错的,但是数组的缺点就是功能太弱了,所以才会有容器类的出现。      要多说几句的就是,java.util包里面有一个Arrays类,它包括了一组可以用于数组的static的工具方法,其中最基本的是四个方法:用来比较两个数组是否相等的equals();用来填充数组的fill();用来对数组进行排序的sort();以及用于在一个已经排序的数组中查找元素的binarySearch()。所有这些方法都对primitives和Object进行了重载。此外还有一个asList()方法,它接受一个数组,然后把它转成一个List容器。JAVA标准类库还提供了一个System.arraycopy()的静态方法,它能以较快的速度拷贝数组,对primitive和Object都进行了重载,但是注意当对Object数组进行拷贝时,进行的是浅拷贝(shallow copy)。




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