我的教授倾向于采取以下措施从用户那里获得一个号码:
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())
做出了显着的性能提升吗?另一方面有任何缺点吗?
在扫描包含大量数据而非用户输入的文件时怎么样?
答案 0 :(得分:8)
有两个观察结果:
myScannerInstance.nextInt()
会留下一个换行符号,因此,如果您在nextLine()
后呼叫nextInt()
,则nextLine()
会读取换行符而不是实际数据。因此,您必须在nextLine()
之后添加另一个nextInt()
来吞噬悬空换行符。 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()
),它比单独读取每个int更快更有效。 使用nextLine()
+ parseInt()
可以在运行非常大的循环时为您带来巨大的性能优势。
用法:
使用nextInt()
为您提供了额外的优势,如果输入文本不是整数,您将获得异常。示例123
已被接受.. 123sdsa
会抛出InputMismatchException
。所以,你可以抓住它并适当地处理它。
使用nextLine()
将读取整行,因此,它将读取整个字符串sada1231
,如果它无法将字符串解析为数字,则会失败并显示NumberFormatException
。你必须处理这个例外。
通常,一次nextLine()
/ nextInt()
通话不会产生太大影响。如果您有一个循环或者您正在阅读大量数据,那么将readLine()
与parseInt()
一起使用将非常有效。
答案 1 :(得分:0)
nextInt()读取一个数字,但不消耗行分隔符。而nextLine()读取String并使用换行符。根据{{3}}:
...此方法返回当前行的其余部分,不包括任何行 最后的分隔符。该位置设置为下一个的开头 线。
换句话说,当你输入一个数字然后按Enter键时,input.nextInt()仅消耗数字,而不是"行结束&#34 ;,原始数据类型如int,double等不消耗& #34;行尾",这是"行结束"保留在缓冲区中当input.next()执行时,它会消耗"行的结尾"来自第一个输入的缓冲区。所以你教授在读取用户输入后试图进入下一行。你必须先看看他的代码的逻辑才能理解它。
答案 2 :(得分:0)
我也常常经常面对这个问题。所以我用这样的代码..
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()
更有效。但这也是解决问题的代码之一。