java学习第六天(数组)

\r\n是windows中的换行符

数组与定义数组:

需求:现在需要统计某公司员工的工资情况,例如计算平均工资、找到最高工资等。

假设该公司有80名员工,用前面所学的知识,程序首先需要声明80个变量来分别记住每位员工的工资,然后在进行操作,

这样做会显得很麻烦。为了解决这种问题,Java就提供了数组供我们使用。

那么数组到底是什么呢?有什么特点呢?通过上面的分析:我们可以得到如下两句话:

1、数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。

2、数组既可以存储基本数据类型,也可以存储引用数据类型。

语句定义格式:

格式1:数据类型[] 数组名;

举例:int[] arr; 推荐第一种方式。

格式2:数据类型 数组名[];

举例:int arr[] 定义一个存放int类型数据的数组。

为什么不推荐使用第二种方式。

从辨识度来看,第一种一眼就能识别是一个数组。

从使用长久来看,今后使用的趋势是第一种,第二种渐渐会被淘汰。

数组不初始化不能被使用,初始化?

初始化就是给这个变量开辟一个内存空间,为将来的值提供存放的空间

那么数组如何初始化呢?

两种:

1、动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。

动态初始化的语句格式:

存放元素的数据类型[] 数组名 = new 存放元素的数据类型[数组的长度];

举例:定义一个可以存放3个int类型数据的数组。

int[] bigdata15 = new int[3];

2、静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。

注意动态初始化不能与静态初始化混合使用!!

public class ArrayDemo1 {

public static void main(String[] args) {

//第一种格式定义

// int[] arr;

//第二种格式定义

// int arr1[];

//没有初始化能直接赋值

// System.out.println(arr);

//动态初始化一个数组:定义一个可以存放3个int类型数据的数组。

/**

* 左半部分:

* int: 表示数组中存放元素的数据类型是int类型

* []: 表示是一个一维数组

* arr: 数组名字,符合标识符规则

*

* 右半部分:

* new: 就是为数组在堆内存中开辟一个内存空间

* int: 表示数组中存放元素的数据类型是int类型

* []: 表示是一个数组

* 3: 表示数组中最多可以存放元素的个数(数组本身的长度)

* ;: 表示一个语句的结尾

*

*/

int[] arr = new int[3];

//[I@4554617c arr数组在堆内存中的地址值,地址是一个十六进制的形式。

System.out.println(arr);

//我们仅仅获取的是一个地址值是没有任何意义的,

//我们更期望获取的是数组中的元素

//如何获取数组中的元素呢?

//java在数组中提供了一个类似于下标的说法,我们可以通过下标获取到该下标位置上的元素

//这个下标有一个专业的叫法:索引(index)

//从左往右编号,从0开始

// 举例:现在数组的长度是3,索引从0开始,最大可以到2,也就是长度-1

// 获取数组元素的格式:数组名[想要获取元素的对应索引]

System.out.println(arr[0]); //获取第一个元素 0

System.out.println(arr[1]); //获取第二个元素 0

System.out.println(arr[2]); //获取第三个元素 0

}

}

java中数组提供了一个属性供我们使用,可以获取数组的长度

这个属性叫做:length

使用格式:数组名.length

栈:局部变量和方法的调用

堆:new出来的东西都在堆里面

方法区(面向对象的时候讲解)

本地方法区

寄存器

数组中的元素进行赋值

public static void main(String[] args) { int [] arr=new int[3]; //手动赋值 //给数组中第一个元素进行赋值 arr[0] = 10; //给数组中第二个元素进行赋值 arr[1] = 20; //给数组中第三个元素进行赋值 arr[2] = 30; System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); } }

例子:

定义两个数组并赋值输出数组名和元素值

public static void main(String[] args) { int [] arr=new int[3]; arr[0]=11; arr[1]=22; arr[2]=33; System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); int arr1[]=new int[3]; arr1[0]=1; arr1[1]=2; arr1[2]=3; System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); } }

