Scanner类中next()、nextLine()、hasNext()、hasNextLine()等方法的区别与联系

今天做题,踩到了Scanner类中的一个坑,有点小无语,故此小结一番。

尽管遗忘的东西越来越多,但我并不想把所有东西都还给老师,嘿嘿,下面进入正题。

Scanner类存在于Java中的java.util包,相信很多人对它都不陌生。

在IDE中,每当我们需要从控制台通过键盘输入东西时,就要用到它了。

这个类中,我们常用的几个方法有next()、nextLine()、hasNext()、hasNextLine()、nextInt()、hasNextInt() 等。

为了好区分,我把这几个方法分成两个部分,第1部分是类似 nextXxx() 格式的方法,而第2部分则是类似 hasNextXxx() 格式的。


第1部分 nextXxx()方法

1. 简 介

(1)nextXxx() 格式的方法,主要用来获取在控制台输入的值。

(2)nextXxx() 格式的方法涵盖的数据类型主要包括以下几种:

  • String类型:next()、nextLine()、next(Pattern pattern)、next(String pattern)
  • byte类型:nextByte()、nextByte(int radix)
  • short类型:nextShort()、nextShort(int radix)
  • int类型:nextInt()、nextInt(int radix)
  • long类型:nextLong()、nextLong(int radix)
  • float类型:nextFloat()
  • double类型:nextDouble()
  • boolean类型: nextBoolean()
  • BigDecimal类型:nextBigDecimal()
  • BigInteger类型:nextBigInteger()、nextBigInteger(int radix)

下面通过具体的代码来演示一下。

package com.org.example;

import java.util.Scanner;
public class TestExam {

	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		
		String string = scanner.next();
		int i = scanner.nextInt();
		double d = scanner.nextDouble();
		
		System.out.println("这是一个字符串:"+string);
		System.out.println("这是一个整数:"+i);
		System.out.println("这是一个小数:"+d);
		
		
		scanner.close();
	}
}

结果
从程序的运行结果,可以看到,当我们在控制台连续输入helloWorld、20、101.25三个输入项时,每个值都能被获取到,并且根据代码重新正确地输出到控制台。

在这么多种数据类型的方法中,我们常用的主要还是String类型和int类型的方法,掌握了这两种,其它的可以说是大同小异,不足为虑。

2. String类型next()、nextLine()方法的区别与联系

(1)这两个方法都是属于String类型的方法,都可以用来获取在控制台输入的字符串。

(2)next()方法获取的是没有被空格、换行、回车符隔断的连续字符串。

(3)nextLine()方法获取的是在回车符之前,所输入的一整行字符串,回车符作为分割点,空格、换行符没有影响。

示例1,演示next()方法,分别没有空格和有空格进行隔断的字符串获取情况

package com.org.example;

import java.util.Scanner;
public class TestExam {

	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("请输入一个没有空格的字符串:");
		String string1 = scanner.next();
		System.out.println("输入一个没有空格的字符串后,得到的结果:"+string1);
		
		System.out.println();
		System.out.println("===================分隔线========================");
		System.out.println();
		
		System.out.print("请输入一个有空格的字符串:");
		String string2 = scanner.next();
		System.out.println("输入一个有空格的字符串后,得到的结果:"+string2);
			
		scanner.close();
	}
}

演示结果
从运行结果可以看到,当输入不带空格的字符串“thisIsMyHome”时,next()方法获取到的是敲下回车键之前输入的“thisIsMyHome”;而当输入带空格的字符串“this Is My Home”时,next()方法最后得到的是一个“this”,后面的字符串由于被空格隔断,并没有获取到。

示例2,演示nextLine()方法,分别没有空格和有空格进行隔断的字符串获取情况

package com.org.example;

import java.util.Scanner;
public class TestExam {

	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("请输入一个没有空格的字符串:");
		String string1 = scanner.nextLine();
		System.out.println("输入一个没有空格的字符串后,得到的结果:"+string1);
		
		System.out.println();
		System.out.println("===================分隔线========================");
		System.out.println();
		
		System.out.print("请输入一个有空格的字符串:");
		String string2 = scanner.nextLine();
		System.out.println("输入一个有空格的字符串后,得到的结果:"+string2);
			
		scanner.close();
	}
}

演示结果2
从程序运行结果可以看到,无论输入的字符串有没有空格,nextLine()方法都会将敲下回车键之前输入的字符串全部获取到,并返回输出到控制台。

3. int类型nextInt()、nextInt(int radix)方法的区别与联系

(1)nextInt()方法:获取一个从控制台输入的整数。如果输入的数字不是int型,会报错;如果数字之间被空格隔开,此时与next()方法类似,会获取第一个空格之前的数字。

用个示例演示一下:

package com.org.example;

import java.util.Scanner;
public class TestExam {

	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("请输入一个数字:");
		int i = scanner.nextInt();
		System.out.println("得到的结果是:"+i);
			
		scanner.close();
	}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)nextInt(int radix)方法:括号中的int radix代表的是读入数字的进制,比如2进制、8进制、10进制、16进制,代表进制的选择,如果为空,默认是10进制。方法执行完成后,读入的数字会转换成10进制的数字进行返回。

用实际示例演示一下:

package com.org.example;

