我的教授倾向于做以下事情来从用户那里获得一个数字:
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()本身,在额外的hocus-pocus之上。简单地执行Integer.parseInt(scanner.nextLine())
是否会显著提高性能?另一方面有缺点吗?
当扫描一个有大量数据而不是用户输入的文件时,情况如何?
有两个观察结果:
- 使用
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.
- CCD_ 12将再次返回到底层流并进行读取。IO调用需要时间(成本高昂)。它将进行大量检查以获得下一个整数。
nextLine()
将只进行一次这些检查。因此,如果您调用nextLine()
一次并读取5个整数(作为单行字符串),将它们拆分并解析为整数(使用Integer.parseInt()
),它将比单独读取每个int更快、更高效
当您运行一个非常大的循环时,使用nextLine()
+parseInt()
将为您带来巨大的性能优势。
用法:
使用nextInt()
提供了一个额外的优势,即如果输入文本不是整数,则会出现异常。示例123
被接受。。CCD_ 20将抛出一个CCD_。所以,你可以抓住它并适当地处理它。
使用nextLine()
将读取整行,因此,它将读取整个字符串sada1231
,如果不能将字符串解析为数字,则使用NumberFormatException
失败。您将不得不处理该异常。
一般来说,一个nextLine()
/nextInt()
调用不会有太大区别。如果您有一个循环,或者您正在读取大量数据,那么将readLine()
与parseInt()
结合使用将非常有效。
nextInt()读取数字,但不使用行分隔符。nextLine()读取字符串并使用换行符。根据Java文档:
…此方法返回当前行的其余部分,不包括任何行末端的分离器。位置设置为下一个的开头线
换句话说,当你输入一个数字,然后按enter键时,input.nextInt()只消耗数字,而不是"行尾",像int、double等原始数据类型不消耗"行尾",因此这个"行末"保留在缓冲区中。当input.next()执行时,它会从第一个输入中消耗缓冲区中的"行端"。所以你的教授在阅读了用户输入后,正试图进入下一行。你必须看看他的代码的逻辑,然后才能理解它。
我以前也经常遇到这个问题。所以我习惯这样编码。。
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()
更有效。但这也是代码克服问题的方法之一。
nextInt()
留下一个换行符。因此,如果在nextInt()
之后调用nextLine()
,nextLine()
将读取新行字符,而不是实际数据。因此,您将不得不在nextInt()
之后添加另一个nextLine()
来吞噬那个悬空的换行符。
public class Solution {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
double d = scan.nextDouble();
scan.nextLine();
String s = scan.nextLine();
scan.close();
System.out.println("String: " + s);
System.out.println("Double: " + d);
System.out.println("Int: " + i);
}
}