013-数组
目录
一、数组的概念及特点
一、数组的概念
数组实际上是一个用来存储数据的容器,一个数据的集合,可以容纳多个元素,并且数组本身是引用类型,其父类是Object,所以数组对象是存储在堆内存中;
二、数组的一些特点
- 数组在内存方面存储的时候,数组中的元素内存地址是连续的(存储的每一个元素都是有规则的挨着排列的),这是数组存储元素的特点,数组实际上是一种简单的数据结构;
- 所有的数组都是拿首元素的内存地址作为整个数组对象的内存地址;
- 数据当中如果存储的是“java对象”的话,实际上存储的是对象的“引用(内存地址)”,数组中不能直接存储java对象;
- java中的数组要求数组中的元素类型统一,比如int类型数组只能存储int类型数据,Person类型数组只能存储Person类型数据;
- java中规定,数组一旦创建,长度不可变;
- 所有的数组对象都有length属性(java中自带的),用来获取数组中元素的个数;
- Object[] 这是一个万能的口袋,这个口袋中可以装任何引用数据类型的数据。
- 数组每一个元素都是有下标的,下标从0开始,以1递增,最后一个下标是:length-1,下标可用来对数组中的元素进行存取;
三、数组的优点
查询 / 检索 / 查找某个下标上的元素时效率极高,可以说是查询效率最高的一个数据结构,原因如下:
- 每一个元素的内存地址在空间上存储是连续的;
- 每一个元素类型相同,所以占用空间大小一样;
- 这样的话知道第一个元素的内存地址,知道每一个元素占用空间的大小,有知道下标,所以通过一个数学表达式就可以计算出某个下标上的元素的内存地址,直接通过内存地址定位元素,所以数组的检索效率是最高的;
注:数组中存储100个元素,或者是100万个元素,在元素的查询 / 检索方面效率都是一样的,因为数组中元素的查找不是一个个去找,通过数学表达式计算出内存地址,直接定位的;
四、数组的缺点
- 为了保证数组中每一个元素的内存地址连续,所以在数组上随机删除元素或者增加元素的时候。效率较低,因为随机增删元素会涉及到后面元素统一向前或者向后位移的操作(最后一个元素除外);
- 数组不能存储很大的数据量,因为很难再内存空间找到一片特别大的连续的内存空间;
- 对于数组最后一个元素的增删,是没有效率影响的;
五、数组中可存放的数据类型
- 引用数据类型:存在的是引用类型的内存地址;
- 基本数据类型:存放的是数据的值;
六、数组的分类
- 一维数组;
- 二维数组;
- 多维数组;
二、一维数组
一、一维数组的声明/定义方式
- int[ ] array1:定义一个 int 类型的数组;
- double[ ] array2:定义一个 double 类型的数组;
- String[ ] array3:定义一个 String 类型的数组;
- Object[ ] array4:定义一个 Object 类型的数组;
......
二、一维数组的初始化
- 静态初始化一维数组:int[ ] array = {12,23};
- 动态初始化一维数组:int[ ] array = new int[5];(5代表初始五个长度为int类型的数组,每个元素默认为0);
三、一维数组的扩容
因为数组的长度一旦定义好就不可以改变,所以我们无法再原先的数组上进行数组的扩容,我们采用的扩容方式是先新建一个大容量的数组,然后再使用方法将小容量数组中的数据一个一个拷贝到大数组当中:System.arraycopy(拷贝的数组,拷贝第一个元素,目的数组,拷贝的开始位置,拷贝的长度);
需要我们注意的是,数组扩容效率较低。因为涉及到拷贝的问题。所以我们应尽可能少的进行数组的拷贝,可以在创建数组对象的时候预估计以下多长合适,最好预估准确,这样可以减少数组的扩容次数。提高效率。
三、二维数组
二维数组概念
二维数组其实是一个特殊的一维数组,特殊在这个一维数组当中的每一个元素是一个一维数组。
二、二维数组初始化
- 静态初始化:int[][] array = {{1,1,1},{2,3,4,5},{0,0,0,0},{2,3,4,5},{2,3,4,5},{2,3,4,5},{2,3,4,5}};
- 动态初始化:int[][] array = new int[3][4];;
三、二维数组中元素的读
- 定义一个二维数组数组:int[][] array = {{1,1,1},{2,3,4,5},{0,0,0,0}};
- 我们可以把上面的二维数组看做定义了一个一维数组,一维数组里面的每一个元素分别定义一个一维数组;
- 那假如我们要取array[1][2]的值,那么我们就要先找到第二个一维数组:{2,3,4,5},然后找到里面的第三个值,那就是 4 了。
相关链接:
链接: 012-Object类.
链接: 011-面向对象进阶(final关键字,抽象类,接口).
链接: 010-面向对象三大特性.