前言:我们经常在做一些OJ题会遇到一些问题,例如hasNext()或者hasNextLine(),还有就是next()和nextLine(),如果我们用错了,通常会导致输入和输入可能有误。
hasNext()和hasNextLine()的区别
hasNext()和hasNextLine()都是Java中的输入方法,他们在处理输入流时的行为不同。
hasNext()方法会判断接下来是否有非空字符,如果有非空字符,则返回true,否则返回false。
而hasNextLine()方法则会检查是否还有下一行(包括空行),如果有则返回true,如果没有则返回false。
此外,这两种方法在处理输入时还会对堆空间进行操作。当它们返回一个boolean类型的结果为true时,会在堆空间中生成一个专门存放刚读取的字符串的区域,这样下次再调用next或nextLine方法时,就无需再从键盘输入,系统会自动将刚才输入的字符串原封不动地输入。
举例: 假如我们有一个txt文件,文件内容有两行,如下所示:
Hello, World!
This is a test.
我们可以使用Scanner类来读取这个文件,并使用hasNext()和hasNextLine()方法来逐个读取文件中的单词和整行文本。
首先,我们需要导入java.util.Scanner包,并创建一个File对象来表示要读取的文件。然后,我们创建一个Scanner对象,并将File对象作为参数传递给它。
import java.io.File;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
File file = new File("test.txt");
Scanner scanner = new Scanner(file);
}
}
接下来,我们可以使用hasNext()方法来逐个读取文件中的单词。当hasNext()返回true时,我们可以使用next()方法来获取下一个单词。 注意:我们先把next()和nextLine()用起来,下面详细介绍。
import java.io.File;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
File file = new File("test.txt");
Scanner scanner = new Scanner(file);
while (scanner.hasNext()) {
String word = scanner.next();
System.out.println(word);
}
}
}
输出结果:
Hello,
World!
This
is
a
test.
我们还可以使用hasNextLine()方法来逐行读取文件中的文本。当hasNextLine()返回true时,我们可以使用nextLine()方法来获取下一行文本。
import java.io.File;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
File file = new File("test.txt");
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
String word = scanner.nextLine();
System.out.println(word);
}
}
}
输出结果:
Hello, World!
This is a test.
总结一下,hasNext()和hasNextLine()的主要区别在于它们检查的输入单元不同:前者检查的是单个标记,后者检查的是整行文本。
所以,如果你需要逐个读取每个单词,可以使用hasNext()方法;如果需要逐行读取每一行文本,就可以使用hasNextLine()方法。
next()和nextLine()的区别
在Java中,Scanner类的next()和nextLine()方法都是用来读取输入的方法,但他们在处理输入时的行为有所不同。
next()方法会读取输入中的下一个单词(以空格为分隔符)遇到空格就停止,并返回该单词。更具体地说,next()会自动消去有效字符前的空格,只返回输入的字符。
nextLine()方法则会吸取字符前后的空格/Tab键,直到遇到回车键为止。这意味着,如果输入中包含空格,nextLine()会读取包括空格在内的整行文本。
举例:模拟在控制台输入输出
1.next()
在控制台输入:themyth is ws.
输出:themyth
遇到空格就停止,空格后面的不输出
2.nextLine()
在控制台输入:themyth is ws
输出:themyth is ws
遇到回车符就停止
3.使用场景
情况1:当nextLine放在next,nextInt...nextDouble等后面
1. nextInt():18 直接回车
//上边输入的回车符会被下面的读取
2. nextLine():不能进行输入,因为nextLine()已经将上个nextInt()输入的回车符读取了。控制台结果:
18
解决方案:
1.避免在nextLine 前写 其他的nextInt , next , nextDouble…
2.如果不可避免,写一个空的nextLine接收enter(读取上面的换行) 如下所示:
情况2: 连续两次next
1.next():themyth ws 回车
2.next():不能进行输入,因为themyth后面有空格,而next()遇到空格就停止,而这个next()读取的是空格后面的ws
控制台结果:themyth
ws
总结:多数情况无脑用nextLine()就行了。