我的求职面试题日记

去粗取精,去伪存真,面试题精选如下所示

1、接口与抽象类有什么区别?

 抽象类有构造方法,接口没有构造方法

 抽象类只能单继承,接口可以多继承

抽象类可以有普通方法,接口中的所有方法都是抽象方法

接口的属性都是public static final修饰的,而抽象的不是

2、我能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗?

不行,你不能在没有强制类型转换的前提下将一个 double 值赋值给 long 类型的变量,因为 double 类型的范围比 long 类型更广,所以必须要进行强制转换。

3、说出几条 Java 中方法重载的最佳实践?

下面有几条可以遵循的方法重载的最佳实践来避免造成自动装箱的混乱。

a)不要重载这样的方法:一个方法接收 int 参数,而另个方法接收 Integer 参数。

b)不要重载参数数量一致,而只是参数顺序不同的方法。

c)如果重载的方法参数个数多于 5 个,采用可变参数。

4、垃圾收集算法

GC最基础的算法有三种:标记 -清除算法、复制算法、标记-压缩算法,我们常用的垃圾回收器一般都采用分代收集算法。

标记 -清除算法

“标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。

复制算法

“复制”(Copying)的收集算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

标记-压缩算法

标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存

分代收集算法

“分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法

5、Java 程序是怎样运行的?

  1. 首先通过 Javac 编译器将 .java 转为 JVM 可加载的 .class 字节码文件。
  2. Javac 是由 Java 编写的程序,编译过程可以分为:① 词法解析,通过空格分割出单词、操作符、控制符等信息,形成 token 信息流,传递给语法解析器。② 语法解析,把 token 信息流按照 Java 语法规则组装成语法树。③ 语义分析,检查关键字使用是否合理、类型是否匹配、作用域是否正确等。④ 字节码生成,将前面各个步骤的信息转换为字节码。
  3. 字节码必须通过类加载过程加载到 JVM 后才可以执行,执行有三种模式,解释执行、JIT 编译执行、JIT 编译与解释器混合执行(主流 JVM 默认执行的方式)。混合模式的优势在于解释器在启动时先解释执行,省去编译时间。
  4. 之后通过即时编译器 JIT 把字节码文件编译成本地机器码。
  5. Java 程序最初都是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁,就会认定其为"热点代码",热点代码的检测主要有基于采样和基于计数器两种方式,为了提高热点代码的执行效率,虚拟机会把它们编译成本地机器码,尽可能对代码优化,在运行时完成这个任务的后端编译器被称为即时编译器。
  6. 还可以通过静态的提前编译器 AOT 直接把程序编译成与目标机器指令集相关的二进制代码。

#牛客创作赏金赛#
全部评论

相关推荐

08-17 21:03
已编辑
门头沟学院 前端工程师
7.10投递 7.29约面,跨度大的逆天1.自我介绍2.实习中做了哪些事情,挑两个讲讲3.你讲的那个ai模型流式会话输出即时停止,知不知道业界普遍怎么做的?不知道4.有自己的思想很好,但是也要了解一下别人是怎么做的(有点感觉寄了)5.websocket和sse的区别6.react-beatiful-dnd拖拽位置映射偏移怎么解决的接下来就是噩梦开始了,全程面试官一直皱着眉头看着我写输出和代码,压力直接拉满7.看代码说输出,主要是this指向相关但是有些坑,原题记不太清了。其他都说对了,全局变量argements的this指向我直接说不了解,回:我觉得校招生应该会吧(完了)8.非常坑的一题,也是看代码说输出,闭包函数的递归调用function fn(n) {    n = 0    return function fn1(n) {        n += 1        return fn(n)    }}这里第一次写输出的时候完全没看明白考什么,直到面试官问了一句:‘你知道这题的考点吗?你再好好分析’,然后才做对。由于隔得太久了,只有模糊记忆,怕大概写出来误导大家。9.实现一个函数,根据模板字符串输出给定对象的某个值const obj = {    a: {        x: {            y: 'tom'        },        b: {            c: {                d: 'jerry'            }        }    }}function fn(obj, str) {}console.log(func(obj, 'a,x,y')) // 输出'tom'console.log(func(obj, 'a,b,c,d')) // 输出'jerry'磕磕绊绊写出来了,面试官:结果是对了哈,这过程也太丑陋了吧!你知不知道.split(',')?我:知道知道,会返回一个数组面试官:那不比你这个.replaceAll(',',' ')好用多了,是不是下标就直接取出来了我赶紧找补是的是的,紧张了哈哈。回:我看也是反问环节:1.面试官为啥不问些基础理论呢?每个人风格不同,而且你面试之前肯定也准备了的,问题不大!2.部门是干啥的3.我:我都不好意思问了回:没事你问我:我这场面试我表现怎么样?我自我感觉一塌糊涂回:没有啊,我觉得挺好,要是工作了两三年的我觉得是不合格的,但是校招生这样还可以的(当时是不敢相信的)
查看16道真题和解析
点赞 评论 收藏
分享
点赞 2 评论
分享
牛客网
牛客企业服务