国内的互联网面试,恐怕是现存的、最接近科举考试的制度。
这是由于互联网IT行业的求职者太多了,如果考察的是清一溜的算法题和设计题,那么会要求面试官有极高的技术水平,还要花大量的时间成本和精力。
所以,八股文面试也许不是最优的解法,但也是最符合当前国内IT环境的做法。

那么,Java面试真的要背答案吗?该怎么背答案呢?
先来看这些Java真题:
JDK 和 JRE 有什么区别?
== 和 equals 的区别是什么?
两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
final 在 java 中有什么作用?
java 中的 Math.round(-1.5) 等于多少?
String 属于基础的数据类型吗?
java 中操作字符串都有哪些类?它们之间有什么区别?
String str="i"与 String str=new String("i")一样吗?
如何将字符串反转?
String 类的常用方法都有那些?
抽象类必须要有抽象方法吗?
普通类和抽象类有哪些区别?
抽象类能使用 final 修饰吗?
接口和抽象类有什么区别?
java 中 IO 流分为几种?
Java面试的答案背也背不完,在我快要放弃的时候听了阿里P8杨逍的讲座《大厂Java高级工程师的求职秘诀》,不愧是大厂的高职级大佬,把Java面试题和所有知识点都讲得很通透,感兴趣的话,大家也可以去免费试听一下。
大厂面试套路:题目深挖+源码解析
回到刚才的问题,Java的面试是需要背的,但这个背是有技巧的。
举个例子:
“JDK 和 JRE 有什么区别?”
这么简单的问题相信大家都会,等你答上来了面试官就会继续追问:
“除了javac你还了解些什么命令行工具,它们的用途是什么?”
很多人只答得出jcmd、jps、jinfo、jstat、jmap以及jstack等工具,但对应的用途却记不清了。答出来的也不要太得意,后面还有灵魂拷问。
“你用过jstat吗?你了解哪些参数?”
详细参数请看下表

到这已经难倒95%的人了,但面试官可能还会追问:
既然StringBuffer具备线程安全性,迭代开销又小,那我们实践中首选它就ok了吗?
这正是大厂面试Java程序员的基本套路——从简单题入手,再慢慢的挖掘背后的原理,从而判断求职者的技术水平,目的是考察对源码的深挖意识。
所以,想搞定Java面试,一定要拥有精益求精的精神,深挖底层原理,把技术栈学通透。
再举个例子,在“Java 中操作字符串都有哪些类?它们之间有什么区别?”
这道题上,如果能答出“StringBuffer和StringBuilder都继承自抽象类AbstractStringBuilder”,面试官就知道你是读过源码的人,能给你加不少分。
Java面试真题整理
接下来就是把面试真题全部摸一遍,阿里P8杨逍老师在《大厂Java高级工程师的求职秘诀》的讲座中会深入剖析30+道大厂经典面试真题,如果自己学起来比较费劲的话,不如听一节视频先入个门,后面也会轻松很多。
我也理了一些课上老师讲过的经典题目出来:
① Java基础:String 类的常用方法都有那些?
• indexOf():返回指定字符的索引。
• charAt():返回指定索引处的字符。
• replace():字符串替换。
• trim():去除字符串两端空白。
• split():分割字符串,返回一个分割后的字符串数组。
• getBytes():返回字符串的 byte 类型数组。
• length():返回字符串长度。
• toLowerCase():将字符串转成小写字母。
• toUpperCase():将字符串转成大写字符。
• substring():截取字符串。
• equals():字符串比较。
②容器:如何决定使用 HashMap 还是 TreeMap?
对于在 Map 中插入、删除和定位元素这类操作,HashMap 是最好的选择。然而,假如你需要对一个有序的 key 集合进行遍历,TreeMap 是更好的选择。基于你的 collection 的大小,也许向 HashMap 中添加元素会更快,将 map 换为 TreeMap 进行有序 key 的遍历。
③多线程:sleep() 和 wait() 有什么区别?
• sleep():方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争 cpu 的执行时间。因为 sleep() 是static 静态的方法,他不能改变对象的机锁,当一个21块中调用了 sleep() 方法,线程虽然进入休眠,但是对象的机锁没有被释放,其他线程依然无法访问这个对象。
• wait():wait()是 Object 类的方法,当一个线程执行到 wait 方法时, 它就进入到一个和该对象相关的等待池,同时释放对象的机锁,使得其他线程能够访问,可以通过 notify,notifyAll 方法来唤醒等待的线程。
④反射:什么是 java 序列化?什么情况下需要序列化?
简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存 object states,但是 Java 给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
什么情况下需要序列化:
a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过 RMI 传输对象的时候;

 ⑤对象拷贝:如何实现对象克隆?

有两种方式:
1). 实现 Cloneable 接口并重写 Object 类中的 clone()方法;
2). 实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆,代码如下:
import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.Serializable;

