双非渣本菜鸡的面试之路
从春节过后,我,一位双非渣本的大三学生,便踏上了实习之旅,面试了不下三十场,虽然很菜,但是也相应地拿了一些 offer ,例如京东金融、人人车等五六家 offer
总结一下春招就是一个字:难。
没学历,技术还凑合,简历能过但是面试就有点困难。这期间收到了 N 个面试官的歧视,有些面试官感觉骨子里瞧不起我们这些双非的人。一下内容仅凭记忆回想起,还有一些必问的东西,总结在这里,希望能帮到大家!
算法
这个真的就只能靠刷题,不敢说每家公司对于笔试的重视程度怎么样,反正笔试基本上是必须要过的一关
-
队列。
-
数组。
-
栈。
-
链表。
-
树。
-
散列表(哈希表)。
-
堆。
-
图。
-
无序树:树中任意节点的子结点之间没有顺序关系、这种树称为无序树、也称为自由树。
-
有序树:树中任意节点的子结点之间有顺序关系、这种树称为有序树。
-
二叉树:每个节点最多含有两个子树的树称为二叉树。
-
完全二叉树。
-
满二叉树。
-
斜树。
-
平衡二叉树。
-
霍夫曼树:带权路径最短的二叉树称为哈夫曼树或最优二叉树。
-
红黑树。
以及各种遍历方式、按层打印、统计距离等等。
树是基础,基本的数据结构还包括图、图的遍历方式。
DFS、BFS以及各种优缺点、贪心算法、回溯、以及建模等等等等,只能靠刷题来提升。
计算机网络
- GET/POST 区别。
- UDP/TCP区别。
- TCP 三次握手。以及衍生出来一些列的 TCP 的问题:什么是 TIME-WAIT、为什么可以是三次挥手、为什么不能是两次握手、流量控制、滑动窗口、Nagle 算法、糊涂窗口综合症、拥塞控制、慢启动、拥塞避免、快重传、快恢复、长连接 VS 短连接、应用场景是什么。
- HTTP 1.0、1.1、2.0。
- 说一下 HTTPS 的流程、SSL 是什么、什么是非对称加密、对称加密、RSA 具体实现。
- OSI 七层模型是什么、都有哪些协议、TCP/IP 四层是什么。
- DNS、ARP 协议原理。
- 地址栏输入 URL 发生了什么。
- WebSocket 是什么。
- 一些网络安全问题、比如 DOS 攻击如何解决、DNS 欺骗如何解决、ARP欺骗、SQL注入、XSS、CSRF、iframe 安全问题、本地存储数据问题、第三方依赖的安全性问题。
- HTTP 是不保存状态的协议、那么如何保存用户状态。
- Cookie 的作用是什么、和 Session 有什么区别。
- Session 的实现机制是什么、分布式环境下有什么注意事项、如果注销 Session、设置 Session 的时长如何操作、默认时长是多少。
- HTTP 1.0 和 HTTP 1.1 的主要区别是什么。
- 各种协议与 HTTP 协议之间的关系。
- Servlet、Filter 和 Listener 分别是什么,用在什么地方,JSP 页面如何进行处理。
- 请求转发、URL 重定向和包含有什么区别,如何实现。
- 如何判断远程机器上某个端口是否开启,项目中需要查看域名在本地的解析 IP ,如何操作。
- Servlet 中,调用 JSP 展示元素和返回 String(即 api,一般是 json 数据)有什么区别。
- nginx + tomcat 模式下,服务器段如何获取客户端请求 IP 。
- Servlet 的生命周期是什么。
- Servlet 是否是线程安全的。
Java基础
-
描述一下值传递和引用传递的区别。
-
== 和 equals 区别是什么、String 中的 equals 方法是如何重写的、为什么要重写 equals 方法、为什么要重写 hashCode 方法。
-
String s1 = new String("abc")、String s2 = "abc"、s1 == s2 。语句1在内存中创建了几个对象。
-
String 为什么是不可变的、jdk源码中的 String 如何定义的、为什么这么设计。
-
请描述一下 static 关键字和 final 关键字的用法。
-
接口和抽象类的区别是什么。
-
重载和重写的区别。
-
面向对象的三大特性,谈谈你对 xx 的理解。
-
考察的是基本类型的转换,及原码反码补码的运算。
-
byte 的取值范围是多少、怎么计算出来的。
-
HashMap 相关、HashMap 和 Hashtable 的区别、HashMap 和 HashSet 区别、HashMap 底层实现、HashMap 的长度为什么是 2 的幂次方、HashMap 多线程操作导致死循环问题、HashMap 的线程安全实现有哪些、ConcurrentHashMap 的底层实现。
-
Integer 缓存池。
-
UTF-8 和 Unicode 的关系。
-
项目为 UTF-8 环境,char c = ‘中’,是否合法。
-
Arrays.asList 获得的 List 使用时需要注意什么。
-
Collection 和 Collections 区别。
-
你知道 fail-fast 和 fail-safe 吗。
-
ArrayList 和 LinkedList 和 Vector 的区别。
-
Set 和 List 区别、Set 如何保证元素不重复。
-
UTF-8 与 GBK 互转、为什么会乱码。
-
重载和重写的区别。
-
为什么 Java 是解释性语言。
-
ConcurrentHashMap 1.7和1.8的区别:整体结构;put()方法、get()方法、resize()方法、size()方法
-
地址栏输入 URL 发生了什么。
-
组合和聚合的区别。
-
讲一下 CMS 垃圾回收器。
-
JDK 动态代理和 CGLib 动态代理、JDK 动态代理具体实现原理、CGLib 动态代理、两者对比。
-
Threadlocal 内存泄漏问题。
-
StringBuilder 安全怎么实现的、详细描述怎么扩容的。
MyBatis
-
Mybatis 执行流程。
-
Mybatis缓存。
-
Mybatis用到的设计模式。
Java锁
-
锁类型
-
悲观锁 VS 乐观锁
悲观锁代表 Synchronized 关键字。
Synchronized 关键字实现方法。
乐观锁代表 CAS 操作。
CAS 带来的 ABA 问题。
CAS 带来的循环时间长开销大问题。
CAS 带来的只能保证一个共享变量的原子操作问题。
CAS 是如何保证原子操作的。
AtomticXXX 实现的原理。
volatile 关键字。
内存可见性的原因。
禁止指令重排序的原因。
volatile 关键字不能保证原子操作的原因。
关于 volatile 关键字的讨论。
happen-before 规则介绍。
-
可重入锁、 可中断锁、公平锁、读写锁
谈谈对 AQS 的理解。
可重入锁。
可中断锁。
公平锁。
读写锁。
-
偏向锁/轻量级锁/重量级锁 升级过程。
-
补充
自旋锁。
分段锁。
轻量级锁就一定比重量级锁快吗。
Java多线程
-
线程与进程的区别
线程的状态。
Notify 和 wait 。
Thread.sleep() 和 Thread.yield() 的异同。
死锁的概念。
并发和并行的区别。
线程安全三要素。
如何实现线程安全。
保证线程安全的机制。
谈谈对对多线程的理解。
run 和 Start 方法的区别。
-
多线程
创建线程的方法。
线程池创建线程。
ThreadPoolExecutor介绍。
BlockingQueue。
ArrayBlockingQueue。
LinkedBlockingQueue。
LinkedBlockingQueue 和 ArrayBlockingQueue 的主要区别。
handler 拒绝策略。
线程池五种状态。
深入理解 ThreadPoolExecutor。
线程池中 ctl 属性的作用是什么。
shutdownNow 和 shutdown 的区别。
线程复用原理。
灵魂拷问:你如何设置你的线程池参数。
CountDownLatch 和 CyclicBarrier 区别。
-
多线程间通信的几种方式
使用 volatile 关键字。
锁机制。
final 关键词。
ThreadLocal 类。
JUC 包中的相关 lock 类
Jvm内存模型
-
JVM内存模型
程序计数器(记录当前线程)。
Java栈(虚拟机栈)。
本地方法栈。
堆。
方法区。
直接内存。
-
JVM 垃圾回收
垃圾判断标准。
引用计数法。
可达性分析算法(根索法)。
-
垃圾回收算法
标记清除。
复制算法。
标记整理。
分代回收。
GC 垃圾回收器。
-
垃圾收集器
Serial 垃圾收集器(单线程、复制算法) (新生代)。
ParNew 垃圾收集器(Serial+多线程) (新生代)。
Parallel Scavenge 收集器(多线程复制算法、高效) (新生代)。
Serial Old 收集器(单线程标记整理算法 ) (老年代)。
Parallel Old 收集器(多线程标记整理算法)(老年代)。
CMS 收集器(多线程标记清除算法) (老年代)。
G1垃圾回收器。
-
目前 web 应用中的垃圾收集器。
-
吞吐优先与响应优先。
-
Minor GC 和 Full GC。
-
Full Gc 触发条件。
-
对象内存布局。
-
为什么新生代存在两个 survivor 区。
-
一个对象真正不可用,要经历两次标记过程。
MySQL
-
什么是数据库事务、数据库事务的四个特性是什么。
-
请分别举例说明幻读和不可重复读、并描述一下它们之间的区别。
-
MySQL 的默认隔离级别是什么。
-
为什么要使用索引。
-
索引这么多优点,为什么不对表中每个字段都创建索引呢。
-
索引是如何提升查询速度的。
-
请说出你知道的索引失效的几种情况。
-
什么是聚簇索引与非聚簇索引
-
MySQL 索引主要使用的数据结构有哪些。
-
谈谈 MyISAM 和 InnoDb 实现 BTree 索引方式的区别。
-
什么是覆盖索引、请举例说明。
-
谈谈你对最左前缀原则的理解。
-
MySQL 中 InnoDb 和 MyISAM 有什么区别。
-
谈谈如何对SQL进行优化。
-
如何用 explain 分析 SQL 执行效率。
-
explain 显示的字段具体解释下。
-
请举出可能形成数据库死锁的原因、如何能避免死锁。
-
数据库中的乐观锁和悲观锁有什么区别、各适用于什么场景。
-
请结合你的开发经历,谈谈数据库中的乐观锁和悲观锁是具体如何被应用的。
-
索引的本质。
-
MySQL 存储引擎。
-
MySQL 索引
数据结构,B-Tree 和 B+Tree。
带有顺序访问指针的 B+Tree
索引的物理存储。
与 B-Tree 相比,B+Tree 有什么不同。
为什么 B+Tree 更适合做文件索引。
为什么不用 AVL 树或者红黑树做索引。
两种引擎的索引存储机制。
MyISAM 索引实现。
InnoDB 索引实现。
索引失效条件。
索引类型
哈希索引。
有序数组。
B+ 树索引(InnoDB)。
联合索引。
最左前缀原则。
覆盖索引。
索引下推。
Spring
-
Spring bean 的生命周期
初始化容器。
Bean 属性注入、更改以及初始化。
Bean 的使用。
关闭容器、销毁 Bean。
-
Spring如何解决 bean 的循环依赖
容器循环依赖。
setter循环依赖。
构造器循环依赖
-
Bean 的加载过程
-
BeanFactory 和 FactoryBean 的区别
-
Bean 注册与使用
-
Spring 三级缓存如何解决循环依赖。
-
Spring事务、原理、传播行为、失效条件。
-
AOP
-
IOC
-
SpringBoot 自动注入原理、stater原理、启动流程。
-
Spring 事务管理原理。
分布式
-
Dubbo 支持哪些协议、每种协议的应用场景、优缺点。
-
Dubbo 超时时间怎样设置。
-
Dubbo 有些哪些注册中心。
-
Dubbo 集群的负载均衡有哪些策略。
-
Dubbo 的主要应用场景。
-
Dubbo 的核心功能。
-
Dubbo 的核心组件。
-
Dubbo 服务注册与发现的流程。
-
Dubbo 的服务调用流程。
-
Dubbo 支持哪些协议、每种协议的应用场景、优缺点。
-
Dubbo 的注册中心集群挂掉,发布者和订阅者之间还能通信么。
-
Dubbo与 Spring 的关系。
-
Dubbo 使用的是什么通信框架。
-
Dubbo 的集群容错方案有哪些。
-
Dubbo 支持哪些序列化方式。
zookpeer
-
zookpeer 节点类型。
-
zookpeer 的作用。
-
zookpeer 的 watcher 机制。
-
zookpeer 如何实现分布式锁。
-
zookpeer 选举算法。
-
Paxos 算法。
-
Raft 算法。
-
ZAB 协议。
-
什么是分布式事务。
分布式事务解决方案。
了解 seata 吗。
一致性哈希?
哈希槽、以及为什么是2^14。
-
SpringCloud组件?
-
什么是 Hystrix、它如何实现容错。
-
什么是 RestTemplate。
-
什么是 Ribbn。
-
nacos/Eureka 的对比。
-
什么是 zuul。
-
什么是 Getway。
-
什么是 Config。
-
什么是微服务
什么是SOA。
SOA和微服务的区别。
-
为什么要用微服务。
-
使用微服务存在的问题以及解决办法。
-
微服务之间如何通信。
-
微服务如何发现。
-
微服务挂了、如何解决。
-
重试机制、幂等性。
限流
熔断、降级
-
Linux
-
linux 常用命令有哪些、分别举例。
-
查询 3306 端口占用情况的 linux 指令如何写。
-
linux 中查看某个 java 进行的进程号 pid、如何操作呢。
-
进程通信方式。
-
进程、线程、协程。
-
进程调度算法。
-
Liunx下的 I/O 模型。
-
用户态、内核态。
-
如何减少内核态到用户态的拷贝(mmap)。
-
常用的命令。
-
查看日志。
如何复习
Java笼统一点来讲,无非是:JUC、多线程、锁、集合、基础知识、框架、分布式。
一个知识体系一定要一块学,
比如 JUC,这个是一个很大的包,系统学习会比较消耗时间,但是收益也是比较不错的,能够吧一些细节的点都串联起来,这样记忆比较更深刻一些
比如 HashMap 可以揉碎了学习,为什么0.75的负载因子,为什么要无符号右移16位?为什么是2的倍数?为什么是8而不是7、9?
工具类的东西很容易被替代,曾今的 SSH 现在的 Spring-Boot、Cloud,也许过几年之后又是新花样,但技术底层是差不多的原理,了解了底层,不仅有助于问题的排查,对于程序猿的整个晋升的道路而言,更是不错的一种思维、学习方式。
忌讳东一榔头,西一棒槌的学习,那样知识为了应付面试,面试过了,很容易就会忘。
一般这样的一个顺序:
-
看源码,抠细节
-
看博客、公众号的相应解释
-
自己总结一遍,写到自己的MD文件或者博客里
-
一周之后,或者几天之后在复习一遍,(艾宾浩斯遗忘曲线)温故而知新
刷题
刷题两个好地方:
-
牛客,也是我推荐大家去的,所有题目免费,而且基本上都有大佬们讨论
-
LeetCode,这个也可以,但是相应地会收取一定的费用,VIP之类的
字节跳动对于算法十分钟爱,几乎每一面都会至少两到算法题,所以,要想进字节,至少俩月算法题刷起来。
不要扯什么算法不重要,程序猿搞不定算法就像厨子不会颠勺,司机不会挂挡。