一、数组概述
1.1、数组概念
数组(Array),是多个相同类型数据一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
1.2、 数组的特点:
- 1 数组是序排列的
- 2 数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型
- 3 创建数组对象会在内存中开辟一整块连续的空间
- 4 数组的长度一旦确定,就不能修改。
1.3、数组的定义
- 数组的创建:
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
- 声明数组变量
必须在程序中声明数组,并指定数据类型;声明数据类型为int,容器使用数组那么如何标识数组呢?在java中我们使用[]符号标识,然后接着是定义数组的名称为arr,格式为 int[] arr。注意:int x[] 也是一种创建数组的格式。推荐使用int[] x 的形式声明数组。 - 创建数组
要使用一个新的关键字叫做new,new 用来在内存中产生一个容器实体,数据要存储是需要有空间的,存储很多数据的空间用new 操作符来开辟,new int[5]; 这个5是元素的个数。右边这部分就是在内存中定义了一个真实存在的数组,能存储5个元素。注意:new int[5] 做了两件事情,首先使用new int[3] 创建了一个数组,然后把这个数组的引用赋值给数组变量x。
思考: arr是属于什么数据类型?
任何一个变量都得有自己的数据类型。注意这个arr不是int 类型的 。int 代表的是容器里边元素的类型。那么x 是数组类型的,数组是一种单独的数据类型。数据类型分为2大派,分为基本数据类型和引用数据类型。 第二大派是引用数据类型。那么大家现在已经接触到了引用数据类型三种当中的一种。就是数组类型 [] 中括号就代表数组。
思考: int[] arr = new int[5];在内存中发生了什么?
内存任何一个程序,运行的时候都需要在内存中开辟空间.int[] arr = new int[5]; 这个程序在内存中是什么样?这就涉及到了java虚拟机在执行程序时所开辟的空间,那么Java开辟启动了多少空间呢?在后面我们会深入介绍。
定义数组主要有两种格式:
格式一:
元素类型[] 数组名 = new 元素类型[元素个数或数组长度]; 示例:int[] arr1 = new int[5]; 示例:float[] arr2 = new float[5];
格式二:
元素类型[] 数组名 = new 元素类型[]{元素,元素,……}; int[] arr1 = new int[]{3,5,1,7}; float[] arr2 = {1.3,1.5,1.1,1.7};
注意: 给数组分配空间时,必须指定数组能够存储的元素个数来确定数组大小,体现了数组长度固定的特点;创建数组之后不能修改数组的大小。可以使用length 属性获取数组的大小。
1.4、数组的初始化
- 数组的声明与赋值
int[] arr = new int[2]; a[0] = 10; a[1] = 20;
另一种方式也可以直接明确数组的长度,以及数组中元素的内容:
int[] arr = new int[]{20,30,40}; int[] arr = {20,30,40};
如果数组初始化中不使用运算符new。需要注意:下列写法是错误的:
int[] arr; arr = {20,30,40};
初始化数组,必须将声明,创建,初始化都放在一条语句中个,分开会产生语法错误。
二、一维数组
2.1、一维数组的声明与初始化
正确的方式:
int num;//声明 num = 10;//初始化 int id = 1001;//声明 + 初始化 int[] ids;//声明 //1.1 静态初始化:数组的初始化和数组元素的赋值操作同时进行 ids = new int[]{1001,1002,1003,1004}; //1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行 String[] names = new String[5]; int[] arr4 = {1,2,3,4,5};//类型推断
错误的方式:
int[] arr1 = new int[]; int[5] arr2 = new int[5]; int[] arr3 = new int[3]{1,2,3};
2.2、一维数组元素的引用
通过角标的方式调用。
//数组的角标(或索引从0开始的,到数组的长度-1结束。 names[0] = "王铭"; names[1] = "王赫"; names[2] = "张学良"; names[3] = "孙居龙"; names[4] = "王宏志";//charAt(0)
2.3、数组的属性:length
System.out.println(names.length);//5 System.out.println(ids.length);
说明:
数组一旦初始化,其长度就是确定的。arr.length
数组长度一旦确定,就不可修改。
2.4、一维数组的遍历
for(int i = 0;i < names.length;i++){ System.out.println(names[i]); }
2.5、数组元素的默认初始化值
数组元素是整型:
0 数组元素是浮点型:0.0
数组元素是char型:0或’\u0000’,而非’0’
数组元素是boolean型:false
数组元素是引用数据类型:null
三、二维数组
数组属于引用数据类型数组的元素也可以是引用数据类型
一个一维数组A的元素如果还是一个一维数组类型的,则此数组A称为二维数组。
3.1、二维数组的声明与初始化
正确的方式:
int[] arr = new int[]{1,2,3};//一维数组 //静态初始化 int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}}; //动态初始化1 String[][] arr2 = new String[3][2]; //动态初始化2 String[][] arr3 = new String[3][]; //也是正确的写法: int[] arr4[] = new int[][]{{1,2,3},{4,5,9,10},{6,7,8}}; int[] arr5[] = {{1,2,3},{4,5},{6,7,8}};//类型推断
3.2、如何调用二维数组元素:
System.out.println(arr1[0][1]);//2 System.out.println(arr2[1][1]);//null arr3[1] = new String[4]; System.out.println(arr3[1][0]); System.out.println(arr3[0]);//
3.3、二维数组的属性:
System.out.println(arr4.length);//3 System.out.println(arr4[0].length);//3 System.out.println(arr4[1].length);//4
3.4、遍历二维数组元素
for(int i = 0;i < arr4.length;i++){ for(int j = 0;j < arr4[i].length;j++){ System.out.print(arr4[i][j] + " "); } System.out.println(); }
3.5、二维数组元素的默认初始化值
规定:二维数组分为外层数组的元素,内层数组的元素 int[][] arr = new int[4][3];
外层元素:arr[0],arr[1]等 内层元素:arr[0][0],arr[1][2]等 ⑤ 数组元素的默认初始化值
针对于初始化方式一:比如:int[][] arr = new int[4][3]; 外层元素的初始化值为:地址值
内层元素的初始化值为:与一维数组初始化情况相同 针对于初始化方式二:比如:int[][] arr = new int[4][];
外层元素的初始化值为:null 内层元素的初始化值为:不能调用,否则报错。
四、数组算法
了解以上数组的使用之后,我们需要手写出一下问题:
- 数组的创建与元素赋值:
杨辉三角(二维数组)、回形数(二维数组)、6个数,1-30之间随机生成且不重复。 - 针对于数值型的数组:
最大值、最小值、总和、平均数等 - 数组的赋值与复制
- 数组元素的反转
- 数组中指定元素的查找:搜索、检索
- 数组的排序算法
五、总结- 为什么数组的索引从0开始?
1、为什么索引是从0开始的,而不是从1开始呢?这是继承了汇编语言的传统,从0开始更利于计算机做二进制的运算和查找。
2、数组长度使用length属性获得,但实际上这个属性只能表示一个一维数组的长度。二维数组length属性呢
3、数组会发生哪些异常呢