数组
一、数组的基本概念
数组是一组类型相同的数据的集合;也就是说,数组中可以存储多个数据,但是这些数据的类型必须相同;
数组能够作为数据的容器使用,把多个数据集中存储;
存储在数组中的数据,都有相应的索引值,可以方便获取或修改;
当需要同时保存多个类型相同的变量并进行处理时,可以考虑用数组,例如:多个人的成绩、多个员工的薪资……
二、数组的声明、创建与初始化
Java的数组本身是引用数据类型;但是可存储基本数据类型,也可存储引用数据类型
数组元素类型 [] 数组名; 示例:int[] a; 推荐使用,避免混淆 数组元素类型 数组名 []; 示例:int a []; 注意:元素类型指的是数组里面存的数据类型。 数组在声明后还只是一个空指针,不能使用,要想使用必须创建。 |
数组创建的三种方式: |
①数组元素类型[] 数组名 = new 数组元素类型[数组长度]; //声明数组的同时,根据指定的长度分配内存,但数组中元素值都为默认的初始化值。 示例:int[] arr1 = new int[5]; //arr1的长度为5,元素的值为默认值0 ②数组元素类型[] 数组名 = new 数组元素类型[]{用逗号隔开元素的具体值}; //声明数组并分配内存,同时将其初始化。arr2的长度为4,元素的值为3,5,1,7 int[] arr2 = new int[]{3,5,1,7}; ③数组元素类型[ ] 数组名 = {用逗号隔开元素的具体值}; int[] arr3 = {3,5,1,7}; //arr3的长度为4,元素的值为3,5,1,7 |
三、数组的使用
四、数组的遍历方式
对数组中的元素一个一个取出来使用,这个过程叫遍历;先简单理解数组遍历的循环语句,包括传统的for循环和增强for循环两种;
对数组遍历 |
正向(正序)遍历 反向(倒序)遍历 |
五、数组常见问题
数组脚标越界异常(ArrayIndexOutOfBoundsException) |
int[] arr = new int[2]; System.out.println(arr[3]); 访问到了数组中的不存在的脚标时发生。 |
空指针异常(NullPointerException) |
int[] arr = null; System.out.println(arr[0]); arr引用没有指向实体,却在操作实体中的元素时。 |
猜数游戏:从键盘中任意输入一个数据,判断数列中是否包含此数
思路:
- 声明数组
- 从键盘中任意输入一个数据
- 标志变量:false是否找到
- 循环数组取得每一项
- 判断数列中是否包含此数,将标志变量=true代表找到
- 循环外判断标志变量,没找到输出
import java.util.Scanner; public class T09数组存在某一个数 { public static void main(String[] args) { //1.声明数组 int[] a=new int[]{1,3,2,3,4,3,5,3}; //2.从键盘中任意输入一个数据 Scanner scanner = new Scanner(System.in); System.out.println("请输入一个整数:"); int num = scanner.nextInt(); //3.标志变量:false是否找到 boolean found=false; //4.循环数组取得每一项 for (int i = 0; i < a.length; i++) { if (num==a[i]){//找到了 System.out.println("在索引为"+i+"找到了"+a[i]); //5.判断数列中是否包含此数,将标志变量=true代表找到 found=true; } } //6.循环外判断标志变量,没找到输出 if (!found){//found==false System.out.println("未找到该数据"); } } }
循环录入10位顾客的年龄放到数组中,遍历数组并计算18岁以上和以下的比例
思路:
- 创建数组有10个元素
- 让用户输入10个年龄整数 用空格隔开 12 10 19
- 18岁以上的和变量放18岁以上的人数
- 使用scanner.next()循环读取用空格隔开的整数依次放入数组中
- 同时判断数组元素是否>18 18岁以上的和变量++
- (double)18岁以上的和变量/10 1-(double)18岁以上的和变量/10
import java.util.Scanner; public class T1018岁 { public static void main(String[] args) { //1.创建数组有10个元素 int[] a=new int[10]; //2.让用户输入10个年龄整数 用空格隔开 12 10 19 Scanner scanner = new Scanner(System.in); //3.18岁以上的和变量放18岁以上的人数 int sum=0; System.out.println("输入10个年龄整数 用空格隔开:"); for (int i = 0; i < a.length; i++) { //4.使用scanner.nextInt()循环读取用空格隔开的整数依次放入数组中 a[i]=scanner.nextInt(); //5.同时判断数组元素是否>18 18岁以上的和变量++ if (a[i]>18){ sum++; } } //6.(double)18岁以上的和变量/10 1-(double)18岁以上的和变量/10 double d=(double)sum/10; double e=1-d; System.out.printf("18岁以上的比例:%.2f",d); System.out.println(); System.out.printf("18岁以下的比例:%.2f",e); } }
六、多维数组的定义声明与初始化
(一)定义:
多维数组即数组的数组,即数组的元素也是数组
数组元素类型[][] 变量名称=new 数组元素类型[一维长度] [二维长度];
数组元素类型[][] 变量名称=new 数组元素类型[][]{{元素,元素,...},{元素,元素,...},...};
数组元素类型[][] 变量名称={{元素,元素,...},{元素,元素,...},...};
(二)调用二维数组指定位置的元素:
数组名称[行的索引][列的索引]
public static void main(String[] args) {
int[][] a={{10,20},{100,110,120,130}};
System.out.println(a[0][1]);
System.out.println(a[1][2]);
}
//输出
20
120
(三)获取二维数组的长度:
数组名称.length 行数
数组名称[索引].length 具体行的长度
public static void main(String[] args) {
int[][] a={{10,20},{100,110,120,130}};
System.out.println(a.length);
System.out.println(a[0].length);
System.out.println(a[1].length);
}
//输出
2
2
4
七、多维数组的赋值与创建过程
八、多维数组的遍历
使用和遍历数组
(一)指定长度
数组元素类型[][] 变量名称=new 数组元素类型[一维长度] [二维长度];
表示数组的元素是等长的一维数组
public static void main(String[] args) { int[][] a=new int[2][3]; a[0][0]=1; a[0][1]=2; a[0][2]=3; a[1][0]=11; a[1][1]=12; a[1][2]=13; //遍历二维数组 for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { System.out.println(a[i][j]); } } } //运行结果 1 2 3 11 12 13
(二)不指定长度
数组元素类型[][] 变量名称=new 数组元素类型[][]{{元素,元素,...},{元素,元素,...},...};
数组元素类型[][] 变量名称={{元素,元素,...},{元素,元素,...},...};
public static void main(String[] args) { int[][] a=new int[][]{{10,20},{100,110,120,130}}; for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { System.out.print(a[i][j]+" "); } System.out.println(); } } 输出: 10 20 100 110 120 130 public static void main(String[] args) { int[][] a={{10,20},{100,110,120,130}}; for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { System.out.print(a[i][j]+" "); } System.out.println(); } } 输出: 10 20 100 110 120 130 public static void main(String[] args) { int[][] a=new int[2][]; a[0]=new int[]{10,20}; a[1]=new int[]{100,110,120,130}; for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { System.out.print(a[i][j]+" "); } System.out.println(); } } 输出: 10 20 100 110 120 130
九、数组工具
(一)排序sort
Java API中有一个类 Arrays,定义大量的sort方法,可以对数组中元素进行升序排序;
public static void main(String[] args) {
int []arr = {3,2,1,5,4};
Arrays.sort(arr);
System.out.println(arr);
}
(二)查找
Java API中有一个类 Arrays,定义大量的binarySearch方法,可以对数组中元素进行查找;
二分查找法找指定元素的索引值(下标):binarySearch
数组一定是排好序的,否则会出错。找到元素,只会返回最后一个位置
public static void main(String[] args) {
int []arr = {10,20,30,40,50};
System.out.println(Arrays.binarySearch(arr, 20));
}
结果是:1
分析:能找到该元素,返回下标为1(0开始)
(三)拷贝
Java API中有一个类 System,定义大量的arraycopy方法,对数组中元素进行拷贝
arraycopy(Object src, int srcPos,
Object dest, int destPos, int length)
从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。
int[] a={10,100,1000}; int[] b={20,200,2000,20000}; System.arraycopy(a, 1, b, 2, 2); for(int x:b){ System.out.println(x); } 输出结果:20 200 100 1000
十、冒泡排序
冒泡排序主要的思想是进行相邻的两个元素之间比较并且交换,有利于利用原有元素在集合中的位置优
势,冒泡排序的原则是大的下沉小的上浮(跟最终的排序要求保持一致)
public static void sort(int[] arr) { // 总共要经过 N-1 轮比较 for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length-1-i; j++) { if (arr[j]>arr[j+1]){ exch(arr,j,j+1); } } } } private static void exch(int[] a, int j, int i) { int tmp=a[j]; a[j]=a[i]; a[i]=tmp; }
十一、数组总结
1..数组的声明方式
1)类型[] 数组名=new 类型[长度]
2)类型[] 数组名=new 类型[]{用逗号隔开的数组元素}
3)类型[] 数组名={用逗号隔开的数组元素}
2.数组的遍历方式
1)for循环
for(int i=0;i<a.length;i++){
a[i]
}
2)for增强
for(类型 临时变量:数组名){
临时变量:数组的当前项
}
3)逆向遍历
for(int i=a.length-1;i>=0;i--;){
a[i]
}
3.数组常见异常
1)数组索引越界异常
int[] a=new int[3]; a[3]
2)空指针异常 int[] a=null;a[0]
4.多维数组
数组的元素是数组
声明方式:
数组元素类型[][] 变量名称=new
数组元素类型[一维长度] [二维长度];
数组元素类型[][] 变量名称=new
数组元素类型[][]{{元素,元素,...},{元素,元素,...},...};
数组元素类型[][] 变量名称={{元素,元素,...},{元素,元素,...},...};
5.访问指定位置的元素
数组名称[行的索引][列的索引]
6.数组的长度
数组名称.length 行数
数组名称[索引].length 具体行的长度
7.二维数组的遍历
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length;
j++) {
System.out.println(a[i][j]);
}
}
8.排序
Arrays.sort()升序
9.查找
int index = Arrays.binarySearch(a,50);
10.拷贝
System.arraycopy(原数组,原数组的索引,目标数组,目标数组的索引,拷贝的长度);