浅析Java中Scanner的next()和nextLine()方法
来源:互联网 发布:和俄罗斯女人啪啪知乎 编辑:程序博客网 时间:2024/05/29 17:00
package demo;import java.util.Scanner;public class nextVSnextLine {public static void main(String[] args) {//赋值与测试Scanner scanner = new Scanner(System.in);System.out.println("输入待扫描的内容,以空格或Tab键隔开,按回车键结束:");String result1 = scanner.next();String result2 = scanner.nextLine();scanner.close();//输出结果System.out.println("先后运行next()与nextLine()的结果如下:");System.out.printf("next()的运行结果result1 = \"%s\";\n", result1);System.out.printf("nextLine()的运行结果result2 = \"%s\"。\n", result2);}}
测试输入内容:
(空格)(空格)a(空格)(Tab)bc(Tab)d,e(空格)fg(空格)(空格)(空格)(回车)
运行结果:======================================
输入待扫描的内容,以空格或Tab键隔开,按回车键结束:
a bc d,e fg
先后运行next()与nextLine()的结果如下:
next()的运行结果result1 = "a";
nextLine()的运行结果result2 = " bc d,e fg "。
======================================换言之,
测试内容:(空格)(空格)a(空格)(Tab)bc(Tab)d,e(空格)fg(空格)(空格)(空格)(回车)
result1 = scanner.next() = “(空格)(Tab)”;
result2 = scanner.nextLine() = "(空格)(Tab)bc(Tab)d,e(空格)fg(空格)(空格)(空格)";
按个人理解,代码执行过程如下图所示:
next()与nextLine()方法运行过程示意图
如图,首次执行scanner.next()时,大概有如下几个过程:
①【分段】:先将输入内容按分隔记号(空格键或Tab键)拆分成若干段,其中每一段都是可供后台使用的有效内容;
②【定位】:再从当前扫描位置开始,从左向右搜索下一个分隔记号“(空格)(Tab)”,同时将扫描位置移至该记号的起点,即定位至“(空格)(Tab)”的最左端;
③【输出】:将前后两个扫描位置之间的有效内容作为next()的返回值,即“a”,赋给字符串变量result1;
类似地,在执行完scanner.next()后,执行scanner.nextLine()时的处理步骤可能是:
①【定位】:其目标是定位下一个可视为该行结束的换行符。本例中是以当前扫描位置(a的末尾)为起点,搜索所在行的结束符号(即换行符,这里为回车键),同时将扫描位置移至该记号的起点,即定位至换行符的最左端;
②【输出】:将前后两个扫描位置之间的所有内容作为nextLine()的返回值,即“(空格)(Tab)bc(Tab)d,e(空格)fg(空格)(空格)(空格)”,赋给字符串变量result2;
③【重定位】:返回值处理完毕,将当前扫描位置指向换行符的末尾,即移至下一行的起始位置,以备执行下一次扫描语句(如使用next()、nextLine()、nextInt()、nextFloa()等等)。
通过以上梳理,有如下结论:
1、方法名的字面理解:
(1)scanner.next()方法可以将指针从当前位置指向下一个被断字符断开的有效元素的末尾,或下一个分隔符号区的起点位置,方法名中的next是指代下一个(有效元素)(next (valid element))的末尾;(如果定义成nextValidElement可能会更准确,但不如next来得简单),由此发散,可以推测nextInt()、nextFloat()、nextDouble()等的字面含义,即执行一次对应的方法,指针将统一从当前位置开始,分别指向下一个有效整数(next integer)的末尾、下一个有效单精度浮点数(next float)的末尾、下一个有效双进度浮点数(next double)的末尾。
(2)scanner.nextLine()方法可以将扫描器的指针从当前位置指向下一个被断行符断开的有效行的末尾,或下一个换行符的起点位置;然后返回指针扫过的所有内容,最后将指针挪到该换行符的末尾。方法名中的nextLine是指代下一行(next line)的起点。
2、next()与nextLine()的区别:
(1)next()不能提取带有空格或Tab键的内容,而nextLine()可以;
(2)next()只能在同一行扫描,单独使用无法转到其他行,换行需要至少执行一次nextLine();
(3)next()停止扫描的前提是识别到下一个分隔符号;nextLine()则是识别到回车键或手动换行符。
(4)next()与nextLine()一前一后执行赋值时,若next()刚好取走一行内容中最后一个有效元素、nextLine将由于当前指针后只剩一个换行符而无法正常赋值。此时nextLine执行后将返回""。因此有必要在next()后紧跟一个nextLine(),确保其后真正的赋值语句不取空值""。
参考资料:
http://blog.csdn.net/zhiyuan_ma/article/details/51592730
http://www.cnblogs.com/gold-worker/archive/2013/04/10/3013063.html
http://blog.sina.com.cn/s/blog_81547cad01018mnd.html
- 浅析Java中Scanner的next()和nextLine()方法
- Java中Scanner类的next()和nextLine()方法对比
- java Scanner 中 next()方法和nextLine()区别
- Scanner中next()方法和nextLine()方法的区别
- Scanner中nextLine()方法和next()方法的区别
- Scanner中nextLine()方法和next()方法的使用概括
- java Scanner中的 next() 方法和 nextLine() 方法的区别
- Java中Scanner的nextInt(),next(),nextLine()方法总结
- Java中Scanner的nextInt(),next(),nextLine()方法总结
- Java中Scanner的nextInt(),next(),nextLine()方法总结
- Scanner中next()和nextLine()方法的区别
- Java控制台输入Scanner中next和nextLine的区别
- Java中Scanner的next()和nextLine()区别
- Java之Scanner类中next()和nextLine()的区别
- Java Scanner next()和nextLine()的区别
- Java Scanner next()和nextLine()的区别
- java中Scanner类中的next()和nextLine()方法的区别
- Scanner中next()和nextLine()
- Java编程思想
- 百位数分解
- 通过私有化构造器强化不可实例化的能力
- 显著性论文学习阶段总结(二)
- Rotate Array
- 浅析Java中Scanner的next()和nextLine()方法
- <meta http-equiv="X-UA-Compatible" content="IE=edge" >
- 源码级调试C库
- 看看Retrofit2.0运行方式
- Leetcode:Longest Palindromic Substring QuestionEditorial Solution
- 《Android开发艺术探索》之学习笔记(三)View的基础知识
- 排序算法
- 设计优化(2)代理模式
- 装载问题 回溯法解决