1.数组的创建和初始化
1.动态初始化:在创建数组时,直接指定数组个数
T[] 数组名 = new T[N];
T : 类型名
N : 个数
new : 用来创建对象的关键字,用new创建的对象存放在堆上
例如
int[] arr = new int[5];
2.静态初始化:在创建数组时,不指定个数,而是直接赋值数组具体的内容
T[] 数组名 = new T[]{所赋值内容];
例如
int[] arr = new int[]{1,2,3,4,5};
静态初始化可以省略掉new T[],如下
int[] arr = {1,2,3,4,5};
3.注意事项
1.静态初始化的数组个数等于所赋值元素的个数
2.静态初始化里元素的类型要与数组的类型一致
3.一般来说数组的创建和初始化是同时进行的,但也可以分开写如下
int[] arr1;
arr1 = new int[10];
int[] arr2;
arr2 = new int[]{1,2,3,4,5};
但是这里的new int[]是不能省略的
4.
如果没有对数组进行初始化,数组中的元素有默认值,如果数组类型为基本数据类型,默认值如下
如果数组类型为引用类型,默认值为null
2.数组的使用
数组是相同类型元素的集合,在内存上是连续存放的,第一个元素的下标为0,第二个元素下标为1,以此类推,数组可以通过下标访问其元素。如下
int[] arr = new int[]{1,2,3};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
数组访问在[0,N)之间,不包括N,越界访问会出现异常
数组的遍历
数组的遍历指的是把数组中所有的元素访问一遍
分为两种方式
1.fori遍历
int[] arr = new int[]{1,2,3,4,5};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
2.for-each遍历
public class Demo1 {
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5};
for (int x: arr
) {
System.out.println(x);
}
}
}
每次循环取出arr中的一个元素放到x中,直到全部取出
3.数组类型
数据有两种类型,一种是基本数据类型,另一种是引用数据类型
基本数据类型创建的变量,其空间中存放的是值
引用数据类型创建的变量,其空间中存放的是地址
而数组是引用数据类型,接下来图解下数组与元素间的关系
假设现在有这样一个数组,它的地址为0x99
int[] arr = new int[]{1,2,3};
那么数组与元素间的关系是这样的
堆上创建了三个int类型的变量,1,2,3,且他们的地址是是连续的,arr中存放的是第一个元素1的地址,因此我们可以看出,引用变量并不存储对象本身,而是存储对象的地址,通过地址去操作对象
4.数组的应用场景
1.存放数据
public class Demo1 {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
2.函数传参
public class Demo1 {
public static void print(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
print(arr);
}
}
3.作为函数的返回值
public class Demo1 {
public static int[] fib(int x) {
if(x <= 0) {
return null;
}
if( x == 1) {
return new int[]{1};
}
if(x == 2) {
return new int[]{1,1};
}
int[] arr = new int[x];
arr[0] = 1;
arr[1] = 1;
for (int i = 2; i < x; i++) {
arr[i] = arr[i-1] + arr[i-2];
}
return arr;
}
public static void main(String[] args) {
int[] ret = fib(10);
for (int i = 0; i < ret.length; i++) {
System.out.println(ret[i]);
}
}
}
5.二维数组
初始化写法:
数据类型[][] 数组名称 = new 数据类型[][]{初始化内容};
示例
public class Demo1 {
public static void main(String[] args) {
int[][] arr = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
}
}
其内存分布如下图
二维数组的本质是多个一维数组,数组arr存储了3个具有三个元素一维数组的地址,就成为3×3的二维数组,因此想要遍历二维数组我们可以通过如下方式
public class Demo1 {
public static void main(String[] args) {
int[][] arr = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.println(arr[i][j]);
}
}
}
}
arr.length可以得到二维数组有多少行,即存储了几个一维数组的地址,通过每个地址找到所对应的一维数组,arr[i]则可以得到该一维数组的长度,通过这种方式就可以遍历整个二维数组了