定义两个数组,先定义一个数组,赋值,输出。

然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。

然后给第二个数组赋值,再次输出两个数组的名及元素。

public static void main(String[] args) { int arr[]=new int[3]; arr[0]=1; arr[1]=2; arr[2]=3; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); int arr1[]=arr; arr1[0]=4; arr1[1]=5; System.out.println(arr); System.out.println(arr1); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); } } 结果: [I@4554617c 1 2 3 [I@4554617c [I@4554617c 4 5 3

一维数组的静态初始化:初始化时指定每个数组元素的初始值,由JVM决定数组长度。(JVM根据我们给的元素个数自动推断长度)

静态初始化的语句格式:

数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,元素4...};

举例:int[] arr = new int[]{11,22,33,44,55};

表示的是定义一个存放5个int类型元素的数组,元素分别是11,22,33,44,55

简化写法:

数据类型[] 数组名 = {元素1,元素2,元素3,元素4...};

举例:int[] arr = {100,200,300,400};

表示的是定义一个存放4个int类型元素的数组,元素分别是100,200,300,400

public static void main(String[] args) { int[] arr ={100,200,300,400}; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); } } 结果 [I@4554617c 100 200 300

数组中常见的错误:

1、ArrayIndexOutOfBoundsException: 5 数组索引越界异常

访问了不该访问的索引。就是取的值超过了数组的定义的长度

2、NullPointerException 空指针异常就是定义了数组为NULL导致无法输出

题目

数组遍历(依次输出数组中的每一个元素)

public static void main(String[] args) { int[] arr = {11,22,33,44,55,66,77,88}; for (int i=0;i< arr.length;i++){ if (i==0){ System.out.print("["+arr[i]+","); }else if (i==arr.length-1){ System.out.print(arr[i]+"]"); }else{ System.out.print(arr[i]+","); } } System.out.println("\r\n======将打印数组封装成一个方法=========="); print(arr); } public static void print(int [] arr){ for (int i=0;i< arr.length;i++){ if (i==0){ System.out.print("["+arr[i]+","); }else if (i==arr.length-1){ System.out.print(arr[i]+"]"); }else{ System.out.print(arr[i]+","); } } } } 结果: [11,22,33,44,55,66,77,88] ======将打印数组封装成一个方法========== [11,22,33,44,55,66,77,88]

数组获取最值(获取数组中的最大值最小值)

public static void main(String[] args) { int[] arr = {11, 22, 33, 44, 885, 5, 66, 77}; int max = arr[0]; for (int i = 0; i < arr.length; i++) { if (arr[i] > max) { max = arr[i]; } } System.out.println("数组中最大值为:" + max); System.out.println("\t\r==============用方法改进=============="); int MAX = printMax(arr); System.out.println("数组中最大值为:" + MAX); } public static int printMax(int[] arr) { int max = arr[0]; for (int i = 0; i < arr.length; i++) { if (arr[i] > max) { max = arr[i]; } } return max; } } 结果为 数组中最大值为:885 ==============用方法改进============== 数组中最大值为:885

数组元素逆序 (就是把元素对调)

