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.youkuaiyun.com/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