Java 数组

一、什么是数组

线性表(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虚拟机

展开阅读全文

没有更多推荐了,返回首页