数组是指一组数据的集合,数组中的每个数据被称作元素。
在数组中可以存放任意类型的元素,但同一个数组里存放的元素类型必须一致。
1数组的定义和初始化
数据类型[] 数组名 = new 数据类型[元素个数或数组长度];
(数据类型就是两种:基本数据类型和引用数据类型)
int[] x = new int[100];
这条语句就相当于在内存中定义了100个int类型的变量,第一个变量的名称为x[0],第二个变量的名称为x[1],以此类推,第100个变量的名称为x[99],这些变量的初始值都是0。
数组长度用一个属性length表示:x.length。
1.1 Java虚拟机运行时数据区包括五部分
Java是在虚拟机上运行,而虚拟机是在内存运行,
Jvm在内存上开辟一块空间,分五部分:(345重要)
1)寄存器:处理cpu相关的
2)本地方法栈:与操作系统有关的
3)方法和数据共享区:class文件进入的地方
4)栈:程序中所有方法进入的地方,变量也进栈,基本数据类型进栈
5)堆:程序中所有容器和对象进入的地方,引用数据类型进堆
1.2
当数组被成功创建后,数组中元素会被自动赋予一个默认值,根据元素类型的不同,默认初始化的值也是不一样的
表1-1 元素默认值
数据类型 |
默认初始化值 |
byte、short、int、long |
0 |
float、double |
0.0 |
char |
一个空字符(空格),即’u0000’ |
boolean |
false |
引用数据类型 |
null,表示变量不引用任何对象 |
例:
class Demo04 { public static void main(String[] args) { //定义数组1 int[] arr=new int[3]; //赋值 arr[0]=2; System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); System.out.println(arr); //结果是一个地址 System.out.println(arr.length); //数组长度 } }
可以再定义一个数组等于这个数组,但是类型必须相同:
Int[] arr1=arr; //就是把地址赋值给新的数组变量
1.3变量引用数组的情况图示说明:
步骤说明:
1).class文件进入方法和数据共享区,找到main方法
2)main方法进入栈,遇到new,就创建一个数组容器,进入堆
3)数组长度是3,就在堆中开辟了三块空间,分别有一个“门牌号”,就是下标:0,1,2,并分别存入默认值0
4)给数组分配一个地址
5)把这个地址赋值给变量arr
6)通过arr找到数组的地址,然后找到下标为0的元素,改变其值为2
7)通过arr找到数组元素,并打印出里面的值:2,0,0
1.4
在定义数组时只指定数组的长度,由系统自动为元素赋初值的方式称作动态初始化。
在初始化数组时还有一种方式叫做静态初始化,就是在定义数组的同时就为数组的每个元素赋值。数组的静态初始化有两种方式:
1)类型[] 数组名 = new 类型[]{元素,元素,……};
2)类型[] 数组名 = {元素,元素,元素,……};
为了简便,建议采用第二种方式
例:
class Demo04 { public static void main(String[] args) { //定义数组2 String[] arr2=new String[]{"中国","你好","DG","shit"}; System.out.println(arr2[0]); System.out.println(arr2[1]); System.out.println(arr2[2]); System.out.println(arr2[3]); } }
class Demo04 { public static void main(String[] args) { //定义数组3 double[] arr3={1.2,2.4,3.6,4.8}; System.out.println(arr3[0]); System.out.println(arr3[1]); System.out.println(arr3[2]); System.out.println(arr3[3]); } }
2数组遍历
在操作数组时,经常需要依次访问数组中的每个元素,这种操作称作数组的遍历。
使用for循环来遍历数组:
class Demo05 { public static void main(String[] args) { //遍历数组 int[] arr={1,2,3,4,5,6,7,8,9,10}; for(int i=0;i<arr.length;i++){ System.out.println(arr[i]); } } }
3数组最值
例:获取数组中元素的最大值
public class ArrayDemo{ public static void main(String[] args){ int[] arr = { 4, 1, 6, 3, 9, 8 }; int max = arr[0]; //假设第一个元素为最大值 //遍历数组 for (int x = 1; x < arr.length; x++) { if (arr[x] > max) { //比较 arr[x]的值是否大于max max = arr[x]; //条件成立,将arr[x]的值赋给max } } System.out.println("max=" + max); } }
4数组异常
异常指程序中出现的错误,它会报告出错的异常类型、出错的行号以及出错的原因。(以后会再讲。出现异常,往往解决第一个后,后面的也跟着解决了)
4.1数组越界异常
每个数组的索引都有一个范围,即0~length-1。在访问数组的元素时,索引不能超出这个范围,否则程序会报错。
例:
class NullPoint { public static void main(String[] args) { int[] arr = new int[4]; System.out.println(arr[4]); } }
4.2空指针异常
在使用变量引用一个数组时,变量必须指向一个有效的数组对象,如果该变量的值为null,则意味着没有指向任何数组,此时通过该变量访问数组的元素会出现空指针异常。
例:
class NullPoint { public static void main(String[] args) { String[] arr2={"aaa","bbb","ccc"}; arr2=null; //把地址置为空,就找不到数组了 System.out.println(arr2[0]); //这时再访问数组元素就是空指针异常 } }
5二维数组
5.1定义
1)第一种方式:
int[][] arr = new int[3][4];
上面的代码相当于定义了一个3*4的二维数组,即二维数组的长度为3,二维数组中的每个元素又是一个长度为4的数组
2)第二种方式:
int[][] arr = new int[3][];
第二种方式和第一种类似,只是数组中每个元素的长度不确定。
3)第三种方式(最简洁,最常用)
int[][] arr = {{1,2},{3,4,5,6},{7,8,9}};
对二维数组中元素的访问也是通过角标的方式,如arr[0][1] 代表访问二维数组中第一个元素数组的第二个元素。
5.2二维数组遍历
class Demo08 { public static void main(String[] args) { //二维数组遍历 int[][] arr={{1,2,3,4},{5,6,7,8}}; for(int i=0;i<arr.length;i++){ for(int j=0;j<arr[i].length;j++){ System.out.print(arr[i][j]+" "); } System.out.println(); } } }
5.3数组元素累加和
例:
class Demo08 { public static void main(String[] args) { int sum=0; int[][] arr={{1,2,3,4},{5,6,7,8}}; for(int i=0;i<arr.length;i++){ for(int j=0;j<arr[i].length;j++){ sum+=arr[i][j]; //累加求和 } } System.out.println("sum="+sum); } }
6综合练习
练习1:
统计一个公司三个销售小组中每个小组的总销售额以及整个公司的销售额:
第一小组销售额为{11, 12}万元
第二小组销售额为{21, 22, 23}万元
第三小组销售额为{31, 32, 33, 34}万元。
class TotalSales { public static void main(String[] args) { int[][] sales={{11,12},{21,22,23},{31,32,33,34}}; int total=0; //总销售额 for(int i=0;i<sales.length;i++){ int group=0; //小组销售额 for(int j=0;j<sales[i].length;j++){ group+=sales[i][j]; } System.out.println("第"+(i+1)+"组销售额为:"+group+"万元"); total+=group; } System.out.println("总销售额为:"+total+"万元"); } }
练习2:随机点名
存储所有同学姓名
总览全班同学姓名
随机点名其中一人,打印到控制台
import java.util.Random; class CallName1 { public static void main(String[] args) { String[] namelist={"柯南","小兰","小哀","园子","服步","和叶","步美","光彦","元太"}; System.out.println("全班同学为:"); for(int i=0;i<namelist.length;i++){ System.out.print(namelist[i]+" "); } System.out.println(); Random r=new Random(); int n=r.nextInt(namelist.length); System.out.println("点到的同学为:"+namelist[n]); } }