hasNext、hasNextLine、next、nextLine保姆级详解

article/2025/11/4 16:00:45

目录

前言

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还有很多同类型的不同方法,按照这个思路可以一通百通


http://chatgpt.dhexx.cn/article/F0gEoY11.shtml

相关文章

细节!关于Java中的next与nextLine

目录 一、发现问题 二、解决问题 (1)输入连续字符串 (2)输入不连续字符(含有空格等) (3)nextLine()方法在前,next()方法在后 (4)next()方法在…

NextJs 学习笔记

NextJs 学习笔记 简述 之前使用过 Nuxt3 基于前端框架 Vue3 来开发网站,因为 Nuxt3 很多地方借鉴了基于 React 的 SSR 框架 Next,因此最近抽时间开始学习一下 Next 这个框架。 创建项目 npx create-next-applatest # or yarn create next-app # or p…

next和nextLine的使用

(因为最近在学算法,我只讲实际应用方面的区别,不讲理论) 一、hasNext()与hasNextLine()的区别? 1、hasNext()方法会判断接下来是否有非空字符.如果有,则返回true,否则返回false 2、hasNextLine() 方法会根据行匹配模式…

nextSibling和nextElementSilbing使用以及解决兼容性问题

nextSibling和nextElementSilbing使用以及解决兼容性问题 1、今天学习了 获取兄弟节点 的方法 – nextSibling(获取下一个兄弟节点)、previousSibling(获取上一个兄弟节点) Node.nextSibling 是一个只读属性,返回其父节点的 childNodes 列表…

电脑同时连接内网和外网的方法

前提 首先电脑要有两个网卡,比如一个有线一个无线(常见,本文以此为例),或者两个无线网卡等等。 不论是有线连接内网(外网),还是无线连接内网(外网)&#xff0…

如何设置内网和外网同时使用

工作中,经常需要电脑连接内网服务,内网服务非公网,如果需要电脑连接公网需要进行切换,特别的麻烦。其实,一个电脑可以同时连接两个网络服务。工作中,经常会遇到网络设置的问题。对于工作,一般都…

如何实现在内网和外网同时使用

我们在办公的时候很多情况会遇到内网办公,但是这时候不能够使用外网,今天介绍一种方法解决这个问题: 操作步骤: 01、查看当前的网络配置 通过ipconfig查看当前内网的网络配置,获取到ip、子网掩码、默认网关等信息。 02、完后进…

内网访问外网和外网访问内网的原理

假如设A 和 B 的局域网 IP 相同(192.168.31.11),当他们同时访问百度服务器的时候,百度服务器如何区分哪个是 A,哪个是 B 呢? 解决方案:端口映射 什么是端口映射? 端口映射是 NAT …

[NET]什么是公网、私网、内网、外网?

背景:大家可能对什么是公网、私网、内网、外网有疑惑,今天我们来说下它们之前的区别,已经大家耳熟能详的VPN,SNAT,DNAT的作用。 简单理解公网是相对于私网的,而外网是相对于内网的:

竟然还有人不知道什么是内网、外网?快收藏学习吧!

内网 内网又称局域网(Local Area Network,LAN),是指在某一区域内由多台计算机以及网络设备构成的网络,比如校园网、政府网等,一般方圆几公里。 我们常说的内网,从字面意思上来讲是区别于外网的…

如何理解内网和外网?

如何理解内网和外网? 1.感性上认识 判断内网和外网的重要依据是:是否与广阔的外界网络相连。 在有互联网之前,世界上是先有了局域网,一些公司构建了自己的局域网,供自己公司员工之间进行沟通。对于外来人员来说&…

局域网的主机如何连接外网

一、局域网内主机上外网——NAT 1、内网与外网 (1)内网 即所说的局域网,比如学校的局域网,局域网内每台计算机的 IP 地址在本局域网内具有互异性,是不可重复的。但两个局域网内的内网 IP 可以有相同的。 &#xff08…

内网外网同时使用

在很多网络环境中,为了安全起见,不允许内网、外网同时使用。但很多时 候(比如说远程的时候)又需要同时使用外网和内网,下面介绍一下外网、内网 同时使用的操作方法。 环境: 1、电脑的本地网卡设置成内网的…

内网和外网之间的通信

对于初学者而已,我们学习的网络编程(如TCP,UDP编程),我们通常都是在局域网内进行通信测试,有时候我们或者会想,我们现在写的内网网络数据和外网的网络数据有什么不同,我们内网的数据是如何走出外…

探秘 | 如何分辨内网和外网?

目录 💡 什么是外网IP、内网IP? 💡 对于自有路由器上网的用户,可以这样理解外网IP、内网IP 💡 几个大家经常会问的问题 什么是外网IP、内网IP?很多用户都有一个疑惑,如果不使用路由器拨号上网…

实现电脑同时上内网和外网(或通过外网访问到该电脑通过该电脑访问内网)

一、需求描述 目前使用的公司网络只能够上内网,但是又有上外网查资料的需求: ①想要实现电脑既能上内网的同时也可以上外网; ②想要使用其他外网电脑使用外网连接到该电脑,通过该电脑访问内部的网络内容。 二、准备内容 电脑必须具备两个网卡,即:可以同时连接内网和外…

如何理解内网和外网

如何理解内网和外网 写这篇博文的动力来自于,大狗问我什么是内网和外网(没错,我就是站在程序猿顶端的有女票的程序猿:p),一个惊讶,为什么她会问这样的问题,在现实生活中,不管你是不…

内网和外网的区别是什么?

内网和外网的区别重要依据主要是判断它是不是与广阔的外界相连。 内网和外网最大的区别 内网IP局域网,网线都是连接在同一个 交换机上面的,也就是说它们的IP地址是由交换机或者路由器进行分配的。而且每一个IP也是有所不同的,并且这些连接在…

外网与内网

一、外网和内网  其实外网和内网的概念很模糊。  简单的说,自己的单位或者家庭、小区内部有局域网;单位、家庭之外有覆盖范围极大的网络,比如internet,这个大网络延伸到了我们的单位、家庭(通过光纤、网线、电话线等…

内网和外网的区别?

网络按地域范围分类:局域网、城域网、广域网 网络按使用者分类为:公共网 和 专用网 内网 内网又称局域网(Local Area Network,LAN),是指在某一区域内由多台计算机以及网络设备构成的网络。 外网 外网又称广…