明天和大家聊一下最最最根底的吧,尽管简略,但坑无处不在,会则坚固,不会牢记,面试不能惨死于这些最根底的知识点上~
老面:什么是根底类型与援用类型?有什么区别?
笑小枫:根底类型只示意简略的字符或数字,援用类型能够是任何简单的数据结构。
区别:
- 存储形式不同,根本类型是存储在栈内存;援用类型变量是寄存在堆内存中,栈中寄存的是变量寄存的内存地址。
- 传递形式不同,根本变量类型是值传递;援用变量类型是援用传递。
老面:String是根底的数据类型吗?
笑小枫:不是,是援用类型。String数据存储是private final char value[];
所以String类是不可变的,对String类的任何扭转,都是返回一个新的String类对象。
老面:JAVA有几种根底数据类型?对应的包装类是什么?
笑小枫:八种
根本数据类型:int,double,long,float,short,byte,char,boolean
对应的封装类型是:Integer,Double,Long,Float,Short,Byte,Character,Boolean
老面:什么是主动装箱与拆箱?
笑小枫:
装箱:将根本类型用它们对应的援用类型包装起来;
拆箱:将包装类型转换为根本数据类型。
老面:int和Integer哪个会占用更多的内存?
笑小枫:Integer对象会占用更多的内存。Integer是一个对象,须要存储对象的信息。然而int是一个原始类型的数据,所以占用的空间更少。
32 位机器下,Integer占用的内存状况如下:
老面:i64位JVM中,int的长度是多少位?
笑小枫:Java中,int类型变量的长度是一个固定值,与平台无关,都是32位。意思就是说,在32位和64位的Java虚拟机中,int类型的长度是雷同的。
老面:i怎么将byte转换为String?
笑小枫:能够应用String接管byte[]参数的结构器来进行转换,须要留神的点是要应用的正确的编码,否则会应用平台默认编码,这个编码可能跟原来的编码雷同,也可能不同。
老面:i咱们能将int强制转换为byte类型的变量吗?
笑小枫:是的,咱们能够做强制转换,然而Java中int是32位的,而byte是8位的,所以,如果强制转化时,int类型的高24位将会被抛弃,byte类型的范畴是从-128到127。
老面:ibyte类型127+1等于多少?
笑小枫:如果后果是byte类型,答案是:-128。
如果后果转为int类型,答案是:128。
解析:
byte的范畴是-128~127。
字节长度为8位,最右边的是符号位,而127的二进制为01111111,所以执行+1操作时,01111111变为10000000。
大家晓得,计算机中存储正数,存的是补码的兴衰。右边第一位为符号位。
那么正数的补码转换成十进制如下:
一个数如果为正,则它的原码、反码、补码雷同;一个负数的补码,将其转化为十进制,能够间接转换。
已知一个正数的补码,将其转换为十进制数,步骤如下:
- 先对各位取反;
- 将其转换为十进制数;
- 加上负号,再减去1;
例如10000000,最高位是1,是正数,对各位取反得01111111,转换为十进制就是127,加上负号得-127,再减去1得-128;
老面:ifloat 和 double 的区别是什么?
笑小枫:
- 内存中占有的字节数不同
单精度浮点数在内存中占有4个字节;
双精度浮点数在内存中占有8个字节;
- 有效数字位数不同
单精度浮点数有效数字8位;
双精度浮点数有效数字16位;
- 数值取值范畴不同
单精度浮点数的示意范畴:-3.40E+38~3.40E+38
双精度浮点数的示意范畴:-1.79E+308~-1.79E+308
- 在程序中处理速度不同
一般来说,CPU解决单精度浮点数的速度比双精度浮点数的速度快
如果不申明,默认小数是double类型,如果想用float,要进行强转;
老面:i能在不进行强制转换的状况下将double值赋值给long类型的变量吗?
笑小枫:不行,不能在没有强制类型转换的前提下将一个double值赋值给long类型的变量,因为double类型的范畴比long类型更广,所以必须要进行强制转换。
老面:i3*0.1==0.3将会返回什么?
笑小枫:返回false,因为浮点数不能齐全准确的示意进去,个别会损失精度。
老面:ifloat f = 3.4;是否正确?
笑小枫:不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因而须要强制类型转换floatf=(float)3.4
;或者写成floatf=3.4F;
。
老面:ishort s1 = 1; s1 = s1+1;有错吗?short s1=1; s1+=1;有错吗?
笑小枫:对于short s1=1;
s1=s1+1;
因为1是int类型,因而s1+1运算后果也是int型,须要强制转换类型能力赋值给short型;所以编译会报错。
而short s1=1;
s1+=1;
能够正确编译,因为s1+=1;
相当于s1=(short)(s1+1);
其中有隐含的强制类型转换。
老面:你们我的项目中金额是应用的什么类型?
笑小枫:Java代码中应用java.math.BigDecimal;Mysql数据库中应用decimal 。
因为float、double都是浮点数, 都有取值范畴, 都有精度范畴. 浮点数与通常应用的小数不同, 应用中, 往往难以确定。所以说,float和double都是不能用来示意准确的类型的;金额必须是齐全准确的计算, 故不能应用double或者float, 而应该采java.math.BigDecimal。
老面:简略说说BigDecimal的加减乘除操作吧
笑小枫:
- 加法运算:add()
- 减法运算:subtract()
- 乘法运算:multiply()
- 除法运算:divide()
老面:BigDecimal两个数据之间怎么比拟?
Java中对BigDecimal比拟大小个别用的是Bigdemical的compareTo办法
比拟的后果
-1,示意小于
0,示意等于
1,大于