parseInt深度解析!!!!

今天在练习Java函数型接口中发现了以下问题:

    

// 函数式接口处理数据
		String[] name = { "04211624,老六", "004211625,张三", "0004211626,王五" };
		printInfo(name, (str) -> {
			int nameNum = Integer.parseInt(str.split(",")[0]);

			System.out.println("学号:" + nameNum);
		}, (str1) -> {
			String name1 = (str1.split(",")[1]);

			System.out.println("姓名:" + name1);
		});
// 使用Consumer接口处理字符串
	public static void printInfo(String[] name, Consumer<String> con1, Consumer<String> con2) {
		for (String string : name) {
			con1.andThen(con2).accept(string);
		}

	}

把字符串转化为数字后,出现前面的0消失的问题!

 归根结底是parseInt没有认真理解清楚!

在Java中,parseInt() 是用于将字符串转换为整数的方法,其原理如下:

  1. 字符串解析:parseInt() 方法会接受一个表示整数的字符串作为输入,并从字符串中解析出整数值。它会忽略字符串开头和结尾的空白字符,并开始解析从左到右的字符序列,直到遇到非数字字符为止。
  2. 符号处理:如果字符串以正号 "+" 或负号 "-" 开头,则解析方法会将符号考虑在内。负号会将解析出的整数值设为负数,而正号则无影响。
  3. 数字字符解析:在解析过程中,parseInt() 方法会逐个处理字符,并将其转换为对应的数字值。它采用类似于10进制的基数(radix)来解析字符。通常情况下,parseInt() 使用10作为基数,这表示字符串中的字符被视为十进制数字。例如,字符 "1" 表示数字1,字符 "5" 表示数字5,依此类推。

         在 Java 中,parseInt() 方法有以下两种重载形式: 

           parseInt(String s):                                                                                                        这是 parseInt() 方法的最常见用法。它接受一个表示整数的字符串作为参数,并将其转换为对应的整数值。默认使用十进制基数(radix 10)进行解析。


           parseInt(String s, int radix):                                                                                         这种形式的 parseInt() 方法允许指定解析时使用的基数。基数是一个整数值,用于指定待解析字符串中的字符应该被视为哪种进制数。例如,基数为 10 表示待解析字符串是十进制数;基数为 16 表示待解析字符串是十六进制数。基数的取值范围是 2 到 36                                         


                                                                                  

  4. 特殊字符处理:如果在字符串中遇到非数字字符,parseInt() 方法将停止解析,并返回之前解析的整数值。注意,它会忽略数字字符后的所有内容。例如,对于字符串 "123abc",parseInt() 会解析出整数值 123,并忽略 "abc" 部分。
  5. 边界处理:在解析过程中,parseInt() 方法会处理整数的边界情况。它会确保解析出的整数值不超过整数的表示范围,即在 int 数据类型中,整数范围为 -2^31 到 2^31-1。
  6. 异常处理:如果给定的字符串不能转换为有效的整数(例如包含非数字字符,或者超出整数范围),parseInt() 方法会抛出 NumberFormatException 异常。因此,在使用 parseInt() 时,建议使用 try-catch 块来捕获异常,以避免程序崩溃。

 示例:


public class Main {
    public static void main(String[] args) {
        String str = "0123";
        int number = Integer.parseInt(str);
        System.out.println(number); // Output: 123 当成8进制处理了
    }
}

在举一些难一点的例子:

       


 1.超出整数范围的情况

public class Main {
    public static void main(String[] args) {
        String largeNumberStr = "2147483648"; // 大于Integer.MAX_VALUE (2^31 - 1)
        try {
            int number = Integer.parseInt(largeNumberStr);
            System.out.println(number); // Output: Will throw NumberFormatException
        } catch (NumberFormatException e) {
            System.out.println("NumberFormatException: " + e.getMessage());
        }
    }
}

   这个例子中,字符串 "2147483648" 表示的整数值超过了 int 数据类型的表示范围,因此会抛出 NumberFormatException 异常。

       


 2.带有非法字符的情况:

public class Main {
    public static void main(String[] args) {
        String invalidStr = "123abc";
        try {
            int number = Integer.parseInt(invalidStr);
            System.out.println(number); // Output: Will throw NumberFormatException
        } catch (NumberFormatException e) {
            System.out.println("NumberFormatException: " + e.getMessage());
        }
    }
}

  在这个例子中,字符串 "123abc" 中包含非法字符 "abc",所以 parseInt() 方法只会解析出 "123" 部分,但因为它后面跟着非数字字符,所以会抛出 NumberFormatException 异常。

         


3.以零开头的情况:

public class Main {
    public static void main(String[] args) {
        String leadingZeroStr = "00123"; // 字符串以零开头
        int number = Integer.parseInt(leadingZeroStr);
        System.out.println(number); // Output: 123,解析时忽略前导零
    }
}

   在这个例子中,字符串 "00123" 被解析为整数 123。parseInt() 方法会忽略开头的零,并将其视为十进制数字。

     


   4.使用不同基数的情况

public class Main {
    public static void main(String[] args) {
        String hexStr = "1A"; // 十六进制表示的数
        int number = Integer.parseInt(hexStr, 16);
        System.out.println(number); // Output: 26,将十六进制字符串转换为十进制整数
    }
}

  在这个例子中,parseInt() 方法使用基数 16 来解析字符串 "1A",将其作为十六进制数并转换为十进制整数,结果为 26。

  总的来说,parseInt() 方法的行为会受到字符串中的字符、基数和整数范围等因素的影响。在使用时应当仔细考虑边界情况,并进行适当的异常处理。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小珠佩奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值