我们经常用的就是定义一个变量并对其赋值,然而是否考虑过
如果定义了100个age变量并对其赋值,是不是很复杂呢?1000个呢?甚至更多。Java就引入数组这一概念解决这些问题。
数组
一、数组的概念
数组是相同数据类型的多个数据的容器(变量)。
这些元素按线性顺序排列。所谓线性顺序是指除第一个元素外,每一个元素都有唯一的前驱元素;除最后一个元素外,每一个元素都有唯一的后继元素。(“简单理解就是:一个跟一个顺序排列”)。
二、数组的创建格式
1. 一维数组
1.1 常用格式:
- 创建数组的同时,制定数组中的内容。
数据类型[] 数组名称 = {
数据1,数据2,数据3...数据n};
int[] ages = {
10,11,12,13,14};
- 创建数组, 并指定长度, 不指定数组中的内容。
数据类型[] 数组名称 = new 数据类型[数组长度];//数组长度通过int数据指定
int[] ages2 = new int[10];
1.2 不常用格式:
- 创建数组 , 不初始化
数据类型[] 数组名;
int[] nums;
- 创建数组, 并指定数组中的内容
数据类型[] 数组名称 = new 数据类型[]{
内容1,内容2,内容3...内容n};
int[] ages = new int[] {
11,12,13,14};
注意啦:
在不常用格式第一条中,如果想对nums数组赋值时,不能出现下面这种情况
解决办法就类似于不常用格式的第二条
因为数组属于 引用数据类型 ,需创建一个对象。
int[] nums ;
//nums[] = {10,20,30,40};
nums = new int[] {
30,10,50,40};
2. 二维数组
2.1 定义格式
- 数据类型[ ] [ ] 数组名
- 数据类型 数组名[ ] [ ]
- 数据类型[ ] 数组名[ ]
2.2 初始化
2.2.1 静态初始化
【分配空间的同时赋值】
- 数据类型[ ] [ ] 数组名 = new 数据类型[ ] [ ]{ {数据},{数据},{数据}…};
int[][] nums = new int[][]{
{
1,3,5},{
7,8,10},{
4,6,19}};
2.2.2 动态初始化
【分配空间与赋值分开进行】
- 数据类型[ ] [ ] 数组名 = new 数据类型[m] [n]; //m表示二维数组中一维数组的个数,n表示一维数组中的元素个数。
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args) {
/*
* 多维数组
*
* 创建格式:
* 数据类型[] 数组名 = new 数据类型[长度]
* int[][] tem = new int[10][];
*/
int[][] tem = new int[10][];
// tem[0] = {1, 2, 3}; // 这样写会报错
tem[0] = new int[]{
1, 2, 3};
System.out.println(" 该数组的值为 " + tem[0][2]);
}
}
运行结果:
该数组的值为 3
三、数组的常见问题
首先,我们理解下数组的下标和数组的长度 二者之间的关系。
下标可以理解为数组中内容的数字序号,从 0 开始 ,对于长度为 n 的数组,下标的范围是 0~n-1。
可以通过下标的方式访问数组中的每一个元素。
注意:数组的长度在创建时就固定了。
int[] arr = new int[10];
arr[5] = 123;
System.out.println(arr[5]);
接着我们就谈谈数组的常见问题。
- 数组下标越界问题:超出长度的下标操作
//int[] nums = {10,11,12,13,14};
//System.out.println(nums[5]);
-
空指针问题:数组未赋值(说白了就是名称与值未绑定)
如上图可知:在局部变量中定义数组并未对其赋值,要想输出结果,此时会报错,为什么呢?是因为在局部变量的数组未对其赋值,就相当于未定义,而导致报错!
那在全局变量中会如何呢?让我们看看下面这张图吧!
运行结果:
说明在全局变量中定义未赋值的数组,系统会默认给它一个null值。
int[] nums = null;
System.out.println(nums[1]);