在Java中判断一个整数是否为回文数,新手常想到把数字全部反转后与原值比较。但这种方法存在溢出和负数处理等误区,并不够安全。我们来看看问题出在哪里,以及应该怎么写才稳妥。

常见误区:完整反转整数
下面这段代码的思路是,用循环把x的每一位取出来,拼成反转后的数字,最后判断是否相等。
public static boolean isPalindromeWrong(int x) {
if (x < 0) {
return false; // 误区一:直接认为负数不是回文
}
int original = x;
int rev = 0;
while (x != 0) {
int pop = x % 10;
x = x / 10;
// 误区二:未处理反转过程中的溢出
rev = rev * 10 + pop;
}
return rev == original;
}
这段代码有两个明显问题。第一,对于像10这样的数,反转后是1,会误判为非回文,但其实末尾的0决定了它不可能是回文,逻辑还算巧合正确;但负数直接返回false不一定符合所有定义。第二,当x接近Integer.MAX_VALUE时,rev会溢出变成负数,导致判断错误。
更安全的做法:只反转一半
回文的特点是关于中间对称,所以我们只需要反转后半部分,再和前半部分比较。
public static boolean isPalindrome(int x) {
// 负数或末尾为0但非0本身,一定不是回文
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int rev = 0;
while (x > rev) {
int pop = x % 10;
x = x / 10;
rev = rev * 10 + pop;
}
// 偶数位:x == rev;奇数位:x == rev / 10
return x == rev || x == rev / 10;
}
为什么这样不会溢出
因为循环在x > rev时就停止,rev最多只存了一半位数,远小于Integer.MAX_VALUE,所以不会溢出。
误区总结
- 不要盲目反转整个整数,溢出风险真实存在
- 负数和末尾为0的情况要单独处理
- 反转一半就能完成判断,效率与安全性更好
小结
Java整数回文判断并不适合直接反转全部数字。理解数字反转的误区,改用后半段反转比较,才能写出正确且健壮的代码。