说⼀说⼋种基本数据类型及其包装类
简介
Java基本数据类型分为四⼤类:
整数型:byte,short,int,long
浮点型:float,double
逻辑型:boolean
字符型:char
原始类型原始类型所占的字节包装类byte1个字节Byte
short2个字节Short
int4个字节Integer
long8个字节Long
float4个字节Float
double8个字节Double
boolean1个字节Boolean
char2个字节Character
常见⾯试题
要注意的是基本数据的包装类很多都实现了享元模式。享元模式就是运⽤共享技术有效地⽀持⼤量细粒度对象的复⽤。⽤⼀个常见的⾯试题来解释。
1,判断如下代码的输出,并说明原因
Integer a1 =40;
Integer a2 =40;
System.out.println(a1 == a2);
Integer a3 =200;
Integer a4 =200;
System.out.println(a3 == a4);
由⾃动装箱和⾃动拆箱可以知道这2种写法是等价的
Integer a1 = 40;
Integer a1 = Integer.valueOf(40);
再来看看Integer的valueOf⽅法
public static Integer valueOf(int i){
//i的取值范围是[-128,127]
if(i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i +(-IntegerCache.low)];
return new Integer(i);
}
IntegerCache是Integer的静态内部类,默认创建了[-128,127]的对象,并放到IntegerCache内部的⼀个cache数组中,在[-128,127]这个范围内的整数对象,不⽤创建。直接从IntegerCache中的cache数组中根据下标拿就可以,超出这个范围的每次去创建新的对象。其他⼏种包装类型的常量池和Integer思路都差不多,源码也很相似。
所以答案如下:
//true
System.out.println(a1 == a2);
Integer a3 =200;
Integer a4 =200;
//false
System.out.println(a3 == a4);
包装类的缓存范围如下
包装类缓存范围
Byte-128~127
Short-128~127
Integer-128~127
Long-128~127
Character0~127
2,Java⼀个char类型可以存储中⽂吗?
可以,因为java中使⽤了Unicode字符,不论中英⽂都固定占⽤了2个字节。
3,什么是⾃动装箱,⾃动拆箱?
⾃动装箱就是Java⾃动将原始类型值转换成对应的对象,⽐如将int变量转换成为Integer对象,这个过
程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。因为这⾥的装箱和拆箱是⾃动进⾏的⾮⼈为转换,所以就称为⾃动装箱和拆箱。
⾃动装箱时编译器调⽤valueOf将原始类型值转换成对象,同时⾃动拆箱时,编译器通过调⽤类似intValue(),doubleValue()这类⽅法将对象转换成原始类型值。
//jdk1.5之前的写法
Integer tempNum1 = Integer.valueOf(5);
int num1 = tempNum1.intValue();
//jdk1.5之后的写法
Integer tempNum2 =5;
int num2 = tempNum2;
4,为什么需要基本数据类型的包装类?
(1)Java是⾯向对象的语⾔,很多地⽅需要使⽤的是对象⽽不是基本数据类型。例如,List,Map等
容器类中基本类型是放不进去的。(2)包装类在原先基本数据类型上,新增加了很多⽅法,如Integer.valueOf(String s)
5,既然包装类能完成所有功能,为什么还需要基本类型?
基本数据类型是基于数值,对象类型是基于引⽤。基本数据类型存储在栈的局部变量表中。
⽽对象类型的变量则存储对中的引⽤,实例放在堆中,因此对象类型的变量需要占⽤更多的内存空间。基本数据类型因为占⽤更少的内存⽽被保留下来。
6,写出如下代码的输出
Integer i3 =0;
Integer i4 =new Integer(40);
Integer i5 =new Integer(40);
Integer i6 =new Integer(0);
System.out.println(i1 == i2);
System.out.println(i1 == i2 + i3);
System.out.println(i1 == i4);
System.out.println(i4 == i5);
System.out.println(i4 == i5 + i6);
System.out.println(40== i5 + i6);
解释
Integer i1 =40;
Integer i2 =40;
Integer i3 =0;
Integer i4 =new Integer(40);
Integer i5 =new Integer(40);
Integer i6 =new Integer(0);
//true
//Integer.valueOf()⽤了常量池
//⽐较的是内存地址
System.out.println(i1 == i2);
//true
//+操作会导致左右两边都转换成基本数据类型,解释在下⾯
System.out.println(i1 == i2 + i3);
//false
//Intege.valueOf()使⽤常量池中的对象
//new Integer每次都创建新对象
/
/⽐较的是内存地址
System.out.println(i1 == i4);
//false
//两个不同的对象
//⽐较的是内存地址
System.out.println(i4 == i5);
//true
//解释在下⾯
//⽐较的是值
System.out.println(i4 == i5 + i6);
//true
/unicode文件格式
/解释在下⾯
//⽐较的是值
System.out.println(40== i5 + i6);
语句i4 == i5+i6,因为+这个操作符不适⽤与Integer对象,⾸先i5和i6⾃动拆箱后,进⾏数值相加,即i4 == 40.然后Integer对象⽆法与数值进⾏直接⽐较,所以i4页⾃动拆箱转为int值40,最终这条语句转为40 == 40进⾏数值⽐较。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论