public class MyUtil {

private MyUtil() {

throw new AssertionError();

}

@SuppressWarnings("unchecked")

public static <T extends Serializable> T clone(T obj) throws

Exception {

ByteArrayOutputStream bout = new ByteArrayOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(bout);

oos.writeObject(obj);

ByteArrayInputStream bin = new

ByteArrayInputStream(bout.toByteArray());

ObjectInputStream ois = new ObjectInputStream(bin);

return (T) ois.readObject();

// 说明:调用 ByteArrayInputStream 或 ByteArrayOutputStream 对象的

close 方法没有任何意义

// 这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,这一点不同

于对外部资源(如文件流)的释放

}

}

‍‍‍‍‍‍

⑥ Java Web:jsp 和 servlet 有什么区别? 

1.jsp 经编译后就变成了 Servlet.(JSP 的本质‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍就是 Servlet,JVM 只能识别 java 的类,不能识别 JSP 的代码,Web 容器将 JSP 的代码编译成 JVM 能够识别的 java 类)
2.jsp 更擅长表现于页面显示,servlet 更擅长于逻辑控制。
3.Servlet 中 没有内置对象, Jsp中的内置对象都是必须通过HttpServletRequest 对象, HttpServletResponse 对象以及HttpServlet 对象得到。
4. Jsp 是 Servlet 的一种简化,使用 Jsp 只需要完成程序员需要输出到客户端的内容,Jsp 中的 Java 脚本如何镶嵌到一个类中,由 Jsp 容器完成。而 Servlet 则是个完整的 Java 类,这个类的 Service 方法用于生成对客户端的响应。

⑦异常:throw 和 throws 的区别?

throws 是用来声明一个方法可能抛出的所有异常信息,throws 是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理。而 throw则是指抛出的一个具体的异常类型。

⑧网络:说一下 tcp 粘包是怎么产生的?

a. 发送方产生粘包
采用 TCP 协议传输数据的客户端与服务器经常是保持一个长连接的状态(一次连接发一次数据不存在粘包),双方在连接不断开的情况下,可以一直传输数据;但当发送的数据包过于的小时,那么 TCP 协议默认的会启用 Nagle 算法,将这些较小的数据包进行合并发送(缓冲区数据发送是一个堆压的过程);这个合并过程就是在发送缓冲区中进行的,也就是说数据发送出来它已经是粘包的状态了。
b. 接收方产生粘包
接收方采用 TCP 协议接收数据时的过程是这样的:数据到底接收方,从网络模型的下方传递至传输层,传输层的 TCP 协议处理是将其放置接收缓冲区,然后由应用层来主动获取(C 语言用 recv、read 等函数);这时会出现一个问题,就是我们在程序中调用的读取数据函数不能及时的把缓冲区中的数据拿出来,而下一个数据又到来并有一部分放入的缓冲区末尾,等我们读取数据时就是一个粘包。(放数据的速度 > 应用层拿数据速度)

⑨Spring / Spring MVC:spring 常用的注入方式有哪些?

Spring 通过 DI(依赖注入)实现 IOC(控制反转),常用的注入方式主要有三种:
1.构造方法注入
2.setter 注入
3.基于注解的注入

⑩Spring Boot / Spring Cloud:spring boot 核心配置文件是什么?

Spring Boot 提供了两种常用的配置文件:
• properties 文件
• yml 文件
以上只是Java面试的冰山一角,感兴趣的话也可以移步杨逍老师的Java面试技巧讲座,这门课程非常看重实用性,设计理念就是“通过真题搞定BATJ大厂面试”,通过40天有计划的训练,带你进阶到阿里 P6+级别。
扫码免费试听,P8大神讲座
设计+项目实战=offer到手
除了背答案,Java面试也要看一点硬货,更是筛人的标准。
总结下来主要是
  • 精通设计模式,能流畅回答面试官的问题
  • 拥有高含金量的项目,并扛过面试官的follow up
面向对象设计的题型大致分为管理类、预定类、实物类、游戏类,具体包括:

这类题目其实有套路可循,参考文泰来在《面向对象设计OOD》讲到的5C解题法
Clarify:通过和面试官交流,去除题目中歧义,确定答题范围
Core objects:确定题目所涉及的类,以及类之间的映射关系
Cases:确定题目中所需要的实现的场景和功能
Classes:通过类图的方式,具体填充题目中设计的类
Correctness:检查自己的设计,是否满足关键点
关于如何运用5C解题法顺畅的解题,可以来免费试听文泰来老师的《面向对象设计OOD》,他会通过一道经典的OOD问题——设计电梯,讲解如何运用5C解题法破题、画类图
,并通过面试官的层层追问。

业务逻辑稍微复杂一些的公司,面试都很看重项目经验。对于很多没接触过高可用架构的人来说,很难在短时间内填补这个缺口。
《Java高级工程师P6+》这门课就包含了高可用的项目实战,通过体系化的SpringBoot项目教学,带你还原真实开发场景,搭建出一个蚂蚁金服的后端。
这里就不展开讲了,另外也可以去Github上找一些开源项目来做。
告诉你一个玄学但又不完全玄学的冷知识:据说认真看到这里的朋友,点赞+在看就可以顺利通过Java面试哦~
继续阅读
阅读原文