常见面试题来自牛客网:https://www.nowcoder.com/tutorial/94/4206176d637541fa92c784a4f547e979
一、前言
这个专栏是Java基础复习,将记录我准备大数据开发面试的过程,在校招面试中占了比较大的部分。希望自己现在夯实基础,笑着面对接下来的校招。那么现在开始行动起来吧!
二、常见题
1.请你解释为什么会出现4.0-3.6=0.3999999999999999这种现象?
首先,我们先来复习一下十进制和二进制是如何相互转换的?
附上一张思维导图:
(一)、二进制–>十进制
二进制正整数–>十进制:
首位为0:先补齐位数,将二进制中的位数分别与对应的值相乘,然后相加得到的就为十进制
二进制负整数–>十进制:
首位为1:先减1,然后对结果取反,将二进制中的位数分别与对应的值相乘,然后相加得到的就为十进制
小数二进制转化为十进制:
将二进制中的位数分别与对应的值相乘,然后相加,得到的值即为换算后的十进制。
(二)、十进制–>二进制
十进制正整数–>二进制:除二取余,倒序排列,高位补零 十进制负整数–>二进制:先将对应的正整数转化成二进制后,对二进制取反,再对结果+1
小数–>二进制:对小数点以后的数×2,取结果的整数部分,然后再用小数部分再×2,再取结果的整数部分……以此类推,直到小数部分为0或者位数足够为止。然后把取的整数部分从上到下排列。
现在进入正题:
这里给出比较官方的回答,《Java核心技术卷》书上写道:这种舍入误差的主要原因是浮点数值采用二进制系统表示, 而在二进制系统中无法精确地表示分数 1/10。这就好像十进制无法精确地表示分数 1/3—样。
就是说我们在代码中编写的 System.out.println(4.0 - 3.6); 这样一段代码, ? 计算过程: ?①将十进制的 4.0 转换成 二进制,将十进制的 3.6 转换成二进制; ?②使用转换后的二进制,进行减法运算 ? 到这里,读者朋友们应该大概知道什么原因了,因为十进制的 3.6 转换成二进制为:11.100110011001…(一直循环除不尽)
总结: 因为 3.6 转成二进制为 11.10011001…,除不尽的,所以 system.out.println(4.0 - 3.6); 就会输出 0.3999999999999999
2.数组(Array)和列表(ArrayList)的区别?什么时候应该使用Array而不是ArrayList?
记住一句话:固定数组,动态列表
区别: (一)效率上: Array效率高,但是容量固定,不能扩充 ArrayList效率低,可动态扩容
(二)类型识别: ArrayList存入对象时,抛弃类型信息,所有对象屏蔽为Object,编译时不检查类型,但是运行时会报错。
Array中只能存储同一数据类型的数据,但ArrayList可以存任何Object,如String等
Array和ArrayList相互转换代码: (一)ArrayList转换Array
List<String> arrayList = new ArrayList<>();
arrayList.add("fg");
arrayList.add("thn");
arrayList.add("gfhjfyh");
String[] arr = arrayList.toArray(new String[arrayList.size()]);
for(int i = 0;i<arr.length;i++){
System.out.println(arr[i]);
}
(二)Array转换ArrayList
public static void main(String args[]) {
String[] arr = new String[]{"ab","cd","ef"};
List<String> list = new ArrayList<>(Arrays.asList(arr));
System.out.println(list.toString());
}
|