JAVA面试基础〖三〗
一. 寄语
大三了,也不能浪了,总得为下学期的秋招找个好点的工作啊,前提我得把基础再过一遍,这个寒假我会边学习边总结一些面试的基础问题~,能写完的我尽量写完,补充的尽量补充,干就完了,奥里给!
ps.大部分找的题都是在牛客的面试经验里找来的,加上一些我自己的理解制作而成~~
二. Array和列表ArrayList的区别
一:空间大小
- 1、Array的空间大小是固定的,空间不够时也不能再次申请,所以需要事前确定合适的空间大小。
- 2、ArrayList的空间是动态增长的,如果空间不够,它会创建一个空间比原空间大0.5倍的新数组,然后将所有元素复制到新数组中,接着抛弃旧数组。而且,每次添加新的元素的时候都会检查内部数组的空间是否足够。
二:存储内容
- 1、Array数组可以包含基本类型和对象类型。
- 2、ArrayList却只能包含对象类型。
- 3、需要注意的是:Array数组在存放的时候一定是同种类型的元素。ArrayList就不一定了,因为ArrayList可以存储Object。
三:方法
- ArrayList作为Array的增强版,当然是在方法上比Array多样化。比如添加全部addAll()、删除全部removeAll()、返回迭代器iterator()等。
四:总结使用场景
-
如果想要保存一些在整个程序运行期间都会存在而且不变的数据,我们可以将它们放进一个全局数组里,但是如果我们单纯只是想要以数组的形式保存数据,而不对数据进行增加等操作,只是方便我们进行查找的话,那么,我们就可以选择ArrayList。
-
而且还有一个地方是必须知道的,就是如果我们需要对元素进行频繁的移动或删除,或者处理的是超大量的数据,那么,使用ArrayList就真的不是一个好的选择,因为它的效率很低,使用数组进行这样的动作就很麻烦,那么,我们可以考虑选择LinkedList。
三. 请你解释一下值传递和引用传递?
- 值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
- 引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。
- 一般认为,java内的基础类型数据传递都是值传递. java中实例对象的传递是引用传递
四. 请你解释为什么会出现4.0-3.6=0.40000001这种现象?
- 原因简单来说是这样:2进制的小数无法精确的表达10进制小数,计算机在计算10进制小数的过程中要先转换为2进制进行计算,这个过程中出现了误差。
五. 请你说说Lamda表达式的优缺点。
优点:
-
简洁。
-
非常容易并行计算。
-
可能代表未来的编程趋势。
-
结合 hashmap 的 computeIfAbsent 方法,递归运算非常快。java有针对递归的专门优化。
缺点:
-
若不用并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时需要预热才显示出效率优势,并行计算目前对 Collection 类型支持的好,对其他类型支持的一般)
-
不容易调试。
-
若其他程序员没有学过 lambda 表达式,代码不容易让其他语言的程序员看懂。
-
在 lambda 语句中强制类型转换貌似不方便,一定要搞清楚到底是 map 还是 mapToDouble 还是 mapToInt
六. 你知道java8的新特性吗,请简单介绍一下
Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。
方法引用− 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
默认方法− 默认方法就是一个在接口里面有了一个实现的方法。
新工具− 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
-
Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
-
Date Time API − 加强对日期与时间的处理。
-
Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
-
Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。
七. 请你解释为什么重写equals还要重写hashcode?
- HashMap中,如果要比较key是否相等,要同时使用这两个函数!因为自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即便有相同含义的两个对象,比较也是不相等的。
- HashMap中的比较key是这样的,先求出key的hashcode(),比较其值是否相等,若相等再比较equals(),若相等则认为他们是相等的。若equals()不相等则认为他们不相等。如果只重写hashcode()不重写equals()方法,当比较equals()时只是看他们是否为同一对象(即进行内存地址的比较),所以必定要两个方法一起重写。
- HashMap用来判断key是否相等的方法,其实是调用了HashSet判断加入元素 是否相等。重载hashCode()是为了对同一个key,能得到相同的Hash Code,这样HashMap就可以定位到我们指定的key上。重载equals()是为了向HashMap表明当前对象和key上所保存的对象是相等的,这样我们才真正地获得了这个key所对应的这个键值对。