一. java基本语法(续)
数组(一个连续固定大小的空间)
1.1 概念:
数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。
数组既可以存储基本数据类型,也可以存储引用数据类型。
1.2 语句定义格式
1、数据类型[] 数组名
举例:int[] arr; 这里的数组名其实就是一个变量的名,符合标识符的命名规则
2、据类型 数组名[]
举例:int arr[];
注意事项:
推荐使用第一种定义格式,可读性更强,早期的时候很多人使用第二种格式,现在趋向于第一种格式
1.3 初始化
所谓初始化其实就是对数组在内存中开辟一个连续的内存空间并对每个元素分配值。
数组的初始化的方式:
1、动态初始化:
初始化时只指定数组长度,由系统为数组分配初始值
默认值是多少?不同的元素数据类型默认值都一样吗?如果不一样分别是什么呢?
2、静态初始化
初始化时指定每个数组元素的初始值,由系统决定数组长度。
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
语句定义格式:
数据类型[] 数组名 = new 数据类型[数组的长度]
举例:创建长度为5,存储的是int类型元素的数组
int[] arr = new int[5];
*/
public class ArrayDemo1 {
public static void main(String[] args) {
//定义一个可以存储一批int类型元素的数组
// int[] arr;
//这里只是定义了,并没有对数组进行初始化,赋予初始化值,所以要想使用一个数组
//光定义还不行,还要进行初始化
// System.out.println(arr);
/**
* 左边:
* int: 表示我要定义的数组中要存储的元素类型是int类型
* []:说明它是一个一维数组
* arr:给数组起一个名字,符合标识符的命名规则
*
*
* 右边:
* new: 就说明在(堆)内存中开辟空间
* int:表示我要定义的数组中要存储的元素类型是int类型
* []:说明它是一个一维数组
* 3:表示数组最多能存储3个元素,其实就是数组的容量大小
*
*/
//动态初始化
int[] arr = new int[3];
//由于完成了初始化,我们就可以对变量进行使用
//直接打印,获取的是该数组在堆内存中的地址值,是一个十六进制的数
System.out.println(arr); // [I@4554617c
//我们如果就只能获取到地址值对于我们开发人员来说没有任何意义,我们使用数组更多是希望能够利用数组进行存储或者分析数据
//我们在上面介绍的时候提到一点,动态初始化的时候,系统会自动地为每一个元素赋予默认值
//我现在就想要知道默认值是多少
//怎么获取呢?java中的数组每一个元素位置上都有一个标号(下标索引),从左往右,从0开始
//语句定义格式:数组名[索引]
//我们要获取第一个元素的值
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//在初始化的时候,系统为数组中每一个存储int类型元素的位置上赋予了默认值0
}
}
package com.shujia.wyh.day04;
/*
定义两个数组,先定义一个数组,赋值,输出。
然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。
然后给第二个数组赋值,再次输出两个数组的名及元素。
*/
public class ArrayDemo3 {
public static void main(String[] args) {
//先定义一个数组
int[] arr1 = new int[3];
arr1[0] = 11;
arr1[1] = 22;
arr1[2] = 33;
System.out.println(arr1);
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
System.out.println("=========================================");
//然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。
int[] arr2 = arr1;
arr2[0] = 100;
System.out.println("==========================================");
System.out.println(arr1);
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
System.out.println("-----------------------");
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
}
}
数组的静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。
语句定义格式:元素的数据类型[] 数组名 = new 元素的数据类型[]{元素1,元素2.....}
简化写法:元素的数据类型[] 数组名 = {元素1,元素2.....}
*/
public class ArrayDemo4 {
public static void main(String[] args) {
//标准静态初始化的写法
// int[] arr = new int[]{11,22,33,44};
int[] arr;
arr = new int[]{11,22,33,44};
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
System.out.println("=====================================");
// int[] arr2 = int[3]{1,2,3}; //就相当于动态初始化和静态初始化的混合使用
//简化写法静态初始化
int[] arr2 = {100,200,300};
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
System.out.println("===============================");
//简化写法的时候,不允许将初始化与定义分割开来
// int[] arr3;
// arr3 = {110,120,130};
// System.out.println(arr3);
}
}
1.4 数组常见小问题
package com.shujia.wyh.day04;
public class ArrayDemo5 {
public static void main(String[] args) {
//创建一个数组并赋值
int[] arr = {11,22,33};
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//取了不该取的索引导致的
// System.out.println(arr[3]); //ArrayIndexOutOfBoundsException 数组索引越界异常
arr = null;
System.out.println(arr[0]); //NullPointerException 空指针异常
}
}
1.5 数组遍历(依次输出数组中的每一个元素)
/*
数组遍历(依次输出数组中的每一个元素)
*/
public class ArrayDemo6 {
public static void main(String[] args) {
//定义一个数组
// int[] arr = {11, 22, 33, 3, 312, 41, 321, 41, 4};
// System.out.println(arr[0]);
// System.out.println(arr[1]);
// System.out.println(arr[2]);
// System.out.println(arr[3]);
// System.out.println(arr[4]);
// System.out.println(arr[5]);
// System.out.println(arr[6]);
// System.out.println(arr[7]);
// System.out.println(arr[8]);
//使用for循环进行遍历
// for (int i = 0; i <= 8; i++) {
// System.out.println(arr[i]);
// }
System.out.println("======================================");
//虽然我们可以使用for循环遍历出数组中的元素
//但是呢这个元素的个数是我们自己能够数清的9个元素,进而推出索引最大是8
//才写出的for循环
//当数组中的元素个数很多的时候你还能数清吗?
int[] arr = {11, 22, 33, 3, 312, 41, 321, 41, 412, 2312, 412, 4431, 3, 1, 21321, 412, 2312, 412, 4};
//当我们自己数不清的时候,好像就没法用上面的做法了
//所以我们在想,要想使用for循环,前提不就是想要知道数组的长度么
//于是乎,java中的数组给我们提供了一个属性来得到数组的长度:length
// System.out.println(arr.length);
//[11,22,33,44,55,33]
// for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
// if(i==0){
// System.out.print("["+arr[i]+",");
// }else if(i==arr.length-1){
// System.out.println(arr[i]+"]");
// }else {
// System.out.print(arr[i]+",");
// }
// }
printArray(arr);
System.out.println("==================");
printArray(arr);
}
/**
* 编写打印一维int类型的数组的方法
* 返回值类型:void
* 参数列表:int[] array
*/
public static void printArray(int[] array) {
for (int i = 0; i < array.length; i++) {
// System.out.println(arr[i]);
if (i == 0) {
System.out.print("[" + array[i] + ",");
} else if (i == array.length - 1) {
System.out.println(array[i] + "]");
} else {
System.out.print(array[i] + ",");
}
}
}
}
package com.shujia.wyh.day04;
/*
代码格式化快捷键:ctrl+alt+L
数组获取最值(获取数组中的最大值最小值)
[12,32,12,54,31,2,51,78,100,64,3]
分析:
1、获取数组中的第一个数,先将它默认为最大值
2、向后遍历,拿到每个值与最大值进行比较,如果比最大值还要大,就交换一下
3、遍历结束后,最大值也就是数组中的最大值
*/
public class ArrayDemo7 {
public static void main(String[] args) {
//定义一个数组
int[] arr = {12, 32, 12, 54, 31, 2, 51, 78, 100, 64, 3};
//调用方法获取最大值
int maxNum = getMaxNumber(arr);
System.out.println("最大值为:" + maxNum);
//调用方法返回最小值
int minNum = getMinNumber(arr);
System.out.println("最小值为:" + minNum);
}
public static int getMinNumber(int[] array) {
//定义一个变量取第一个值为最大值
int minNum = array[0];
//从第二个值开始遍历
for (int i = 1; i < array.length; i++) {
if (array[i] < minNum) {
//直接赋值
minNum = array[i];
}
}
return minNum;
}
public static int getMaxNumber(int[] array) {
//定义一个变量取第一个值为最大值
int maxNum = array[0];
//从第二个值开始遍历
for (int i = 1; i < array.length; i++) {
if (array[i] > maxNum) {
//直接赋值
maxNum = array[i];
}
}
return maxNum;
}
}
package com.shujia.wyh.day04;
/*
数组元素逆序 (就是把元素对调)
原本数组:[1,2,3,4,5,6,7,8,9]
逆序:[9,8,7,6,5,4,3,2,1]
*/
public class ArrayDemo8 {
public static void main(String[] args) {
//定义一个数组
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
System.out.println("逆序之前:");
printArray(arr);
//将索引0对应的元素与索引length-1-0的元素对调
// int tmp = arr[0];
// arr[0] = arr[arr.length-1-0];
// arr[arr.length-1-0] = tmp;
//
//将索引1对应的元素与索引length-1-1的元素对调
// int tmp2 = arr[1];
// arr[1] = arr[arr.length-1-1];
// arr[arr.length-1-1] = tmp2;
//将索引2对应的元素与索引length-1-2的元素对调
// int tmp3 = arr[2];
// arr[2] = arr[arr.length-1-2];
// arr[arr.length-1-2] = tmp3;
//...
//将索引i对应的元素与索引length-1-i的元素对调
// int tmpn = arr[i];
// arr[i] = arr[arr.length-1-i];
// arr[arr.length-1-i] = tmpn;
//直到length/2次为止
// for (int index = 0; index < arr.length / 2; index++) {
// int tmpn = arr[index];
// arr[index] = arr[arr.length - 1 - index];
// arr[arr.length - 1 - index] = tmpn;
// }
// arr = niXu1(arr);
// System.out.println("逆序后的数组为:");
// printArray(arr);
System.out.println("============逆序的第二种解决方案=============");
arr = niXu2(arr);
System.out.println("逆序后的数组为:");
printArray(arr);
}
/**
* 逆序的第二种解决方案:定义头尾指针
* 返回值类型:int[]
* 参数列表:int[] array
*/
public static int[] niXu2(int[] array) {
for (int start = 0, end = array.length - 1; start < end; start++, end--) {
int tmp = array[start];
array[start] = array[end];
array[end] = tmp;
}
return array;
}
/**
* 逆序方法:
* 返回值类型:int[]
* 参数列表:int[] array
*/
public static int[] niXu1(int[] array) {
for (int index = 0; index < array.length / 2; index++) {
int tmpn = array[index];
array[index] = array[array.length - 1 - index];
array[array.length - 1 - index] = tmpn;
}
return array;
}
/**
* 编写打印一维int类型的数组的方法
* 返回值类型:void
* 参数列表:int[] array
*/
public static void printArray(int[] array) {
for (int i = 0; i < array.length; i++) {
// System.out.println(arr[i]);
if (i == 0) {
System.out.print("[" + array[i] + ",");
} else if (i == array.length - 1) {
System.out.println(array[i] + "]");
} else {
System.out.print(array[i] + ",");
}
}
}
}
2. 二维数组
2.1 概念:
其实就是元素为一维数组的数组
2.2 语句定义格式:
格式一:数据类型[][] 变量名 = new 数据类型[m][n];
举例:
int[][] arr = new int[3][2];
表示定义了一个二维数组,二维数组中有3个一维数组,每个一维数组的长度为2,每个一维数组中的元素数据类型是int类型
今后可能会遇到的其他二维数组的格式:
int[] arr[] = new int[3][3];
int arr[][] = new int[3][3];
int arr [] [] = new int[3][3];
int [] [] arr = new int[3][2];
格式二:
数据类型[][] 数组名 = new 数据类型[m][];
m代表的是有多少个一维数组。
后续将创建一维数组进行赋值
package com.shujia.wyh.day04;
/*
公司年销售额求和
某公司按照季度和月份统计的数据如下:单位(万元)
第一季度:22,66,44
第二季度:77,33,88
第三季度:25,45,65
第四季度:11,66,99
*/
public class Array2Demo3 {
public static void main(String[] args) {
//创建二维数组存储每个季度的值
int[][] gongsi = new int[][]{{22, 66, 44}, {77, 33, 88}, {25, 35, 65}, {11, 66, 99}};
//定义一个sum变量接收和
int sum = 0;
for (int i = 0; i < gongsi.length; i++) {
for (int j = 0; j < gongsi[i].length; j++) {
sum += gongsi[i][j];
}
}
System.out.println("该公司年销售总额为:" + sum + "万元");
//作业:打印杨辉三角形(行数可以键盘录入)
/*
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
*/
}
}
格式三:
在创建的同时给值
数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2},{...},{......}}
*/
public class Array2Dmo3 {
public static void main(String[] args) {
int[][] shujia = new int[][]{{11, 22, 33}, {100, 200, 300, 400}, {1, 2, 3, 4, 5}};
//二维数组遍历
for (int i = 0; i < shujia.length; i++) {
System.out.println("正在遍历" + (i + 1) + "个一维数组元素");
// shujia[i] 代表的是取到的每一个一维数组
for (int j = 0; j < shujia[i].length; j++) {
// System.out.println(shujia[i][j]);
if (j == 0) {
System.out.print("[" + shujia[i][j] + ",");
} else if (j == shujia[i].length - 1) {
System.out.println(shujia[i][j] + "]");
} else {
System.out.print(shujia[i][j] + ",");
}
}
}
}
3. 思考
package com.shujia.wyh.day04;
/*
总结:
1、基本数据类型当作方法的实参传入的时候,方法内部的变化,与方法外部的变量值不受影响
2、引用数据类型当作方法的实参传入的时候,传入的是地址值,方法内部的变化会影响到地址值真正对应的空间值,
所以外部的引用数据类型变量的值会发生变化
*/
public class Array2SikaoDemo {
public static void main(String[] args) {
// int a = 10;
// int b = 20;
// System.out.println("a:" + a + ",b:" + b); // 10,20
// change(a, b);
// System.out.println("a:" + a + ",b:" + b); // a=10,b=20不受方法内部影响
int[] arr = {1,2,3,4,5};
change(arr);
System.out.println(arr[1]); // 4
}
public static void change(int a1, int b1) {
System.out.println("a1:" + a1 + ",b1:" + b1); // 10,20
a1 = b1; //a=20
b1 = a1 + b1; //b=40
System.out.println("a1:" + a1 + ",b1:" + b1); // 20,40
}
public static void change(int[] arr) {
//偶数乘2,奇数不变
for (int x = 0; x < arr.length; x++) {
if (arr[x] % 2 == 0) {
arr[x] *= 2;
}
}
}
}