目录
简介
如果程序需要5个int类型的变量,利用我们学到的基础知识,我们可以利用以下代码声明变量:
int a1,a2,a3,a4,a5;
可是突然有一天我们需要声明一百个变量时,我们该怎么办呢?总不能复制一百次吧?
为了解决这个办法,我们就需要学习数组的知识。
数组是相同类型的变量顺序组成的一种复合数据类型(数组是一些类型相同的变量组成的集合),称这些相同类型的变量为数组的元素或单元。
数组概论总结
- 一次性声明大量变量
- 要储存的类型数据相同
数组定义格式
声明一维数组有以下两种格式
格式一:
//数组类型 [] 数组名
int [] arr;
//定义一个数组,数组名为arr
格式二:
//数组类型 数组名[]
char arr[];
//定义一个char类型的变量,变量名为arr的数组
可以一次性声明多个数组:
int [] a,b,c,d,e;
数组初始化概论
Java中的数组必须先初始化,然后才能使用
所谓的初始化:就是为了数组中的数组元素分配内存空间,并为每个数组元素赋值
动态初始化
动态初始化:初始化时只指定数组长度,由系统为数组分配初始化值
格式:数据类型 [] 变量名 = new 数据类型[数据长度];
示范:
int [] arr = new int[3];
解析:
- int []:说明这是一个int类型的数组
- arr :数组名称
- new :为数组申请内存空间
- int [3]:说明这是一个int类型的数组,3为数组的长度,就是数组中存放元素的个数
数组元素的赋值及使用
在赋值前,需要先了解索引。索引是数组中数据的编号方式。
- 作用:索引用于访问数组中的数据使用,数组名[索引]等同与变量名,是一种特殊的变量名
- 特征1:索引从0开始
- 特征2:索引是连续的
- 特征3:索引逐一增加,每次加1
我们尝试访问数组中的元素,在没赋值之前,数组中的数据均为0。
数组赋值
格式:数组名[索引] = 常量
示范:
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
静态初始化
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度
- 格式: 数据类型[] 变量名 = new 数据类型[] {数据1,数据2,数据3,......};
- 范例: int[] arr = new int[] {1,2,3};
- 简化格式: 数据类型[] 变量名 = {数据1,数据2,数据3,......};
- 范例: int[] arr ={1,2,3};
多个静态数组初始化:
int arr[] = {1,2,3},arr1 [] ={5,6,7};
二维数组
一个二维数组是由若干个一维数组构成的,利用Excel中的表格就可以很形象的表现出一个二维数组。
像这个表格就能表示出一个二维数组(图中表示一个3行2列的二维数组)
声明二维数组:
- 数组类型 数组名[] [];
- 数组类型 [] [] 数组名;
动态初始化
声明二维数组后new运算为数组分配空间:
int arr[][] = new int[3][2];
上诉创建的二维数组arr就可以表示3行2列
二维数组赋值示范:
arr[0][0] = 1;
arr[0][1] = 1;
静态初始化
静态初始化可以为每个一位数组分配长度不同的元素
格式:数据类型 二维数组名称[] = { {第一行元素},{第二行元素}}
示范:
int arr[][] = {
{1},
{2,3,4},
{5,6}
};
System.out.println(arr[0][0]);
System.out.println(arr[2][1]);
数组中的内存分配
java程序运行时,需要在内存中分配空间,为了提高运算效率,就对空间进行不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
我们为数组分配好内存单位后,不加索引去打印这个数组时,就可以看到数组在内存单元中的地址。
需要注意的是,对于char类型数组,System.out.println()打印数组名时,并不会打印内存单元的地址,而是打印数组中全部元素的值。
当你想打印char类型数组的内存单元的地址时,需要将数组和字符串做并置运算。
char a[] = {'h','e','l','l','o',' ','w','o','r','l','d'};
System.out.println(""+a);
以int数组为例在初始化时,会为储存空间添加默认值:
- 整数 :默认值0
- 浮点数:默认值0.0
- 布尔值:默认值false
- 字符:默认值空字符
- 引用数据类型:默认值是null
注意
- 栈内存储存的变量为局部变量 使用完会消失
- 堆内存会储存空间添加的默认值,每个new出来的东西都有一个地址值
- 使用完毕会被垃圾回收器回收
当我们给数组中元素赋值时,堆内存就会发生改变
当一个数组创建好内存空间后,将一个数组赋值给另一个数组(两个数组类型必须相同)。
会产生多个数组指向同一个地址。
所以,当你修改了数组arr2中的元素时,你会发现,数组arr中的元素也发生了改变
二维数组中内存分配
数组常见异常
- 索引越界:访问了数组中不存在的索引对应的元素,照成索引越界问题
- 空指针异常:访问的数组已经不再指向堆内存的数据,照成空指针异常
数组索引越界
ArrayIndexOutOfBoundsException
你只创建了3个空间位置,但你要获取第四个空间的变量。
空指针异常
NullPointerException
数组在栈内存中已经没有内存单元地址了,如果我们还向内存单元中获取元素,会进行空指针报错
数组中常见操作
遍历数组
length是用来获取数组的元素个数
在for循环中,利用arr.length来做条件判断语
int arr[] = {1,2,3,4};
for (int i = 0 ;i<arr.length;i++){
System.out.println(arr[i]);
获取最大值
int arr[] = {11,2,333,44};
int max = arr[0];
for (int i = 0 ;i<arr.length;i++){
if(arr[i] > max){
max = arr[i];
}
}
System.out.println(max);