public static void main(String[] args) { System.out.println("倒序前数组:"); int[] arr = {11, 22, 33, 44, 88, 5, 66, 77}; print(arr); int[] DaoXu = printDaoxu(arr); System.out.println("\r\n倒序后数组:(第一种方法数对调)"); print(DaoXu); System.out.println("\r\n倒序后数组:(第二种方法创建一个新数组并且把原来的数组以倒序方式输入进去)这里是把arr第一个给arr2最后一个依次执行"); int[] DaoXu2 = printDaoxu2(arr); print(DaoXu2); System.out.println("\r\n倒序后数组:(第二种方法创建一个新数组并且把原来的数组以倒序方式输入进去)这里是把arr最一个后给arr2第一个依次执行"); int[] DaoXu3 = printDaoxu3(arr); print(DaoXu3); System.out.println("\r\n倒序后数组:(第三种方法创建指针)"); int[] DaoXu4 =printDaoxu4(arr); print(DaoXu4); } public static void print(int[] arr) {//调用输出 for (int i = 0; i < arr.length; i++) { if (i == 0) { System.out.print("[" + arr[i] + ","); } else if (i == arr.length - 1) { System.out.print(arr[i] + "]"); } else { System.out.print(arr[i] + ","); } } } public static int[] printDaoxu(int[] arr) {//第一方法 for (int i = 0; i < arr.length / 2; i++) { int temp = arr[i]; arr[i] = arr[arr.length - 1 - i]; arr[arr.length - 1 - i] = temp; } return arr; } public static int[] printDaoxu2(int[] arr) {//第二种方法1 int arr2[] = new int[arr.length]; for (int j = arr.length - 1; j >= 0; j--) { arr2[arr2.length - 1 - j] = arr[j]; } return arr2; } public static int[] printDaoxu3(int[] arr) {//第二种方法2 int[] arr3 = new int[arr.length]; for (int k = 0; k < arr3.length; k++) { arr3[k] = arr[arr.length - 1 - k]; } return arr3; } public static int[] printDaoxu4(int[] arr) { for (int start = 0, end = arr.length - 1; start <= end; start++, end--) { int temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; } return arr; } } 结果为: 倒序前数组: [11,22,33,44,88,5,66,77] 倒序后数组:(第一种方法数对调) [77,66,5,88,44,33,22,11] 倒序后数组:(第二种方法创建一个新数组并且把原来的数组以倒序方式输入进去)这里是把arr第一个给arr2最后一个依次执行 [11,22,33,44,88,5,66,77] 倒序后数组:(第二种方法创建一个新数组并且把原来的数组以倒序方式输入进去)这里是把arr第一个给arr2第一个依次执行 [11,22,33,44,88,5,66,77] 倒序后数组:(第三种方法创建指针) [11,22,33,44,88,5,66,77]这里要使得这一种方法运行需要把前面几种方法注释 Process finished with exit code 0

数组查表法(根据键盘录入索引,查找对应星期)JVM将内存划分成的5个部分,

public static void main(String[] args) { String[] week = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}; Scanner wy = new Scanner(System.in); System.out.println("请输入数字1-7"); boolean j=true; while (j){ int i = wy.nextInt(); if (i >= 1 && i <= 7) { System.out.println(week[i - 1]); j = false; } else { System.out.println("您输入有误请重新输入"); } } } } 结果: 请输入数字1-7 9 您输入有误请重新输入 8 您输入有误请重新输入 6 星期六

通过键盘输入数组并且输出(在上面调用这个方法可以调用这个函数)

