Java中Array Arrays ArrayList的区别

原创 2013年12月04日 15:35:54

有时候总被java语言中的Array, Arrays和ArrayList弄的云里雾里的, 它们之间究竟有什么联系呢?查看了相关的源代码,终于找到了一些端倪。做个笔记,方便查看。

1. Array

  Array和[]的关系就如int 和Integer, boolean 和Boolean. 它的构造函数是私有的,赋值提供静态的诸如 setInt(Object arr, int index, int i)  setFloat(Object arr, int index, float f)  set(Object arr, int index, Object value)之类的方法, 取值提供静态的 getInt(Object arr, int index)   get(Object arr, int index) 之类 的方法. 在JDK1.6的源码中, 这些方法都是由本地代码实现。由于没有找到本地代码,不能深入的学习, 查看android4.2的源码,这些方法并没有用本地代码实现,直接根据实际的类型,分配数组。

2. Arrays

  Arrays主要提供toString(), 排序, 二分查找, copyOf()等方法. 同样构造方法是私有的, toString() 排序 查找和 copyOf()等方法也是静态的,其中对于乱序的基本类型数据用到的是双枢纽快速排序算法(DualPivotQuicksort),对于乱序的Object[] 用的是归并排序(不过,注释中指出归并排序是历史遗留问题,将来的发行版会删去。下一篇,我想对常用的排序算法做个笔记)。copyOf()会分配临时数组,最终会调用System.arraycopy()来完成数组元素的拷贝。

3. ArrayList

  ArrayList这个平时用的比较多,感觉比较熟悉, 本着好奇的心,看了一下实现。ArrayList的内部是用 Object[]来存储的, 开始默认为10个, 调用add等方法时,会检查数组是否装满, 若装满, 则按照数组当前长度的一半增长,调用Arrays.copyOf()拷贝数组中的元素。调用remove()方法时, 最终也会调用System.arrayCopy()来移动数组中的元素。

ArrayList的添加和删除方法都最终直接或者间接的调用System.arraycopy()方法。那arraycopy()到底张的啥样呢? 在System.java文件中,看到了arraycopy()方法的原型, 又是一个native方法。搜遍了JDK源码和Android4.2源码中的本地代码,都没有发现它的实现。(纳闷了,这些本地方法到底在哪里实现的呢?虚拟机的动态库中?) 

尝试从jre目录的所有.so文件中找到arraycopy()的影子。从libjvm.so文件的导出符号中终于找到了arraycopy的踪迹。 果然在libjvm.so文件中。在libjava.so文件的导出符号中, 同样也找到了getInt(), getBoolean()等。


注:

  参考的jdk源码版本是jdk1.7.0_25, android'的源码是4.2.

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Array和ArrayList之间的区别

1. Array类型的变量在声明的同时必须进行实例化(至少得初始化数组的大小),而ArrayList可以只是先声明。 2. Array只能存储同构的对象,而ArrayList可以存储异构的对象。 同构...

Java中Array与ArrayList的主要区别(

1)精辟阐述: 可以将 ArrayList想象成一种“会自动扩增容量的Array”。 2)Array([]):最高效;但是其容量固定且无法动态改变;      ArrayList:  容量可...

java.util.ArrayList与java.util.Arrays$ArrayList区别

写demo的时候,为了避免用list.add方法,特意写了个数组然后转换成list。一开始以为转换成的list就是实现了AbstractList的通用的List, 比如ArrayList或者Linke...

Collection与Collections,Array与Arrays的区别

Collection 和 Collections的区别 1.Collection      在java.util下的一个接口,它是各种集合结构的父接口。继承与他的接口主要有Set 和List....

Java Array和Arrays

一:Array与Arrays的区别 1.数组类Array    Java中最基本的一个存储结构。      提供了动态创建和访问 Java 数组的方法。其中的元素的类型必须相同。   ...

Java中List和ArrayList的区别

List是一个接口,而ListArray是一个类。  ListArray继承并实现了List。  所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造。...

Java中List和ArrayList的区别(加入了个人见解)

转载自:http://www.cnblogs.com/aisiteru/articles/1151874.html        第一次看这篇文章时,是在CSDN博客中看到的,作者写的初衷还是蛮好的,...

Java中List,ArrayList、Vector,map,HashTable,HashMap区别用法

ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动 等内存操作,所以索引数据快插入数据...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)