目录

前言

hasNext和hasNextLine的区别

 hasNext 和 next组合

hasNext 和 NextLine组合

hasNextLine 和 next组合

hasNextLine 和 nextLine组合

验证hasNext、hasNextLine对输入代码的存储寿命

 总结


前言

在查阅了大量网上相关资料都没有一个完整的解释,并且我查的几篇高赞回答都是错误的时候,我决定用一整天的时间来精细写下这篇文章,希望对你有帮助。

大多数人对hasNext的印象停留在“判断是否有下一个值”上,而该方法还是一个阻塞式的方法

hasNext和hasNextLine的区别

二者都是用于判断“有无键盘输入”的,有则返回true,没有则阻塞!一定记住是阻塞而不是返回false,很多人都说是返回false,但你查源码会发现是不会返回false的,他会让你一直阻塞在判断阶段,二者只是在细节上有不同

  • hasNext()方法会判断接下来是否有非空字符.如果有,则返回true,没有则阻塞。例如一直敲回车相当于一直判断为空字符,但是不会返回false,而是一直阻塞在判断阶段,直到你输入了非空字符
  • hasNextLine() 方法会根据行匹配模式去判断接下来是否有一行(包括空行),如果有,则返回true。这个没什么特别的,只要是你敲了回车那都是true并且不会阻塞

例如像这种if语句是永远不可能执行到内部方法体的

if(scan.hasNext()==false){
    System.out.println("hasNext和hasNextLine不会返回false");
}

 再举一个例子加深理解:

Scanner scan = new Scanner(System.in);
System.out.println(scan.hasNextLine());
System.out.println(scan.hasNext());

 运行该代码,一直不停敲回车键,第一次回车会直接输出true,而后面一直敲都会阻塞在hasNext语句上,运行如下图

首先,在看用法和解释之前,有以下几个点必须时刻牢记

  • next方法不能录入空格,在特定情况下会把空格当作回车,nextLine方法可以识录入空格
  • hasNext和hasNextLine的返回值都是boolean类型,但只有可能返回true,不可能返回false,并且都默认以回车键为结束(hasNext可以设置为任意符号为结束键,不在本文研究范围之内)
  • hasNext、next不能直接识别裸回车,而hasNextLine和nextLine都可以直接识别裸回车。换句话讲:对于不输入符号而直接裸敲一个回车的操作,只有后两个能识别
  • hasNext、hasNextLine在返回一个boolean类型结果true的同时,会在堆空间中开辟一块专门用于存放刚刚输入的字符串,用于下次next或者nextLine:即下次next或者nextLine不需要再从键盘输入,相当于系统自动把刚刚输入的字符串再原封不动的输入了一遍。同时这个存储寿命=调用对象的寿命
  • 对于hasNext来说,每次敲击回车都相当于在堆空间中开辟一行,敲几次回车就会直接给后续next、nextLine方法赋值几次
  • hasNext是线程阻塞的,对于hasNext来说,如果一直不输入字符,反而一直敲回车的话,整个线程会卡在这个输入的地方,直到有字符输入

在知道 hasNext的方法用于判断和存储,next的方法用于输入之后,来做如下预备工作

因为hasNext、hasNextLine与next、nextLine有2X2种组合方式,所以我们用4段代码做4次实验就可以大体上了解他们的特性

以下4段代码希望看客们能亲自复制粘贴了试一试,以便更深理解

 hasNext 和 next组合

Scanner scan = new Scanner(System.in);
System.out.println("请输入字符串,并多混入空格回车尝试不同结果");
if(scan.hasNext() ) {
    System.out.println("第一次"+scan.next());
    System.out.println("第二次"+scan.next());
    System.out.println("第三次"+scan.next());
}

尝试输入:空格aaa空格bbb空格ccc回车

解释:

hasNext 和 NextLine组合

Scanner scan = new Scanner(System.in);
System.out.println("请输入字符串,并多混入空格回车尝试不同结果");
if(scan.hasNext() ) {
    System.out.println("第一次"+scan.nextLine());
    System.out.println("第二次"+scan.nextLine());
    System.out.println("第三次"+scan.nextLine());
}

解释:光标仍然闪烁,证明堆空间中的  aaa bbb ccc只赋值给了第一个,这也验证了nextLine可以录入空格。此时线程正在等待用户输入第二个nextLine

hasNextLine 和 next组合

Scanner scan = new Scanner(System.in);
System.out.println("请输入字符串,并多混入空格回车尝试不同结果");
if(scan.hasNextLine() ) {
    System.out.println("第一次"+scan.next());
    System.out.println("第二次"+scan.next());
    System.out.println("第三次"+scan.next());
}

hasNextLine 和 nextLine组合

Scanner scan = new Scanner(System.in);
System.out.println("请输入字符串,并多混入空格回车尝试不同结果");
if(scan.hasNextLine() ) {
    System.out.println("第一次"+scan.nextLine());
    System.out.println("第二次"+scan.nextLine());
    System.out.println("第三次"+scan.nextLine());
}

发现规律了吗

如果直接连续敲回车,那么hasNextLine会判断为true,同时进入if语句执行,并且输入了三个空行也会输出三个空行

验证hasNext、hasNextLine对输入代码的存储寿命

hasNextLine在if语句内,我们将验证语句next放在if语句之外,输入aaa bbb ccc ddd测试

Scanner scan = new Scanner(System.in);
System.out.println("请输入字符串,并多混入空格回车尝试不同结果");
if(scan.hasNextLine() ) {
    System.out.println("第一次"+scan.next());
    System.out.println("第二次"+scan.next());
    System.out.println("第三次"+scan.next());
}
        System.out.println("验证存储寿命是否=scan对象寿命"+scan.next());

 

 总结

hasNext、hasNextLine不可能返回false,只有true和阻塞两种结果

hasNext、hasNextLine会判断有无输入,并且hasNext一直敲回车而不输入字符会导致线程阻塞

hasNext、hasNextLine也有存储功能,从“开始输入”到“判断结束”的过程中的所有输入都将储存,直到之后遇到需要键盘输入的next、nextLine,这些存储的字符串和空格会自动填写给后面的next、nextLine。而空格再next和nextLine上有不同的表现

查看API还有很多同类型的不同方法,按照这个思路可以一通百通

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