关闭

Java中Array Arrays ArrayList的区别

4015人阅读 评论(0) 收藏 举报
分类:

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

2
0
查看评论

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

写demo的时候,为了避免用list.add方法,特意写了个数组然后转换成list。一开始以为转换成的list就是实现了AbstractList的通用的List, 比如ArrayList或者LinkedList等。 当调用add方法的时候, 奇怪的事情发生了。 String[] arrays = n...
  • maywehe
  • maywehe
  • 2016-09-16 09:01
  • 2046

Java Array和Arrays

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

Array与Arrays的区别

1.数组类Array    Java中最基本的一个存储结构。      提供了动态创建和访问 Java 数组的方法。其中的元素的类型必须相同。      效率高,但容量固定且无法动态改...
  • xiaoyu714543065
  • xiaoyu714543065
  • 2012-10-30 10:21
  • 1099

Java中Array与ArrayList的主要区别(

1)精辟阐述: 可以将 ArrayList想象成一种“会自动扩增容量的Array”。 2)Array([]):最高效;但是其容量固定且无法动态改变;      ArrayList:  容量可动态增长;但牺牲效率; 3)建议:...
  • chenglansky
  • chenglansky
  • 2015-03-23 19:35
  • 7281

java ArrayList 使用心得与总结

在用 c 语言 或 C++ 时,我遇到的最大麻烦就是动态数组的内存释放了,经常容易出错。 而 java 的 ArrayList 类 很好的解决了这个问题,它类似于 C++ 中的容器类 vector,自带很多方法对数组操作。 详细的介绍可以参看 oracle 的文档: https://d...
  • robert_chen1988
  • robert_chen1988
  • 2017-06-17 19:19
  • 518

在Java中如何将一个数组Array转换为ArrayList

对我来说,这是一个值得关注的问题,因为它在stackoverflow备受关注和推荐。提出这样问题的人受到广泛称赞,这使得他能够在stackoverflow上做很多事情。虽然这对我来说并没有太大的意义,但我们还是先来看看这个问题。     问题如下:如何将下面的数组array转换为...
  • snarlfuture
  • snarlfuture
  • 2013-11-26 20:20
  • 3527

Array和ArrayList之间的区别

1. Array类型的变量在声明的同时必须进行实例化(至少得初始化数组的大小),而ArrayList可以只是先声明。 2. Array只能存储同构的对象,而ArrayList可以存储异构的对象。 同构的对象是指类型相同的对象,若声明为int[]的数组就只能存放整形数据,strin...
  • yangwenxue_admin
  • yangwenxue_admin
  • 2015-03-22 13:47
  • 8339

array和arrays的区别,Collection和Collections的区别

最近在复习Java的书,发现了既有array类,又有arrays类,于是去网上百度了一下,略知了一二,特此粘贴过来一些知识。 Array类主要提供了动态创建和访问 Java 数组的方法。 Arrays包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。...
  • xinshishenchao
  • xinshishenchao
  • 2017-01-13 21:24
  • 369

android小知识:ArrayList和数组之间的转换

List----->数组<br />开发中不免碰到List与数组类型之间的相互转换,举一个简单的例子: <br />package test.test1; <br />import java.util.ArrayList; <br />impor...
  • brave_heart_lxl
  • brave_heart_lxl
  • 2011-02-11 14:17
  • 73067

Android 之Map容器替换 SparseArray,ArrayMap,ArraySet

在写程序时使用Map类大部份情况都会用到,尤其是HashMap使用频率相当高,使用HashMap会涉及一个要求key与value必须为对象类型,而不能为基本类型, 这就导致了本可以基本类型的数据必须转换为其对象包装类型(int->Integer,long->Long......)这就涉及...
  • yudajun
  • yudajun
  • 2016-12-08 20:28
  • 2464
    个人资料
    • 访问:51030次
    • 积分:927
    • 等级:
    • 排名:千里之外
    • 原创:42篇
    • 转载:1篇
    • 译文:0篇
    • 评论:13条
    文章分类
    最新评论