有关包装类的知识以及nextline()和next()用法上的一些区别和说明

有关包装类的知识以及nextline()和next()用法上的一些区别和说明

输入一组数,存储到数组中

public class test{
	public static void main(String[] args){
		Scanner aScanner = new Scanner(System.in);
		int[] arr = new int[4];
		for(int i=0;i<arr.length;i++){
			arr[i] = aScanner.nextInt();
		}
		System.out.println(Arrays.toString(arr));
	}
}

我就一直很疑惑,为什么for循环中aScanner.nextInt()会一直读取下一个单词,i++和它又没有关系。
其实是这样的
我们都知道,String nextLine(),是读取输入的下一行;String next(),是读取输入的下一个单词(空格作为分隔符)
在这里插入图片描述
译:扫描程序使用分隔符模式将其输入分解为标记,该模式默认匹配空格。然后,可以使用各种后续方法将结果标记转换为不同类型的值。
nextLine()是扫描当前行,遇到回车后返回回车前的字符串,不包括末尾的换行符
next()将输入的下一个标记返回,标记就是指分隔符(相邻空格或者回车)之间的字符(不包括分隔符)
在这里插入图片描述

在这里插入图片描述
从代码中可以看到,nextLine()中clearCaches()清空了缓存区,而next()不会清空缓存,只是读取了相邻分隔符之间的字符串,将分隔符仍然留在缓冲区,这也就能解释我之前的那个问题,为什么每次都会自动读取下一个“单词”。就是因为缓存区的存在。

回到最初的代码问题,如果输入的数组是字符串类型的呢,怎样放进整型数组里呢,有人说强转不行吗,请注意不管是数值类型之间的转换还是强制类型转换,针对的都是基本数据类型,而字符串不属于基本数据类型。

那么我们做项目时,输入的基本上都是字符串,需要转换成所需类型,怎么办呢,于是Java就引入了一个概念叫包装类

众所周知,Java是面向对象语言,而基本数据类型就不是对象,但是我们在实际应用中又需要将基本数据类型转化为对象,以便操作,比如说将基本数据类型存储到object[]数组或集合操作等等。
为了弥补这个不足,Java在设计类的时候为每个基本数据类型设计了一个对应的类进行代表,这样的八个和基本类型相对应的类统称为包装类

基本数据类型包装类
byteByte
booleanBoolean
shortShort
charCharacter
intInteger
longLong
floatFloat
doubleDouble

你看到这里是不是觉得有些类名称有点眼熟,他们和BigDecinal、BigInteger都属于ava.lang.math下的类。相应的,这些类也有一些方法,intvalue()、longValue()、floatValue()、doubleValue(),这些方法使这些包装类相互也可以转换

public class Test{
	public static void main(String[] args){
			Intesger a1 = Integer.valueof(20);
			//基本数据类型转换为包装类
			int a2 = a1.intValue();
			//包装类转换为基本数据类型
			Double d1 = a1.doubleValue();
			Float f1 = a1.floatValue();
			//包装类可以和其他继承Number类的子类对象互相转换
			Integer a3 = Integer.valueof("30");
			//字符串转换为包装类
			String s1 = a3.toString();
			//包装类转换成字符串
	}
}

自动装箱和拆箱
基本数据类型和包装类对象转换时,Java虚拟机会自动进行装箱和拆箱。
什么叫自动装箱呢
就是将值类型转换为对象类型

Integer in1 = 123//与Integer in1 = Integer.value of(123);相等

同理自动拆箱就是将对象类型转换为值类型

int in2 = in1;
//等价于 int in2 = in1.intvalue();

包装类的缓存问题
如下代码
在这里插入图片描述
运行结果
在这里插入图片描述
这是什么情况?

这是因为java为了提高效率,所以针对Integer类做了一个缓冲范围。JSL(JavaLanguageSpecification,java语言规范)规定,Integer的缓冲范围为[-128,127]。
也就是说把Integer类装载入内存时,把[-128,127]范围内的整型数据包装成了Integer类,并将其对应的引用放入到catche数组中,如果没有超出缓冲范围,直接返回引用,不用重新开辟内存空间,如果超出范围,会在堆中开辟一块新的Integer对象的内存空间,来存放值。

利用缓存,既能提高程序执行效率还能节约内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值