数组知识点总结
Java中的数组是不是对象?
答:是。
常见笔试题:
1、下列数组的定义中,哪3条是正确的?(A、B、F)
A. public int a[] B. static int[] a C.public [] int a
D. Private int a[3] E.private int[3] a[] F.public final int[] a
2、下列说法中,错误的有(B、D)
A.数组是一种对象 B. 数组属于一种原生类
C.int number[]={31,23,33,43,35,63} D.数组的大小可以任意改变
一维数组概述
●数组是存储同一种数据类型的多个元素的集合。也可以看成是一个容器。
●数组既可以存储基本数据类型,也可以存储引用数据类型。
数组的定义格式
格式1:数据类型[] 数组名;
格式2:数据类型 数组名[];
举例:
A:int[] a;定义一个int类型的数组a变量
B:int a[];定义一个int类型的a数组变量
注意:这两种定义方式效果可以认为是一样的,都是定义一个int数组,但是念法上有些小区别,推荐使用第一种。
这两种定义做完了,数组中是没有元素值的。如何对数组的元素进行初始化呢?
数组的初始化概述:
●Java中的数组必须先初始化,然后才能使用。
●所谓初始化,就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
如何对数组进行初始化呢?
int[] array = new int[3];//动态初始化
int[] array = new int[3]{1,2,3};//静态初始化
简化版:int[] array = {1,2,3};
推荐使用静态初始化!
数组操作常见的两个小问题:
数组索引越界
●ArrayIndexOutOfBoundsException访问到了数组中不存在的索引时发生
空指针异常
●NullPointerException数组引用没有指向实体,却在操作实体中的元素时。
练习1:数组遍历(依次输出数组中的每一个元素)
package 数组; public class ArrayTest { public static void main(String[] args) { //定义一个数组 int[] array = {2,3,64,34,7,8,4,23,98}; //遍历数组 for(int i=0;i<array.length;i++){ System.out.println(array[i]); } } } |
练习2:如何寻找数组中的最小值与最大值?
package com.minandmax; import java.util.Arrays; import java.util.Random; //寻找数组中的最小值和最大值 public class MinAndMaxValue { public static void main(String[] args){ //调用suiJi()方法,随机生成一个int类型的数组 int[] arr = suiJi(); //打印随机生成的数组 System.out.println(Arrays.toString(arr)); //调用maxValue()方法找出数组中的最大值 int max = maxValue(arr); //调用minValue()方法找出数组中的最小值 int min = minValue(arr); //打印数组中的最大值 System.out.println("数组中的最大值为:"+max); //打印数组中的最小值 System.out.println("数组中的最小值为:"+min); } //找出数组中的最大值 public static int maxValue(int[] arr){ //定义变量max,记录数组中0索引上的元素 int max = arr[0]; //遍历数组,获取所有的元素,和变量max比较 for(int i = 1; i < arr.length; i++){ //变量max,和数组中的每个元素进行比较 //如果max,小于了数组中的一个元素 if( arr[i] > max ){ //较大的数组的元素,赋值给max max = arr[i]; } } return max; } //找出数组中的最小值 public static int minValue(int[] arr){ //定义变量max,记录数组中0索引上的元素 int min = arr[0]; //遍历数组,获取所有的元素,和变量max比较 for(int i = 1; i < arr.length; i++){ //变量min,和数组中的每个元素进行比较 //如果数组中的元素小于min,交换位置 if( arr[i] < min ){ //较大的数组的元素,赋值给max min = arr[i]; } } return min; } //随机生成一个int类型的数组 private static int[] suiJi() { int b = new Random().nextInt(9); int[] a = new int[b]; for(int i=0;i<a.length;i++){ a[i] = new Random().nextInt(50); } return a; } } |
练习3:如何找出数组中第二大的数?
package com; public class SecondMax { public static void main(String[] args) { //定义一个int类型的数组 int[] arr = {7,3,19,40,4,67,1}; //调用FindSecMax()方法找出数组中第二大的数 int secMax = FindSecMax(arr); //打印数组中第二大的数 System.out.println("该数组中第二大的数为:"+secMax); } //找出数组中第二大的数 private static int FindSecMax(int[] arr) { //将数组0索引处的元素定义为最大值 int max = arr[0]; //将整形的最小值定义为secMax,这里必须这么定义,道理文字不好描述。明白就好 int secMax = Integer.MIN_VALUE; //遍历数组 for(int i=1;i<arr.length;i++){ //如果数组元素比max大,数组元素变成max,原来的max变成secMax if(arr[i]>max){ secMax = max; max = arr[i]; //如果数组元素没有max大,但比secMax大,数组元素与secMax交换位置,变成新的secMax }else if(arr[i]>secMax){ secMax = arr[i]; } } return secMax; } } |
练习4:二分查找:
前提:数组必须是有序的。
思想:每次都猜中间的那个元素,比较大或者小,就能减少一半的元素。
package 数组; public class BinarySearch { public static void main(String[] args) { int[] array = {2,4,7,9,15,30,54}; int index = getIndex(array,6); System.out.println("元素7所在的索引位置为:"+index); } public static int getIndex(int[] arr,int value){ //定义最大索引,最小索引 int max = arr.length-1; int min = 0; //计算出中间索引 int mid = (max+min)/2; //拿中间索引的值与要查找的值进行比较 while(arr[mid] != value){ //若所查找元素不存在,返回-1 if(max<min){ return -1; } if(arr[mid]>value){ max = mid - 1; }else if(arr[mid]<value){ min = mid + 1; } mid = (max+min)/2; } return mid; } } |
注意:如果遇见无序的数组,如:int[] arr = {45,65,87,4,324};
如何进行查找?
有人说,可以先排序,再查找。
这样是不行的,因为你排序完之后就把数组原来的元素索引改变了。
二维数组概述
我们传智播客的Java基础班每个班有很多个学生,所以,可以用数组来存储,而我们又同时有很多个Java基础班。这个也应该用一个数组来存储。如何来表示这样的数据呢?Java就提供了二维数组供我们使用。
由此可见:其实二维数组其实就是一个元素为一维数组的数组。
格式1
数据类型[][] 变量名 = new 数据类型[m][n];
m表示这个二维数组有多少个一维数组
n表示每一个一维数组的元素个数
举例:
int[][] arr = new int[3][2];
定义了一个二维数组arr
这个二维数组有3个一维数组,名称是arr[0],arr[1],arr[2]
每个一维数组有2个元素,可以通过arr[m][n]来获取
表示获取第m+1个一维数组的第n+1个元素
格式2
数据类型[][] 变量名 = new 数据类型[m][];
m表示这个二维数组有多少个一维数组
这一次没有直接给出一维数组的元素个数,可以动态的给出。
举例:
int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[3]
arr[2] = new int[1];
格式3
数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}};
简化版格式:
数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};
举例:
int[][] arr = {{1,2,3},{4,6},{6}};
练习1:二维数组的遍历
package 数组; public class ArrayDemo { public static void main(String[] args) { //定义一个二维数组 int[][] arr = {{1,2,3},{4,5,6},{7,8,9}}; //遍历二维数组 for(int x=0;x<arr.length;x++){ for(int y=0;y<arr[x].length;y++){ System.out.print(arr[x][y]+" "); } System.out.println(); } } } |
练习2:二维数组求和
公司年销售额求和
某公司按照季度和月份统计的数据如下:单位(万元)
第一季度:22,66,44
第二季度:77,33,88
第三季度:25,45,65
第四季度:11,66,99
package 数组; public class ArrayDemo { public static void main(String[] args) { //把题目的数据用二维数组来表示 int[][] arr = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}}; //定义一个求和变量sum,初始化值是0 int sum = 0; //通过遍历就可以得到每一个二维数组的元素 for(int x=0;x<arr.length;x++){ for(int y=0;y<arr[x].length;y++){ //把元素累加即可 sum += arr[x][y]; } } //最后输出sum,就是结果 System.out.println("一年的销售额为:"+sum+"万元"); } } |
练习3:打印杨辉三角(行数可以键盘录入)
package 数组; import java.util.Scanner; class ArrayDemo { public static void main(String[] args) { //创建键盘录入对象 Scanner sc = new Scanner(System.in); //这个n的数据来自于键盘录入。 System.out.println("请输入一个数据:"); int n = sc.nextInt(); sc.close();//关闭资源 //定义二维数组 int[][] arr = new int[n][n]; //给这个二维数组任何一行的第一列和最后一列赋值为1 for(int x=0; x<arr.length; x++) { arr[x][0] = 1; //任何一行第1列 arr[x][x] = 1; //任何一行的最后1列 } //按照规律给其他元素赋值 //从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。 for(int x=2; x<arr.length; x++) { //这里如果y<=x是有个小问题的,就是最后一列的问题 //所以这里要减去1 //并且y也应该从1开始,因为第一列也是有值了 for(int y=1; y<=x-1; y++) { //每一个数据是它上一行的前一列和它上一行的本列之和。 arr[x][y] = arr[x-1][y-1] + arr[x-1][y]; } } //这个时候,要注意了,内循环的变化必须和曾经讲过的九九乘法表类似 for(int x=0; x<arr.length; x++) { for(int y=0; y<=x; y++) { System.out.print(arr[x][y]+"\t"); } System.out.println(); } } } |