java面试
1.java开发中计算金额时使用什么数据类型?
不能使用double或float,因为精度不高。
使用BigDecimal类替换,可以实现任意精度的数据的运算。
2.char型变量中能不能存储一个中文汉字,为什么?
可以,char c = '中'。
char c2 = 'a',a对应ascill中的97,ascill中确实不包含中文,但是目前的unicode编码是一个更大的字符集。
因为char使用的是unicode字符集,包含了世界范围的所有字符。
3. short s1 = 1; s1 = s1+1;有什么错?
答:等号右边是int 类型,需要强转
short s1 = 1; s1 += 1;有什么错?
答:没错,可以正常执行。
4.int i=0;i=i++执行这两句话后变量i的值为?
答:0
5.boolean占几个字节?
答:编译时不谈占几个字节。
但是JVM在给boolean类型分配内存控件时,boolean类型的变量占据一个槽位(slot,等于4个字节)
细节:true :1 false:0
拓展:
在内存中,byte\short\char\boolean\int\float:占用一个slot
double\long:占用两个slot
补充:槽位是java虚拟机分配内存时的基本单位
6.为什么Java中0.1+0.2结果不是0.3?
代码测试0.1+0.2,结果不是0.3,而是0.30000.....4
答:几乎所有现代的编程语言都会遇到上述问题,包括JavaScript Rubby Python Swift Go等,引发这个问题的原因是,它们都采用了IEEE754标准。
IEEE是指“电气与电子工程师协会”,其在1985年发布了一个IEEE754计算标准,根据这个标准,小数的二进制表达能够有最大的精度上限提升。但无论如何,物理边界是突破不了的,它仍然“不能实现每一个十进制小数都对应一个二进制小数”。正因如此,产生了0.1+0.2不等于0.3的问题。
具体来说:整数变为二进制,能够做到“每个十进制整数都有对应的二进制数”,例如数字3,二进制是11,毫无争议。
在编程中,遇见小数判断相等情况,可以采用四舍五入或者同乘同除等方式进行验证,避免出现问题