个人万字总结:java后端——校招需要复习什么?


前言

博主目前是一名应届生。为了应对即将来临的秋招,正在不断的复习基础。复习的过程中整理了一套个人的复习大纲,以便每次需要的时候都可以用到。目前我将这份复习大纲分享在博客中。
我认为面试问题的范围和简历的内容有很大的关系,但是语言特性、操作系统、计算机网络、基本框架是必问的。(我的简历即使没有明写spring,还是被问到了),因此,我将这些问题全部写出来,后面有可能会对这些问题进行解答。

jdk:基础

【1】概念层面
对面向对象的理解、与面向过程对比、谈谈java与其他语言对比、java程序如何实现“一次编译、处处执行”、jdk与jre、接口与抽象类的理解、谈谈对三大特性的理解等。
以上的内容会被问到,通常是作为一个因子问题,是在不好说就试着打个比方,反正这类问题最后提前思考过,否则突然被问到后可能会有点懵逼。

突然让我解释什么是线程安全我就有点语无伦次、只会才开始思考如何解释线程安全。(基于共享内存和非共享内存分析资源安全性)

【2】String类
string类可以说太会被问到了,通常会有以下展开方式:
a.string、stringBuffer、stringBuilder的对比
b.string的不可变性(怎么不可变、有什么好处、如何设计不可变类)
c.string常量池(经典问题new String(“abc”)、intern()方法)
如果问的再深入一点:jdk8、jdk7、jdk6的string常量池在内存什么位置、string字面量和string对象什么关系,string对象和字面量存放在什么位置,intern()的原理了解吗(stringTable)、string的hashCode()方法为什么使用31叠加字符 等
可能还会问问你“+”的底层实现(解语法糖后)是什么
【3】包装类
首先可能让你分析一些包装类和基本类型的区别,然后解释一下装箱和拆箱的语法糖实现,然后可能给你出个题(int与integer比较、integer与Integer比较、Integer与Double类似的,还有可能是包装类重载问题),然后就是常量池问题(范围多大、Double是否有常量池)
【4】面向对象的各种问题,可能还会夹杂点JVM
a.多态与重载,如果问的浅,则会问“二者对比”或者出个小题,问的深可能会涉及jvm如“静态解析、动态绑定”、“invokespecial与invokevirtual”、“虚方法与非虚方法”相关的
b.super和this ,问的浅:什么区别、用在哪里、可以干什么。问的深也会涉及jvm:this的原理是什么、解释为什么this不能出现在静态方法中、为什么super不能被直接使用,它的实质是什么(部分子类对象的内存首地址)
c.静态变量、成员变量、局部变量:浅显的问会问你他们使用上的区别、位置、作用域、所属。往深里问:什么时候被创建、存放在那一块内存、什么时候被销毁。从内存角度解释一下值与引用的传递
d.构造函数:浅显——简单解释一下new做了什么、静态的加载顺序问题、构造函数与普通函数对比、构造函数有返回值吗,它做了什么(被构造出的this对象的引用)、代码块与构造函数与变量初始值的初始化顺序。深度——new由几个指令(几步)组成,都干了什么、与区别、说一下类加载过程(当主动new一个对象时发送了什么)
e.静态非静态问题:static是什么、修饰哪里、与实例变量/方法比较、然后就是经典的“重写与覆盖问题”(和a有点重复了,不过一般都会将覆盖重写问题引向“静态解析和动态链接”)
f.修饰符问题:每个修饰符什么范围,protected和default什么范围,这个问的不难,private能否被继承(你可以回答语义上看作不能,内存方面继承了)
【5】包装类
这个应该不算太多问,但是考察点就是分清静态内部类、局部内部类、成员内部类的访问范围和static修饰问题等各种区别对比。还有一个和局部内部类绑定的问题就是“为什么用final修饰局部变量——可以从生命周期不一致思考,也可以从底层实现分析”。如果深一点:局部内部类、静态内部类、成员内部类的底层实现有什么不同(看反编译后的字节码就行了,局部和成员都是通过构造函数拿到引用(外部this和外部final变量),而静态内部类就是一个普通的类)
【6】泛型
泛型问的也不动,可能会在问泛型集合的时候提一句。什么是泛型?写一个泛型类/方法?泛型擦除是什么?你怎么用泛型?(好处是什么、坏处是什么)。问的深一点:对比ArrayList、ArrayList、ArrayList、ArrayList<?>、通配符、下定界符和上定界符区别是什么,什么时候用、泛型继承问题等
【7】final
final最基本也会问“用在哪里(修饰在哪里)”、有什么作用。基本上普通的问法上,先分析一下final的语义,再分析一下使用的问题就可以了。如果再深入一点,让你谈谈final的三个内存语义,如果涉及jvm还会让你谈谈final static var的问题。
【8】抽象类和接口
二者在语义上对比、各种区别、你如何使用之类的、或者问你为什么java不支持多继承而支持多实现。问的深一点,问你接口重名问题、如何实现间接多继承,接口的加载时机什么的。可能还会问问abstract关键字
【9】异常
这里问的都不难了,你见过什么异常(这里可以答的高级点,如内存异常、栈溢出、并发修改啥的,当然了,前提你心里有底,不怕他延伸),问问编译时异常、运行时异常、异常体系。error、throwable、except比较一下。可能会让你自定义一个异常。然后就是问问你异常处理机制,然后问一下try_catch/finally、throw、throws关键字。最多让你解释一下finally执行顺序的问题(难一点,问一下finally对应的字节码指令?)
【10】序列化与IO
序列化一般不咋问,问无法就是问transient瞬态关键字、如何进行序列化和反序列化。难一点就问static、final还有一些其他变量或方法(我也没咋记住这块)能否被序列化,再问你为什么ArrayList底层数组没有被transient修饰。
对于IO应该不会在这里问,可能会单独问,因为一提到java.io可能就难免扯一下NIO、AIO以及IO复用模型、阻塞非阻塞和同步异步、select/poll/epoll啥的(开始往操作系统那边扯了)。这里撑死问一下randomAccess接口是什么、普通流与缓存流、字符流与字节流对比啥的。如果延伸则会让你解释一个底层如何实现随机访问的(内存连续、基地址+声明类型字节+偏移量)。

面试是不会考你怎么使用的,基本都是考察你对某个API的设计思想的理解,或者对比某两个API或关键字。也就是说:你可以不会用,但是你能说出它的设计思想和底层大概设计原理。

jdk: 容器

【1】接口
set、list、map。可能让你分开说,也可能对比说。不过最后不要扯出实现,就说这些接口为一个类规范了哪些行为即可——语义层面。list就是线性表,set就是集合,map就是映射。没必要说的很细,重要的是对语义的即使,如果没有说list有序、允许重复,对方应该也不会介意,但是一定要说出list 规范 了一个类型 线性表的行为

你可以说set和list继承了collection接口,规范了二者具有“收集”的行为,而list接口本身又规范了类型具有“线性表”的行为。而map为类型提供了“映射”的行为

【2】实现类
问完接口,就会让你聊聊实现类。如果是list就让你聊聊linkedList或者ArrayList,如果map就会让你聊hashMap,set聊的少,因为最常用的实现类hashSet底层就是一个hashMap,就算让你聊,最终也会引向hashMap。

ArrayList无法就几个地方:add方

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值