一、什么是数组
线性表(linear list):0个或有限多个相同类型的数据元素的序列。
线性表有两种物理结构:
- 顺序存储结构:
用一段地址连续的存储单元依次存储线性表的数据元素,相邻两元素的存储位置也是挨着的。 - 链式存储结构:
用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。
Java中的数组结构就是线性表的顺序存储结构,Node之间的序列靠存储单元位置序列来实现。存取时间复杂度是O(1),插入与删除时间复杂度是O(N)。
二、Java 中的数组
在 Java 中数组是一个特殊的对象。
public static void main(String[] args) {
String[][] array = new String[10][];
System.out.println("array的父类是:" + array.getClass().getSuperclass());
System.out.println("array的类名是:" + array.getClass().getName());
}
-------Output:
array的父类是:class java.lang.Object
array的类名是:[[Ljava.lang.String;
数组的是 Object 的直接子类,它属于“第一类对象”,但是它又与普通的 Java 对象存在很大的不同。
普通的 Java 类是以全限定路径名 + 类名来作为自己的唯一标示的,而数组则是以若干个 [+L+ 数组元素类全限定路径+类来最为唯一标示的。
《深入理解Java虚拟机》对class文件结构中的描述符的介绍中,也提到了在描述字段(变量)时数组与普通对象的差异。
三、使用
Arrays工具类
JDK提供了Arrays工具类来操作数组,JDK 1.8大致有如下操作
asList、binarySearch、copyOf/copyOfRange、equals/deepEquals、fill、hashCode/deepHashCode、parallelPrefix、sort/parallelSort、setAll/parallelSetAll、spliterator、stream、toString/deepToString
注意点
在Java中数组是一种效率最高的存储和随机访问对象引用序列的方式,所以在性能要求较高的场景中请优先考虑数组。
很多集合类的底层也都是通过数组来实现的。
通过 Arrays.copyOf() 方法产生的数组是一个浅拷贝。同时数组的 clone() 方法也是,集合的 clone() 方法也是,所以我们在使用拷贝方法的同时一定要注意浅拷贝这问题。
http://wiki.jikexueyuan.com/project/java-enhancement/java-eighteen.html
深入理解Java虚拟机