nextline函数_在JAVA中Scanner中的next()和nextLine()为什么不能一起使用?

nextline函数_在JAVA中Scanner中的next()和nextLine()为什么不能一起使用?Java输入一直是一个坑,本来一直用Scanner,但一直搞不懂换行符啥的,就用BufferReader,但前不久大疆笔试需要持续输入,早忘了Scanner怎么写,而那个场景用Scanner很好实现……就继续在这里记录一下Scanner的坑吧一、next&nextLine区别next不能得到带有空格的字符串一定要读到有效字符后才可以结束,结束条件是碰到空格…

大家好,又见面了,我是你们的朋友全栈君。

Java 输入一直是一个坑,本来一直用 Scanner,但一直搞不懂换行符啥的,就用 BufferReader ,但前不久大疆笔试需要持续输入,早忘了 Scanner 怎么写,而那个场景用 Scanner 很好实现 ……

就继续在这里记录一下 Scanner 的坑吧

一、next & nextLine

区别next不能得到带有空格的字符串

一定要读到有效字符后才可以结束,结束条件是碰到空格、tab 键、enter 键

nextLine可以获得空白

以回车作为结束符,也就是 nextLine 返回回车之前的所以字符

举例

代码调用分两种:

class ScannerDemo {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int num = sc.nextInt();

String[] str = new String[num];

for (int i = 0; i < num; i++) {

//str[i] = sc.next(); //str[i] = sc.nextLine(); }

sc.close();

}

}

1. next 使用举例:

输入 1:

2

abc

cba

结果 1:

str[0] = “abc”

str[1] = “cba”

原因:next() 方法在遇到有效字符前所遇到的空格、tab 键、enter 键都不能当作结束符。所以,读到 abc 后回车,存下第一个,读到 cba 后回车存下第二个。

输入 2:

2

abc cba

efg gfe

结果 2:

str[0] = “abc”

str[1] = “cba”

原因:next() 方法在遇到有效字符前所遇到的空格、tab 键、enter 键都不能当作结束符。所以,读到 abc 后有空格,存下第一个,读到 cba 后回车存下第二个。所以,循环退出。不是预期的 “abc cba” 和 “efg gfe”

2. nextLine 使用举例:

输入 1:

2

abc

cba

结果 1:

str[0] = “”

str[1] = “abc”

原因:以回车( “\r” )作为结束符,也就是 nextLine 返回回车( \r )之前的所以字符。

对于 “” 的情况分析:

在输入 2 的时候调用的是 nextInt返回:nextInt 返回的是结束符之前的内容,并不会返回结束符

我们的输入:2 \r

以回车 ( \r ) 结尾,于是 2 被返回,回车符 “\r” 它被丢弃在缓冲区中,现在缓冲区中,只有一个 \r ,于是 下一次 nextLine 扫描的时候就又扫描到了 \r,返回它之前的内容,也是啥都没有 “” ,然后再把 \r 去掉,

对于 “abc” 的情况分析:

下一次我们输入的是 abc\r,此时这个就是缓冲区的全部内容

所以下一次 nextLine 调用的时候,就返回 abc,再把 \r 去掉

输入 2:

2

abc bcf

efg gfe

结果 2:

str[0] = “”

str[1] = “abc bce”

对于 “” 的情况分析同输入 1

对于 “abc bce” 的情况分析:

第一次调用 nextLine 的时候,就清空了缓冲区,于是输入:abc bcf\r ,第二次调用 nextLine 的时候读取到了 \r 返回字符串 “abc bcf” 再把 \r 从缓冲区去掉

总结

总结一下,Scanner是一个扫描器,它扫描数据都是去内存中一块缓冲区中进行扫描并读入数据的,而我们在控制台中输入的数据也都是被先存入缓冲区中等待扫描器的扫描读取。这个扫描器在扫描过程中判断停止的依据就是“结束符”,空格,回车,tab 都算做是结束符

而坑点在于 next 系列的,也就是下面这些函数:next

nextInt

nextDouble

nextFloat

这些函数与 nextLine 连用都会有坑

坑点就是 next 系列的函数返回了数据后,会把回车符留在缓冲区,因此我们下一次使用 nextLine 的时候会碰到读取空字符串的情况

