1.java语言中的数组是一种引用数据类型。不属于基本数据类型。数组的父类是Object
2.数组实际上是一个容器,可以同时容纳多个元素
3.数组当中可以存储基本数据类型的数据,也可以存储引用数据类型的数据
4.数组是存储在堆内存当中的
5.数组当中如果存储的是java对象的话,实际上存储的是对象的引用(内存地址)
6.数组一旦创建,在java中规定,长度不可变。【数组长度不可变】
7.数组的分类:一维数组,二维数组,多维数组
8.所有的数组对象都有length属性用来获取数组中元素的个数
9.java中的数组要求数组中元素的类型统一。比如int类型数组只能存储int类型,Person类型数组只能存储Person类型
10.数组在内存方面存储的时候,数组的元素内存地址是连续的,这是数组存储元素的特点
11.数组实际上是一种简单数据结构
12.所有的数组都是拿第一个元素的内存地址作为整个数据对象的内存地址
13.数组的每一个元素都是有下标的,下标从0开始,以1递增。最后一个元素的下标是lenth-1。
14.下标非常重要,因为我们对数组中元素进行存取的时候,都需要通过下标来进行
15.数组这种数据结构的优点和缺点:
优点:查询/查找/检索某个下标上的元素的时候效率极高。可以说是查询速率最高的一个数据结构。
缺点:
第一:由于为了保证数组中每个元素的内存地址来连续,所以在数组上随机删除或者增加元素的时候,效率较低,因为随机增删元素会涉及到后面元素统一向前或向后移位的操作
第二:组数不能存储大数据量,因为很难在内存空间上找到一块特别大的连续的内存空间
16.为什么检索速率高:
第一:每一个元素的内存地址在空间存储上是连续的
第二:每一个元素类型相同,所以占用空间大小一样
第三:知道第一个元素内存地址,知道每一个元素占用空间的大小,又知道下标,所以通过一个数学表达式就可以计算出某个下标上元素的内存地址,直接通过内存地址定位元素所以数组的检索效率最高
数组中存储100的元素,或者存储100万个元素,在元素查询/检索方面,效率是相同的,因为数组中元素查找的时候不会一个一个找,是通过数学表达式计算出来的(算出一个内存地址,直接定位)
17.对于数组中最后一个元素的增减,是没有效率影响的
18.定义一维数组语法格式:
int[] array1;
double[] array2;
boolean[] array3;
String[] array4;
Object array5;
19.初始化一维数组语法格式:
静态初始化:
int[] array = {100,200,300}
动态初始化:
int[] array = new int[5];//这里的5表示数组中元素的个数,每个元素的默认值为0
20.main方法上面的String[] args 有什么用
JVM调用调用main方法是,会自动传递一个String数组过来,默认长度为0
21.这个数组什么时候会有值
其实这个数组是留给用户的,用户可以在控制台上输入参数,这个参数会自动转换为"String[] args"
例如:
运行java ArrayTest abc def xyz
那么这个时候JVM会自动将“abc def xyz"通过空格的方式进行分离,分离完成之后,自动放到"String[] args"数组
所以main方法上面的String[] args数组主要是用来接收用户输入参数的
把abc def xyz转换为数组:{"abc","def","xzy"]
22.数组中存储的元素类型为引用数据类型
对于数组来说,实际上只能存在java对象的内存地址,数组中存储的每个元素的引用
23.数组扩容
java对数组的扩容是:
先新建一个大容量的数组,然后将小容量的数据一个一个的拷贝到大容量的数据当中
数组的扩容效率较低,因为涉及到拷贝的问题。所以在开发中要尽可能少的进行数组的拷贝。可以在创建数组对象的时候预估计一下多长合适,最好准确估计,这样可以减少扩容的次数,提高效率
24.数组拷贝
System.arraycopy(拷贝源,开始拷贝的起始位置,拷贝目标,开始拷贝的位置,拷贝长度);例如:System.arraycopy(a,0,b,1,2);//表示从a[0]的前2个元素拷贝到从b[1]开始的内存空间中
25.二维数组
- 二维数组其实是一个特殊的一维数组,特殊在这个一维数组当中的每一个元素是一个一维数组
- 三维数组是一个特殊的二维数组,特殊在这个二维数组中每一个元素都是一个一维数组
- 实际开发中使用最多的是一维数组,二维数组用得很少,三维数组基本不用
- 二维数组初始化:int[][] array = { {1,1,1},{2,2,2},{3,3,3}};
- 二维数组的元素访问:a[二维数组的一维数组的下标][一维数组的下标]