public static void main(String[] args) { int arr1[] = printshuzhu(); System.out.println(arr1); } public static int[] printshuzhu() { Scanner wy = new Scanner(System.in); System.out.println("请输入定义数组的长度"); int x = wy.nextInt(); int[] arr = new int[x]; System.out.println("请输入数组对应的数值:|(输入数值个数不可以超过定义长度)"); for (int i = 0; i < x; i++) { arr[i] = wy.nextInt(); } System.out.println("输出数组"); for (int i = 0; i < x; i++) { if (i == 0) { System.out.print("[" + arr[i] + ","); } else if (i == x - 1) { System.out.print(arr[i] + "]"); } else { System.out.print(arr[i] + ","); } } return arr; } } 请输入定义数组的长度 3 请输入数组对应的数值:|(输入数值个数不可以超过定义长度) 1 2 3 输出数组 [1,2,3][I@29453f44 结果: 请输入定义数组的长度 3 请输入数组对应的数值:|(输入数值个数不可以超过定义长度) 1 2 3 输出数组 [1,2,3]

数组元素查找(查找指定元素第一次在数组中出现的索引)

public class Days6 {//键盘定义数组长度并且输入数组 public static void main(String[] args) { int arr1[] = printshuzhu();//调用键盘录入数组 System.out.println(arr1); print(arr1);//输出数组 System.out.println("\n\r数组元素查找(查找指定元素第一次在数组中出现的索引)"); Scanner wy=new Scanner(System.in); System.out.println("\n\r请输入你要查找的元素"); int number = wy.nextInt(); for (int i =0;i< arr1.length;i++){ if (arr1[i]==number){ System.out.println(number+"在数组中第一次出现的索引为"+i); break; }else if (number!=arr1[i]){ System.out.println("您要查找的元素"+number+"不在数组中!"); break; } } } public static int[] printshuzhu() {//键盘录入数组 Scanner wy = new Scanner(System.in); System.out.println("请输入定义数组的长度"); int x = wy.nextInt(); int[] arr = new int[x]; System.out.println("请输入数组对应的数值:|(输入数值个数不可以超过定义长度)"); for (int i = 0; i < x; i++) { arr[i] = wy.nextInt(); } System.out.println("输出数组"); for (int i = 0; i < x; i++) { if (i == 0) { System.out.print("[" + arr[i] + ","); } else if (i == x - 1) { System.out.print(arr[i] + "]"); } else { System.out.print(arr[i] + ","); } } return arr; } public static void print(int [] arr){//输出数组 for (int i=0;i< arr.length;i++){ if (i==0){ System.out.print("["+arr[i]+","); }else if (i==arr.length-1){ System.out.print(arr[i]+"]"); }else{ System.out.print(arr[i]+","); } } } } 结果: 请输入定义数组的长度 3 请输入数组对应的数值:|(输入数值个数不可以超过定义长度) 1 2 3 输出数组 [1,2,3][I@29453f44 [1,2,3] 数组元素查找(查找指定元素第一次在数组中出现的索引) 请输入你要查找的元素 1 1在数组中第一次出现的索引为0

2、二维数组:元素是由一维数组组成的数组

定义格式一:

数据类型[][] 数组名 = new 数据类型[m][n];

m:表示的是有多少个一维数组

n:表示的一维数组的元素个数

举例:int[][] arr = new int[3][2];

表示的是定义一个有3个长度为2的一维数组组成的二维数组。

还有可能看到以下几个写法,它们也是正确的:

1、int[] arr[] = new int[3][2];

2、int arr[][] = new int[3][2];

int[][] arr = new int[3][2]; System.out.println(arr); // [[I@4554617c System.out.println(arr[0]); // [I@74a14482 System.out.println(arr[1]); // [I@1540e19d System.out.println(arr[2]); // [I@677327b6 //想获取第一个一维数组中的第一个元素怎么办呢? //首先,得获取第一个一维数组 // int[] array1 = arr[0]; // //然后通过索引获取第一个元素 // System.out.println(array1[0]); System.out.println(arr[0][0]); System.out.println(arr[0][1]); //获取二维数组中第一个一维数组中的第二个元素 //ArrayIndexOutOfBoundsException: 2 // System.out.println(arr[0][2]); //获取二维数组中第一个一维数组中的第二个元素 System.out.println(arr[1][0]); //获取二维数组中第二个一维数组中的第一个元素 System.out.println(arr[1][1]); //获取二维数组中第二个一维数组中的第二个元素 System.out.println(arr[2][0]); //获取二维数组中第三个一维数组中的第一个元素 System.out.println(arr[2][1]); //获取二维数组中第三个一维数组中的第二个元素 } } 结果 [[I@4554617c [I@74a14482 [I@1540e19d [I@677327b6 0 0 0 0 0 0

定义格式二:

数据类型[][] 数组名 = new 数据类型[m][];

m:表示的是有多少个一维数组

举例:int[][] arr = new int[4][];

int[][] arr = new int[3][]; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); //给二维数组种第一个元素赋值一个一维数组 //赋值后的意义是:表示二维数组种第一个元素是一个长度为4的int类型的一维数组。 arr[0] = new int[4]; //赋值后的意义是:表示二维数组种第二个元素是一个长度为5的int类型的一维数组。 arr[1] = new int[5]; //赋值后的意义是:表示二维数组种第三个元素是一个长度为10的int类型的一维数组。 arr[2] = new int[10]; System.out.println(arr); //二维数组的地址值 System.out.println(arr[0]); //二维数组中第一个一维数组的地址值 System.out.println(arr[1]); //二维数组中第二个一维数组的地址值 System.out.println(arr[2]);//二维数组中第三个一维数组的地址值 } } 结果: [[I@4554617c null null null [[I@4554617c [I@74a14482 [I@1540e19d [I@677327b6

定义格式三:

数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2...},{元素1,元素2,元素3...},...};

