JAVA面试大全〖三〗 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表达式的优缺点。

优点:

  1. 简洁。

  2. 非常容易并行计算。

  3. 可能代表未来的编程趋势。

  4. 结合 hashmap 的 computeIfAbsent 方法,递归运算非常快。java有针对递归的专门优化。

缺点:

  1. 若不用并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时需要预热才显示出效率优势,并行计算目前对 Collection 类型支持的好,对其他类型支持的一般)

  2. 不容易调试。

  3. 若其他程序员没有学过 lambda 表达式,代码不容易让其他语言的程序员看懂。

  4. 在 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所对应的这个键值对。

制作不易,转载请标注~~

发布了69 篇原创文章 · 获赞 54 · 访问量 9567

猜你喜欢

转载自blog.csdn.net/kingtok/article/details/104026033