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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 乔玉吉 中级黑马   /  2012-3-19 21:49  /  3572 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Array和ArrayList有哪些区别?

5 个回复

正序浏览


Array全部是静态方法,提供了动态创建和访问数组,允许在执行 get 或 set 操作期间进行扩展转换,但是如果发生收缩转换就会发出异常

ArrayList是一个集合,里面只能存储对象,其实底层封装的是数组,但是它的大小是可以改变的。可以存储相同的元素,元素可以为null,不同步的。容器中的数组需要用迭代器才能取出。对于元素的操作相对简单,但是元素没有哦下标值。可以将数组转换成集合排序,搜索等方法简便一些

Arrays一个对数组操作的方法,不必将数组转换成集合排序等,更方便一些

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
        ArrayList 类提供在大多数 Collections 类中提供但不在 Array 类中提供的一些功能。例如:
        Array 的容量是固定的,而 ArrayList 的容量是根据需要自动扩展的。如果更改了 ArrayList.Capacity 属性的值,则自动进行内存重新分配和元素复制。
        ArrayList 提供添加、插入或移除某一范围元素的方法。在 Array 中,您只能一次获取或设置一个元素的值。
        使用 Synchronized 方法可以很容易地创建 ArrayList 的同步版本。而 Array 将一直保持它直到用户实现同步为止。
        ArrayList 提供将只读和固定大小包装返回到集合的方法。而 Array 不提供。
        另一方面,Array 提供 ArrayList 所不具有的某些灵活性。例如:
        可以设置 Array 的下限,但 ArrayList 的下限始终为零。
        Array 可以具有多个维度,而 ArrayList 始终只是一维的。
        特定类型(不包括 Object)的 Array 的性能比 ArrayList 好,这是因为 ArrayList 的元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和取消装箱。
        要求一个数组的大多数情况也可以代之以使用 ArrayList。它更易于使用,并且通常具有与 Object 类型的数组类似的性能。
        Array 位于 System 命名空间中;ArrayList 位于 System.Collections 命名空间中。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
Array:最高效;但是其容量固定且无法动态改变;
ArrayList:  容量可动态增长;但牺牲效率;
建议:
基于效率和类型检验,应尽可能使用Array,无法确定数组大小时才使用ArrayList!
不过当你试着解决更一般化的问题时,Array的功能就可能过于受限。
回复 使用道具 举报
ArrayList想象成一种“会自动扩增容量的Array”。

Array([]):最高效;但是其容量固定且无法动态改变;
     ArrayList:  容量可动态增长;但牺牲效率;

Java中一切皆对象,Array也是对象。不论你所使用得Array型别为何,

Array名称本身实际上是个reference,指向heap之内得某个实际对象。

这个对象可经由“Array初始化语法”被自动产生,也可以以new表达式手动产生。

Array可做为函数返回值,因为它本身是对象的reference;

对象数组与基本类型数组在运用上几乎一模一样,唯一差别在于,前者持有得是reference,后者直接持有基本型别之值;
例如:
string [] staff=new string[100];
int [] num=new int[10];

容器所持有的其实是一个个reference指向Object,进而才能存储任意型别。当然这不包括基本型别,因为基本型别并不继承自任何classes。

面对Array,我们可以直接持有基本型别数值的Array(例如:int [] num;),也可以持有reference(指向对象)的Array;但是容器类仅能持有reference(指向对象),若要将基本型别置于容器内,需要使用wrapper类。但是wrapper类使用起来可能不很容易上手,此外,primitives Array的效率比起“容纳基本型别之外覆类(的reference)”的容器好太多了。

如果你的操作对象是基本型别,而且需要在空间不足时自动扩增容量,Array便不适合,此时就得使用外覆类的容器了。

对数组的一些基本操作,像排序、搜索与比较等是很常见的。因此在Java中提供了Arrays类协助这几个操作:sort(),binarySearch(),equals(),fill(),asList().

不过Arrays类没有提供删除方法,而ArrayList中有remove()方法,不知道是否是不需要在Array中做删除等操作的原因(因为此时应该使用链表)。

ArrayList的使用也很简单:产生ArrayList,利用add()将对象置入,利用get(i)配合索引值将它们取出。这一切就和Array的使用方式完全相同,只不过少了[]而已。


ArrayList是Array的复杂版本
ArrayList内部封装了一个Object类型的数组,从一般的意义来说,它和数组没有本质的差别,甚至于ArrayList的许多方法,如Index、IndexOf、Contains、Sort等都是在内部数组的基础上直接调用Array的对应方法。

类型识别:
ArrayList存入对象时,抛弃类型信息,所有对象屏蔽为Object,编译时不检查类型,但是运行时会报错。
ArrayList与数组的区别主要就是由于动态增容的效率问题了

ArrayList可以存任何Object,如String等。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
Array 类提供了动态创建和访问 Java 数组的方法。
ArrayList 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马