import java.util.Scanner;
public class TestExam {

	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("请输入一个数字:");
		int i = scanner.nextInt(2);		//2表示读入的是二进制数
		System.out.println("得到的结果是:"+i);
			
		scanner.close();
	}
}

在这里插入图片描述
注意点:我们从控制台输入的内容,其实都是以字符串形式输入的,对于像nextInt()这样的方法,为什么能得到int类型数值,那是因为方法的底层做了一个将String类型转为int类型的处理。

其它基本数据类型的方法,和int型的很相似,在此不再赘述。


第2部分 hasNextXxx()方法

1. 概 述

(1)hasNextXxx() 格式的方法,返回值都是布尔(boolean)类型的,这意味着,这些格式的方法,基本是用来做判断,检测是否有输入项的。

(2)通过对比可以发现,hasNextXxx() 格式的方法与nextXxx() 格式的方法,仅仅是一个has的问题,所以在涵盖的数据类型方面,两者基本一致。

  • 对于String类型的判断:hasNext()、hasNextLine()、hasNext(Pattern pattern)、hasNext(String pattern)
  • 对于byte类型的判断:hasNextByte()、hasNextByte(int radix)
  • 对于short类型的判断:hasNextShort()、hasNextShort(int radix)
  • 对于int类型的判断:hasNextInt()、hasNextInt(int radix)
  • 对于long类型的判断:hasNextLong()、hasNextLong(int radix)
  • 对于float类型的判断:hasNextFloat()
  • 对于double类型的判断:hasNextDouble()
  • 对于boolean类型的判断: hasNextBoolean()
  • 对于BigDecimal类型的判断:hasNextBigDecimal()
  • 对于BigInteger类型的判断:hasNextBigInteger()、hasNextBigInteger(int radix)

用个示例演示一下hasNextInt()方法:

package com.org.example;

import java.util.Scanner;
public class TestExam {

	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		
		boolean aa = scanner.hasNextInt();
		
		if (aa) {
			System.out.println("输入正确!");
		}else {
			System.out.println("输入错误!");
		}
		
		scanner.close();
	}
}

在这里插入图片描述
在这里插入图片描述
从上面的结果可以看到,第一次,输入一个this,报了输入错误;第二次,输入85,则提示输入正确。这说明hasNextInt()方法会先对输入的数据进行数据类型判断,如果得到的是int类型,则返回true给到aa,否则返回false。

其它方法也是类似的,不再做其它演示。

2. hasNextXxx()方法的使用

(1)以hasNextInt()作为代表,演示一下数值类型方法的使用

package com.org.example;

import java.util.Scanner;
public class TestExam {

	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		
		while(scanner.hasNextInt()) {
			int i = scanner.nextInt();
			System.out.println("输入的值是:" + i);
		}
		scanner.close();
	}
}

在这里插入图片描述
在实际应用中,hasNextInt()经常与nextInt()结合使用,前者用作判断,后者用来获取从控制台输入的值。

在这里需要明白的是:

1)当我们执行代码时,hasNextInt()会先检测控制台是否是空的,如果是空的,则让我们先输入一个值;

2)hasNextInt()对我们输入的值进行判断,如果结果是true,则将得到的实际数值保存到缓存中,然后将方法执行结果true返回,接着执行while循环中的代码;(下图是hasNextInt()方法源码)
在这里插入图片描述
3)当执行到int i = scanner.nextInt();这行代码时,理论上是要我们在控制台输入一个值,然后nextInt()方法获取到,接着赋值给i。从上面的结果,我们可以看到,nextInt()方法获取到的值,其实是我们在hasNextInt()方法做判断时输入的值。原因是nextInt()方法会先从缓存中看看有没有值,如果有就直接获取,没有再要求从控制台输入。(nextInt()方法源码如下)
在这里插入图片描述
(2)hasNext()hasNextLine()方法

这两个方法对于输入流的检测存在差异:

  • hasNext()方法以检测接下来是否还有非空字符为主,如果有则返回true,否则false
  • hasNextLine()方法,从名字可以推测,是以行的方式去判断的,即判断接下来是否还有一行(\n空行也被当作一行),如果有则返回true,反之返回false

在使用时,最好是hasNext()next()方法搭配使用,hasNextLine()nextLine()方法搭配使用。

示例如下:

package com.org.example;

import java.util.Scanner;
public class TestExam {

	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		
		while(scanner.hasNext()) {
			String string = scanner.next();
			System.out.println("输入的值是:" + string);
		}
		
//		while(scanner.hasNextLine()) {
//			String string = scanner.nextLine();
//			System.out.println("输入的值是:" + string);
//		}
		
		scanner.close();
	}
}

在这里插入图片描述
在这里插入图片描述

小结

1、无论是nextXxx()方法还是 hasNextXxx()方法,两者都具有读取控制台输入的能力,也就是说,都可以单独读取我们输入的值。

2、无论是使用nextXxx()还是hasNextXxx(),在控制台输入完输入项,然后按 回车 ,都是我们结束输入的方式,这对这二者都适用。

3、nextXxx()方法主要用来获取从控制台输入的数值,然后用该数值进行一些其它的操作;而hasNextXxx()方法更多的是用来做判断,判断是否还是输入项。

  • 23
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值