当前位置: 首页 > 面试题库 >

Integer.parseInt(scanner.nextLine())与Scanner.nextInt()

欧阳君浩
2023-03-14
问题内容

我的教授倾向于执行以下操作来从用户那里获得一个号码:

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()本身。简单地做会带来显着的性能提升Integer.parseInt(scanner.nextLine())吗?另一方面是否有任何弊端?

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


问题答案:

有2个观察结果:

  1. 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.
  1. nextInt()将再次返回基础流并读取。IO调用花费时间(昂贵)。它将进行大量检查以获取下一个整数。nextLine()只会做一次检查。因此,如果调用nextLine()一次并读取5个整数(作为单行String),将其拆分并解析为整数(使用Integer.parseInt()),则比分别读取每个int更快,更高效。

在运行非常大的循环时,使用nextLine()+ parseInt()将为您带来巨大的性能优势。

用法:

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

using nextLine()将读取整行,因此,它将读取整个String
sada1231NumberFormatException如果无法将String解析为数字,则会失败。您将不得不处理该异常。

通常,一个nextLine()/ nextInt()通话不会有太大的区别。如果您有循环,或者正在读取大量数据,则使用readLine()with
parseInt()将非常有效。



 类似资料:
  • 我必须得到一个字符串输入和一个整数输入,但输入的顺序应该是整数在先,然后要求用户输入字符串 上面的代码工作得很好,但是如果我首先输入一个整数,就像下面的代码 然后抛出java.lang.ArrayIndexOutOfBoundsException。 下面是我源文件的完整代码: 公共类StringSwap{ } 请指出我在这里做错了什么。

  • 问题内容: 尝试使用中的方法时遇到麻烦。 这是我尝试过的: 示例1:此示例按预期方式工作。该行;等待输入,然后再继续。 产生输出: 示例2:此示例无法正常工作。本示例使用while循环以及结构允许用户选择要执行的操作。一旦程序到达;,它就不会等待输入,而是执行该行;。 产生输出: 这使得不可能输入句子。 为什么示例不能按预期工作?唯一之间的区别。和是那个 具有循环和结构。我不明白为什么这会影响的行

  • 嘿,我正在用JMeter为web应用程序编写一些beanshell脚本。我已经编写了很多嵌入beanshell的jmeter脚本,由于某种原因,这个脚本总是给我带来integer.parseint()方法调用的错误。 错误如下: 下面列出了我所有的integer.parseint()调用,它们在我看来都是非常合法的,如果有人是beanshell专家,可以帮助我识别错误,那就太棒了,谢谢! 而且..

  • 问题内容: 我在Android应用中运行了以下代码 在Android 5.0(Lollipop)中,它 没有 引发任何整数异常。但是在Android 4.4.x (KitKat)和更低版本中,它抛出: NumberFormatException:无效的Int:“ +91” Android版本如何造成这种差异? 问题答案: 在此提交中添加了对显式的支持: 从开始包含在内。如果您已获取Git存储库,则

  • 问题内容: 我以前有几种方法用于接受用户输入,并将其作为某种数据类型返回给调用它的方法。我在以前的项目中使用过这些方法或它们的变体。 我采用了用于字符串的方法来选择给定的第一个字符并返回它,以便可以在菜单中使用它。每次我启动该应用程序时,都会出现主菜单,并等待用户输入。收到此输入后,程序将连续循环直到停止。这是我捕获字符的方法: 由于try / catch块,代码循环,因为scan.nextLin

  • 我完全是Java的初学者。我制作了一个类,想输入一个数字和一个字符串,但我认为s=in。nextLine() 忽略此行。如何逐行输入两个值。