在面试中java八种数据类型在大厂中问的比较多一点,问的比较细也,主要就是考察基础是否扎实。
bit(位):计算机中存储数据的最小单位,指二进制数中的一个位数,0或者1。
byte(字节):计算机中存储容量的基本单位,一个byte由8位二进制数组成。在计算机内部一个字节可以表示一个数据或者一个英文字母,汉字需要两个字节。
转换:
1B=8bit
1Byte=8bit
1KB=1024Byte(字节)=(8*1024)bit
1MB=1024KB
1GB=1024MB
1TB=1024GB
八种基本数据类型:
数值型:
1.byte:一个字节,8位,用于表示最小数据单元,范围是-128-127,包装类为Byte。
2.short:两个字节,16位,-32768-32767,包装类为Short。
3.int:四个字节,32位,-2^(31-1)-2的31次方,包装类为Integer。
4.long:8个字节,64位,包装类为Long。
浮点型
1.float:占4字节,32位,包装类为Float
2.double:占8字节,64位,包装类为Double
字符型
1.char:2字节,16位,包装类为Character。
布尔型
1.boolean:只有true或者false。
1.java中boolean占几个字节?
首先在官方文档中(官方文档
)并没有具体说明占几个字节。翻译一下就是:
boolean:boolean型的数据仅可能有两种值:true或者false,使用此数据类型位跟踪真假条件的简单标记。这种数据就表示这点信息,但它的大小并没有精确定义。
一般网上就有三种说法:
1.占1bit(位):boolean只有true或者false,在编译后使用1和0来表示,这两个数仅需1位就可存储。计算机存储数据最小单位就是位。
2.占1个字节:虽然编译后0和1只占1位,但是计算机处理数据最小单位是1字节,1byte=8bit,实际存储:用一个字节最低位存储,其他七位用0补齐。
true:00000001,false:00000000。
3.占4个字节:在《java虚拟机规范》中“虽然描述了boolean这种类数据类型,但是只提供了非常有限的支持。在java虚拟中并没有任何提供boolean值专用的字节码指令,java语言表达式所操作的boolean值,在编译之后都是用java虚拟机中的int来代替,而boolean数组会将被编码成的java虚拟机的byte数组,每个boolean元素占8位”。也就是boolean当作int处理,也就是4个字节,boolean数组当作byte数组来处理,这样我们得出boolean类型单独使用使用占4个字节,如果使用boolean数组为1个字节。
为什么一定要使用int呢,使用byte或short不行吗?
因为对于32位处理器(cpu)来说(并不是指32/64位操作系统),一次处理数据是32位,而32位使用4个字节是最为节省,哪怕你使用1bit也会占用4字节。cpu寻址系统只能32位32位的进行寻址,具有高效存取的特点。
2.可以将int强转为byte类型吗?会产生什么问题?
可以做强制转换,但是int中是32位,byte只有8位,所以强制转换会丢失24位,只保留最后8位.
3.64位的JVM中,int长度为多少?
在java中int的长度是一个固定值,与平台无关,无论是32位/64位JVM中int都是一样的。
4.float=3.4是否正确?
不正确,3.4是双精度类型,将双精度类型转换成单精度属于向下转型,会造成精度丢失,可以写成float f=(float)3.4或者float f=3.4f.
5.java中,char类型能否存储一个中文汉字,为什么?
java中char用来存储Unicode编码字符,Unicode编码中包含了汉字,但特殊情况下一些生僻字可能没有包含在内char编码字符集中,这种情况下就不能存储该汉字。
5.
byte b=127;
b+=5
System.out.println(b);
//**b会输出什么?**
首先byte的取值范围为-128~127,当b+=1时超过了临界值赋值为-128,当b+=2时,会返回-127,以此类推会输出-124.
6.switch能否作用在byte中,能否作用在long上,能否作用在String上?
首先switch支持int类型,byte、short、char范围都小于int,可以隐式转换,但是long类型范围大于int类型范围,不能做隐式转换,只能做强制转换,强制转换会使精度丢失导致无法进入case语句中,所以switch不能作用与long类型。
在jdk1.7之前版本中不支持String,在jdk1.7之后的版本中switch支持String类型。
7.
Integer i1=200;
integer i2=200;
System.out.println(i1==i2);
Intenger i3=100;
Integer i4=100;
System.out.println(i3==i4);
答案:false true
这里涉及到Integer自动装箱的问题,如果想要详解可以看看我的另一篇博客:Integer自动装箱
8.
public void say(){
System.out.println(3-2.6==0.4);
}
答案:false
int类型和float类型做运算会损失精度,导致不相等
9.
shrot s=1;
s=s+1;
有什么错?
short s=1;
s+=1;
有什么错?
第一种情况,在s+1时自动提升表达式类型为int类型,将int赋值给short会出现类型转换错误异常。
对于第二种情况,是java语言规定的运算符,java编译器会特殊处理,实际上是在内部做了类型转化,因此可以编译正确。
10.java中Integer与int有什么区别?
(1)int是java内置的基本数据类型之一,java为每个基本数据类型都提供了一个包装类,Integer就是int的包装类。
(2)int默认值为0,integer默认值为null
(3)Integer内部提供了一些操作整数的方法
这个题可以单独拿出来讲,因为它太重要了。
这个题我们必须知晓它的原理,才能避免下次面试再次入坑。
我们都知道每种数据类型占多少字节,多少位,所以范围就出来了。
byte:一个字节,8位,-2的八次方 ~ 2的7次方-1(-128-127)
首先明确几个概念:
①在计算机中存储存储都是以补码的形式
②反码:正数的反码还是其本身,负数的反码就是按位取反。
③补码:正数的补码还是其本身,负数的补码在反码的基础上末位+1.
④符号位是第一位,0代表正数,1代表负数。
首先byte中最大数为0111 1111,其补码形式也是其本身,所以转换成十进制为127.
那么最小负数就是最大数(正数补码还是其本身)+1,即1000 0000就是其补码形式,所以我们要推算其源码时要反过来算,首先要减去1得到反码:0111 1111,在按位取反得到原码:1000 0000.
因为负数的补码是其绝对值取反,1000 0000转换成十进制就是128,最小负数就是-128.
我们再来看一看int如何计算。
int:4个字节,32位,
除去符号位,剩下的31位就代表其范围:-2的31次方~2的31次方-1.
首先int中最大数二进制形式为:01111111 11111111 11111111 11111111,其补码形式还是本身。
所以最小数的补码就是(+1操作):10000000 00000000 00000000 00000000
接着-1得到反码:01111111 11111111 11111111 11111111
按位取反得到原码:10000000 00000000 00000000 00000000
所以其范围转换成十进制就是:-2的31次方~2的31次方-1
其他的基本数据类型以此类推即可。
首先在面试的时候会问到浮点类型的数据是如何存储的?
是不是很懵逼,在我学习的过程中真的对这一方面知识有所欠缺。
我们都知道float占四个字节,double占8个字节,但是这些浮点数据类型中的小数点如何存储的呢?
类型 | 符号位 | 指数位 | 尾数 | 长度 |
---|---|---|---|---|
float | 1 | 8 | 23 | 32 |
double | 1 | 11 | 52 | 64 |
格式:SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
S表示浮点数的正负
E表示指数加上127之后的二进制数
M表示尾数,最高位为1
我们还是通过例子来看:
13.625将其换算成二进制:
整数部分(模2取余法):除以二,直到商为0
13%2=6 ->>> 1 低位
6%2=3 ->>> 0
3%2=1 ->>> 1
1%2=0 ->>> 1 高位
整数部分用二进制表示就是:1011
小数部分(乘2取整法):乘以二取出正数,剩余的小数继续乘以2直到0.
0.625x2=1.25 ->>> 1 一位
0.25x2=0.5 ->>> 0 两位
0.5x2=1.0 ->>> 1 三位
0.0x2=0.0 ->>> 0 四位
小数部分就可以表示成1010
整个浮点型数字13.625就可以表示为1011.1010
换算完之后需要将小数点前移,直到小数点前只剩一位1.0111010*10的3次方。
所以我们就得到了他的底数、指数。
尾数:因为小数点前必为1,规范中只需要记录小数点之后的,所以尾数为:0111010.
指数:我们的指数就是10的几次方,我们所求的为3,必须加上127(转出的时候要减去127),所以为130,转成二进制:10000010。
符号位:正数为0,负数为1
所以float在内存中存储的13.625的格式就是:01000001 00111010 00000000 00000000