简化格式:数据类型[][] 数组名 = {{元素1,元素2...},{元素1,元素2,元素3...},...};

int[][] arr = {{1,2},{3,4,5},{1,2,34,5}}; System.out.println(arr); //二维数组的地址值 System.out.println(arr[0]); //二维数组第一个一维数组的地址值 System.out.println(arr[1]);//二维数组第二个一维数组的地址值 System.out.println(arr[2]);//二维数组第三个一维数组的地址值 //获取二维数组中第一个一维数组的第一个元素 System.out.println(arr[0][0]); System.out.println(arr[0][1]); //获取二维数组中第二个一维数组中所有元素 System.out.println(arr[1][0]); System.out.println(arr[1][1]); System.out.println(arr[1][2]); //获取二维数组中第三个一维数组中所有元素 System.out.println(arr[2][0]); System.out.println(arr[2][1]); System.out.println(arr[2][2]); System.out.println(arr[2][3]); // System.out.println(arr[2][4]); } }

注意:

1、以下几种写法也是二维数组

数据类型[] 数组名[];

数据类型 数组名[][];

2、格式3不能与格式1、格式2混合使用。

错误格式:int[][] arr = new int[2][]{{1,2},{3,1,2}};

需要掌握二维数组的遍历方式,结合着一维数组遍历方式去看

二维数组遍历

String[][] shujia = {{"小王", "小李"}, {"小明", "小刘", "小张"}, {"小虎", "小宇", "小旺", "小凯"}, {"小火", "小杨", "小爱", "小周"}}; for (int i = 0; i < shujia.length; i++) { // System.out.println(shujia[i]); //外层循环遍历到的是每一个一维数组 //要想获取每个一维数组中的元素,再进行一次for循环遍历 System.out.println("第" + (i + 1) + "个数组:"); for (int j = 0; j < shujia[i].length; j++) { // System.out.println(shujia[i][j]); if (j == shujia[i].length - 1) { System.out.print(shujia[i][j] + "]"); } else if (j == 0) { System.out.print("[" + shujia[i][j] + ","); } else { System.out.print(shujia[i][j] + ","); } } //每次内循环结束表示打印完一个一维数组,换行 System.out.println(); } } } 结果: 第1个数组: [小王,小李] 第2个数组: [小明,小刘,小张] 第3个数组: [小虎,小宇,小旺,小凯] 第4个数组: [小火,小杨,小爱,小周]

公司年销售额求和

某公司按照季度和月份统计的数据如下:单位(万元)

第一季度:22,66,44

第二季度:77,33,88

第三季度:25,45,65

第四季度:11,66,99

int [][] arr={{22, 66, 44}, {77, 33, 88}, {25, 45, 65}, {11, 66, 99}}; int sum=0; for (int i=0 ;i< arr.length;i++){ for (int j=0;j<arr[i].length;j++){ sum=sum+arr[i][j]; } } System.out.println("该公司年销售额为:" +sum); } } 结果 该公司年销售额为:641

预习面向对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值