Integer.parseInt(scanner.nextLine())vs scanner.nextInt()

时间:2014-10-27 11:24:28

标签: java performance integer java.util.scanner user-input

我的教授倾向于采取以下措施从用户那里获得一个号码:

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())做出了显着的性能提升吗?另一方面有任何缺点吗?

在扫描包含大量数据而非用户输入的文件时怎么样?

3 个答案:

答案 0 :(得分:8)

有两个观察结果:

  1. 使用myScannerInstance.nextInt()会留下一个换行符号,因此,如果您在nextLine()后呼叫nextInt(),则nextLine()会读取换行符而不是实际数据。因此,您必须在nextLine()之后添加另一个nextInt()来吞噬悬空换行符。 nextLine()并不会留下新的字符。
  2. 代码:

    int age=myScannerInstance.nextInt();
    String name = myScannerInstance.nextLine();// here the actual name will not be read. The new line character will be read.
    
    1. nextInt()将再次返回基础流并阅读。 IO调用需要时间(昂贵)。它将进行大量检查以获得下一个整数。 nextLine()只会执行一次这样的检查。所以,如果你调用nextLine()一次并读取5个整数(作为单行字符串),拆分它们并将它们解析为整数(使用Integer.parseInt() ),它比单独读取每个int更快更有效。
    2. 使用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()更有效。但这也是解决问题的代码之一。