一.前记
最近在做老师布置的一道题时忽然产生了一个莫名奇妙的bug,感觉自己代码编写的思路完全对,可是运行结果总是出错,经过调试后发现,原来自己是掉到了java引用数据类型的坑里了,这种错误比较难以发现,记录在这里,以防自己再犯.
二.题目(那道有坑的题目)
编写一个reverse方法实现:如果一个数字的反向倒置数和它的顺向数一样,这个数就称作回文数.编写一个程序,提示用户输入一个整数值,然后报告这个整数是否是回文数.
三.代码及犯的错误
package work03;
import java.util.Scanner;
//import java.util.Arrays;
public class Test {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.print("请输入一个整数: ");
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int b = reverse(n);
if(b == 0){
System.out.println("这个整数不是回文数");
}
else{
System.out.println("这个整数是回文数");
}
}
public static int reverse(int number){
String s = number + "";
char[] c1 = s.toCharArray();
/*
char[] c2 = new char[c1.length];
for(int i = 0; i < c1.length; i++){
c2[i] = c1[i];
}
*/
char[] c3 = dZ(c2);
for(int i = 0; i < c1.length; i++){
if(c1[i] != c3[i]){
return 0;
}
}
return 1;
}
public static char[] dZ(char[] c){
char temp;
for(int i = 0; i < c.length/2; i++){
temp = c[i];
c[i] = c[c.length - i - 1];
c[c.length - i - 1] = temp;
}
//System.out.println(c);
return c;
}
}
注意在reverse()方法中注释的那部分,那是后来我改之后加上的正确的代码,原来只有char[] c2 = dZ(c1),这句是将数组c1倒置后赋给c2,然后后面有一个for循环比较倒置后和倒置前是否一样,我一开始感觉这样的思路没有问题,可是这样做之后就会出错
明显这个结果是错误的,那到底问题出在哪里呢?
忽然我想到了数组是引用数据类型,那问题显然就出现在char[] c2 = dZ(c1)这条语句上了,如果是基本数据类型,那上面这句话肯定没有问题,但是数组的话,那将c1这个变量给dZ()这个方法时,他是将数组的首地址给了这个这个方法中c这个参数,实际c和c1是完全一样的,那么对于c做出的倒置操作同样的也会对c1进行,也就是说执行完这句后,c1也变成它原来的倒置了,既然c1和c2都是原来的倒置,那怎么比较都一样了,所以才会一直输出是回文数.
说了这么多,以后一定要注意引用数据类型的问题.