七、JAVA中数组的常见问题与操作
7.1 常见问题
数组操作的常见问题:
- 索引越界异常
数组的索引编号从0开始,一直到“长度-1”结束。
若访问数组元素时,索引编号并不存在,则将会发生数组索引越界异常。
ArrayIndexOutOfBoundsException
原因:索引编号错误。
解决:修改为存在的正确编号。 - 空指针异常
数组为引用变量,所有的引用变量都可以赋值为null,代表其中什么也没有。
数组必须进行new初始化,才能使用其中的元素。
如果只赋值为null,没使用new创建,则会发生
空指针异常
NullPointerException
原因:忘记new
解决:补上new
7.2 获取数组的长度
获取数组的长度函数:
length
得到一个int类型的数字,代表数组的长度。
注意:数组一旦创建,在程序运行期间,长度不可改变。
package Code_20191027.Demo02;
public class Demo01ArrayLength{
public static void main(String[] args) {
int[] arrayA = {1,2,3,5,9,85,7,60};
int lenA = arrayA.length;
System.out.println("数组arrayA的长度为:" + lenA);
System.out.println("--------------------------");
// 注意这里问什么不报错,因为每一个new都是新创建一个引用。
int[] arrayB = new int[3];
System.out.println(arrayB);
System.out.println(arrayB.length);
arrayB = new int[5];
System.out.println(arrayB);
System.out.println(arrayB.length);
}
}
数组arrayA的长度为:8
--------------------------
[I@470e2030
3
[I@3fb4f649
5
7.3 遍历输出
遍历数组:
对数组的每一个元素进行逐一、挨个处理。
默认处理方式为打印输出。
package Code_20191027.Demo02;
public class Demo02Array{
public static void main(String[] args) {
int[] arrayA = {1,2,3,4,5,6};
int lenA = arrayA.length;
for(int i = 0; i < lenA; i++){
System.out.println(arrayA[i]);
}
}
}
1
2
3
4
5
6
7.4 最值
输出最值:
遍历求出最值
package Code_20191027.Demo02;
public class Demo03ArrayMaxMin{
public static void main(String[] args) {
int[] arrayA = {1,2,3,4,5,6};
int lenA = arrayA.length;
int maxA = arrayA[0];
int minA = arrayA[0];
for(int i = 1; i < lenA; i++){
if(arrayA[i] > maxA){
maxA = arrayA[i];
}
}
System.out.println("最大值:" + maxA);
for(int i = 1; i < lenA; i++){
if(arrayA[i] < minA){
minA = arrayA[i];
}
}
System.out.println("最小值:" + minA);
}
}
最大值:6
最小值:1
7.5 元素反转
元素反转:
本来样子:[1,2,3,4]
反转之后:[4,3,2,1]
要求:不能创建新数组。
分析:
1. 反转,即对称位置的元素交换。
2. 通常遍历数组只使用一个索引,现在表示对称位置则需使用两个索引。
3. 如何交换两个变量的值?
4. 什么时候停止交换?
package Code_20191027.Demo02;
public class Demo04ArrayTurn{
public static void main(String[] args) {
int[] arrayA = {1, 2, 3, 4, 5};
int lenA = arrayA.length;
for(int i = 0; i < lenA; i++){
System.out.print(arrayA[i] + " ");
}
System.out.println("\n--------------");
for(int min = 0, max = lenA - 1; min < max; min++, max--){
int temp = arrayA[min];
arrayA[min] = arrayA[max];
arrayA[max] = temp;
}
for(int i = 0; i < lenA; i++){
System.out.print(arrayA[i] + " ");
}
System.out.println("\n--------------");
}
}
1 2 3 4 5
--------------
5 4 3 2 1
--------------
7.6 将数组当作方法的参数
数组作为方法的参数:
当调用方法的时候,向方法的小括号中传参,传递进去的其实是数组的地址值。
package Code_20191027.Demo02;
public class Demo05ArrayParam{
public static void main(String[] args) {
int[] arrayA = {1,2,3,4,5,6};
printArray(arrayA); // 传递近去的是array当中的地址值
}
public static void printArray(int[] array) {
for(int i = 0; i < array.length; i++){ // 根据地址值取出数组长度
System.out.println(array[i]); // 根据地址值取出数组元素
}
}
}
1
2
3
4
5
6
7.7 数组作为方法的返回值
数组作为方法的返回值:
对于任意一方法,其可以有多个输入参数,但是只能有一个返回值。
若希望返回某一个方法中产生的多个结果,则使用数组类型。
package Code_20191027.Demo02;
public class Demo06ArrayReturn{
public static void main(String[] args) {
int[] arrResult = calculate(1, 156, 4158);
System.out.println("总和" + arrResult[0]);
System.out.println("平均值" + arrResult[1]);
}
public static int[] calculate(int a, int b, int c) {
int sum = a + b + c;
int avg = sum / 3;
// 希望将两个值都返回
/*int[]arrResult = new int[2];
arrResult[0] = sum;
arrResult[1] = avg;*/
int[] arrResult = {sum, avg};
return arrResult;
}
}
总和4315
平均值1438
总结:任何数据类型都能作为方法的参数类型,或者返回值类型。
数组作为方法的参数,传递进去的是数组的地址值;
数组作为方法的返回值,传递进去的是数组的地址值。