今天在练习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() 是用于将字符串转换为整数的方法,其原理如下:
- 字符串解析:parseInt() 方法会接受一个表示整数的字符串作为输入,并从字符串中解析出整数值。它会忽略字符串开头和结尾的空白字符,并开始解析从左到右的字符序列,直到遇到非数字字符为止。
- 符号处理:如果字符串以正号 "+" 或负号 "-" 开头,则解析方法会将符号考虑在内。负号会将解析出的整数值设为负数,而正号则无影响。
- 数字字符解析:在解析过程中,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
- 特殊字符处理:如果在字符串中遇到非数字字符,parseInt() 方法将停止解析,并返回之前解析的整数值。注意,它会忽略数字字符后的所有内容。例如,对于字符串 "123abc",parseInt() 会解析出整数值 123,并忽略 "abc" 部分。
- 边界处理:在解析过程中,parseInt() 方法会处理整数的边界情况。它会确保解析出的整数值不超过整数的表示范围,即在 int 数据类型中,整数范围为 -2^31 到 2^31-1。
- 异常处理:如果给定的字符串不能转换为有效的整数(例如包含非数字字符,或者超出整数范围),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() 方法的行为会受到字符串中的字符、基数和整数范围等因素的影响。在使用时应当仔细考虑边界情况,并进行适当的异常处理。