关于java引用数据类型的坑

一.前记

最近在做老师布置的一道题时忽然产生了一个莫名奇妙的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都是原来的倒置,那怎么比较都一样了,所以才会一直输出是回文数.

说了这么多,以后一定要注意引用数据类型的问题.

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值