首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Integer.parseInt(scanner.nextLine()) vs scanner.nextInt()

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

Stack Overflow用户
提问于 2014-10-27 19:24:28
回答 3查看 44.9K关注 0票数 9

我的教授倾向于通过以下方式从用户那里获取一个数字:

代码语言:javascript
复制
Scanner scanner = new Scanner(System.in);
Integer.parseInt(scanner.nextLine());

与简单地做scanner.nextInt()相比,有什么好处呢?

java.util.Scanner.java中包含以下内容:

代码语言:javascript
复制
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())是否有显著的性能提升?另一方面,是否有任何缺点?

当扫描一个包含大量数据而不是用户输入的文件时,该怎么办?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-27 19:32:06

有两个观察结果:

使用myScannerInstance.nextInt()

  1. 会留下一个新的行符。因此,如果在nextInt()之后调用nextLine()nextLine()将读取换行符,而不是实际数据。因此,您必须在nextInt()之后添加另一个nextLine()来吞噬悬空的新行字符。nextLine()不会留下换行符。

代码:

代码语言:javascript
复制
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()),那么它将比读取每个整型individually.

更快、更有效

当你运行一个非常大的循环时,使用nextLine() + parseInt()将会给你带来巨大的性能优势。

用法:

使用nextInt()有一个额外的优势,如果输入的文本不是整数,就会得到一个异常。示例123被接受..123sdsa将抛出一个InputMismatchException。因此,您可以捕获它并适当地处理它。

使用nextLine()将读取整个行,因此,它将读取整个字符串sada1231,如果不能将字符串解析为数字,则会失败并返回NumberFormatException。您将不得不处理该异常。

通常,一次nextLine() / nextInt()调用不会有太大的不同。如果您有一个循环,或者如果您正在读取大量数据,那么结合使用readLine()parseInt()将是非常有效的。

票数 16
EN

Stack Overflow用户

发布于 2014-10-27 19:35:54

nextInt()读取一个数字,但不使用行分隔符。而nextLine()读取字符串并使用换行符。根据Java Docs的说法

…此方法返回当前行的其余部分,不包括末尾的任何行分隔符。该位置设置为下一行的开头。

换句话说,当你输入一个数字然后按回车键时,input.nextInt()只消耗数字,而不是“行尾”,原始数据类型如int、double等不消耗“行尾”,因此当input.next()执行时,这个“行尾”保留在缓冲区中,它从第一个输入中消耗缓冲区的“行尾”。所以你的教授在读完用户输入后,正在尝试进入下一行。你必须看他代码的逻辑,然后你才能理解它。

票数 0
EN

Stack Overflow用户

发布于 2017-06-08 00:22:39

我过去也经常遇到这个问题。所以我习惯这样写代码..

代码语言:javascript
复制
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()更有效。但这也是解决这个问题的一种编码方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26586489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档