解决方案:输入都用 nextLine ,做格式转换

输入 next 系列函数调用后,中间调用一次 nextLine 调用去掉了回车符后,再调用一次 nextLine 调用真正输入我们的数据

都使用 nextLine:

class ScannerDemo {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int num = Integer.parseInt(sc.nextLine());

String[] str = new String[num];

for (int i = 0; i < num; i++) {

str[i] = sc.nextLine();

}

sc.close();

}

}

使用 next、nextLine 去临时回车符、nextLine 读入真正数据:

class ScannerDemo {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int num = sc.nextInt();

String[] str = new String[num];

sc.nextLine();

for (int i = 0; i < num; i++) {

str[i] = sc.nextLine();

}

sc.close();

}

}

这两种方式都能解决可读入带空格的字符串,并且不会读异常空串:

输入

2

abc cba

efg gfe

结果

str[0] = “abc cba”

str[1] = “efg gfe”

二、Scanner 性能

Scanner 是真的太慢了,一直用的是 BufferReader 写的,但今天一尝试就超时,于是改回用 BufferReader 就过了

归根结底是因为 Scanner 对输入字符实现了多样性的操作,BufferReader 就比较单一,读入的是字节流转换成字符串

实际测试,BufferReader 至少比 Scanner 输入快两倍

用 Scanner 是为了循环输入的功能,也就是 hasNext() 方法的功能

今天忽然想到了可以用死循环来代替,所以,还是继续使用 BufferReader 吧!少年!Scanner 性能劝退

class Main{

public static void main(String[] args) throws IOException {

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

while (true){

System.out.println(bf.readLine()); //循环输入 }

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/136846.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • hashmap的实现原理面试_jvm面试题总结及答案

    hashmap的实现原理面试_jvm面试题总结及答案①HashMap的工作原理HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存…

  • 世纪之战:Python和Java,到底学哪个更好?

    世纪之战:Python和Java,到底学哪个更好?零基础自学java,点击了解:https://how2j.cn本文章转载自(如有侵权联系我删除):微信公众号Java技术栈有人曾经将编程比作做菜,那编程语言就是首先要准备的食材或厨具。尽管在刚开始开发AI时,有很多编程语言都可以满足你的需求,但没有一种编程语言是可以一站式解决AI编程的问题,因为在每一个项目中,不同的目标需要特定的方法。和做菜时的精挑细选一样,在成为一个「高手」…

  • 调用接口返回中文乱码_java请求接口返回乱码

    调用接口返回中文乱码_java请求接口返回乱码最近调用Webservice接口时,遇到接收乱码的问题最开始用soapUI测试看XML结果是正常的,返回结果大概是这样(只截取了json部分结果){“state”:0,”message”:”流程启动成功”,”seqno”:”202005020009″}后来在JAVA后台使用HttpURLConnection调用(全部代码在后面),发现返回来的中文部分全部乱码,如下{“state…

  • 托马斯微积分第十一版中文版_托马斯微积分14版网盘

    托马斯微积分第十一版中文版_托马斯微积分14版网盘

    2022年10月29日
  • _beginthread, _beginthreadex

    _beginthread, _beginthreadex语法uintptr_t_beginthread(//NATIVECODEvoid(__cdecl*start_address)(void*),unsignedstack_size,void*arglist);uintptr_t_beginthread(//MANAGEDCODEvoid(__clrcall*start_add…

    2022年10月31日
  • html psd设计图,根据PSD登陆页面设计稿切图制作HTML网页全过程

    html psd设计图,根据PSD登陆页面设计稿切图制作HTML网页全过程切图的目的是把PSD设计稿转换为HTML页面。记得自己当时学习切图时,网上切图相关的文章是不少,但是大都是讲怎么使用切片工具把一张图片分割成多张图片,然后存储为Web使用格式,并且都比较简单和零碎,并不能满足我的要求。因此只能自己不断尝试,今天分享给大家“如何根据PSD设计稿通过PS切图和DIV+CSS布实现HTML页面”,希望能帮助到大家。实例:下面通过一个简单的登陆页面PSD设计稿来演示转化为…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号