Java中Array Arrays ArrayList的区别

时间:2021-10-20 22:06:32

有时候总被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.