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



我的教授倾向于做以下事情来从用户那里获得一个数字:

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())是否会显著提高性能?另一方面有缺点吗?

当扫描一个有大量数据而不是用户输入的文件时,情况如何?

有两个观察结果:

  1. 使用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.
  1. 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);
    }
}

相关内容

  • 没有找到相关文章

最新更新