我的教授倾向于通过以下方式从用户那里获取一个数字:
Scanner scanner = new Scanner(System.in);
Integer.parseInt(scanner.nextLine());与简单地做scanner.nextInt()相比,有什么好处呢?
java.util.Scanner.java中包含以下内容:
public int nextInt() {
return nextInt(defaultRadix);
}
public int nextInt(int radix) {
// Check cached result
if ((typeCache != null) && (typeCache instanceof Integer)
&& this.radix == radix) {
int val = ((Integer)typeCache).intValue();
useTypeCache();
return val;
}
setRadix(radix);
clearCaches();
// Search for next int
try {
String s = next(integerPattern());
if (matcher.group(SIMPLE_GROUP_INDEX) == null)
s = processIntegerToken(s);
return Integer.parseInt(s, radix);
} catch (NumberFormatException nfe) {
position = matcher.start(); // don't skip bad token
throw new InputMismatchException(nfe.getMessage());
}
}在我看来,Scanner也会调用Integer.parseInt()本身,这是在额外的骗局之上。执行简单的Integer.parseInt(scanner.nextLine())是否有显著的性能提升?另一方面,是否有任何缺点?
当扫描一个包含大量数据而不是用户输入的文件时,该怎么办?
发布于 2014-10-27 19:32:06
有两个观察结果:
使用myScannerInstance.nextInt()的
nextInt()之后调用nextLine(),nextLine()将读取换行符,而不是实际数据。因此,您必须在nextInt()之后添加另一个nextLine()来吞噬悬空的新行字符。nextLine()不会留下换行符。代码:
int age=myScannerInstance.nextInt();
String name = myScannerInstance.nextLine();// here the actual name will not be read. The new line character will be read.nextInt()将再次返回到底层流并读取。IO调用需要时间(开销很大)。它会做很多检查来得到下一个整数。nextLine()只会执行一次这些检查。因此,如果您调用一次nextLine()并读取5个整数(作为单行字符串),拆分它们并将它们解析为整数(使用Integer.parseInt()),那么它将比读取每个整型individually.更快、更有效
当你运行一个非常大的循环时,使用nextLine() + parseInt()将会给你带来巨大的性能优势。
用法:
使用nextInt()有一个额外的优势,如果输入的文本不是整数,就会得到一个异常。示例123被接受..123sdsa将抛出一个InputMismatchException。因此,您可以捕获它并适当地处理它。
使用nextLine()将读取整个行,因此,它将读取整个字符串sada1231,如果不能将字符串解析为数字,则会失败并返回NumberFormatException。您将不得不处理该异常。
通常,一次nextLine() / nextInt()调用不会有太大的不同。如果您有一个循环,或者如果您正在读取大量数据,那么结合使用readLine()和parseInt()将是非常有效的。
发布于 2014-10-27 19:35:54
nextInt()读取一个数字,但不使用行分隔符。而nextLine()读取字符串并使用换行符。根据Java Docs的说法
…此方法返回当前行的其余部分,不包括末尾的任何行分隔符。该位置设置为下一行的开头。
换句话说,当你输入一个数字然后按回车键时,input.nextInt()只消耗数字,而不是“行尾”,原始数据类型如int、double等不消耗“行尾”,因此当input.next()执行时,这个“行尾”保留在缓冲区中,它从第一个输入中消耗缓冲区的“行尾”。所以你的教授在读完用户输入后,正在尝试进入下一行。你必须看他代码的逻辑,然后你才能理解它。
发布于 2017-06-08 00:22:39
我过去也经常遇到这个问题。所以我习惯这样写代码..
public static void main(String[] args) {
Scanner key= new Scanner(System.in);
String name;
int age;
age = key.nextInt();
key.nextLine();
name = key.nextLine(); //to carry the new line character left behind nextInt()
System.out.println("Age : "+age);
System.out.println("Name: "+name);
}在这里,当key.nextInt()留下一个新的行字符时,我们使用key.nextLine()来携带新的行字符,然后移动到实际数据所在的下一行。如上所述,使用Integer.parseInt()将比使用nextInt()更有效。但这也是解决这个问题的一种编码方式。
https://stackoverflow.com/questions/26586489
复制相似问题