算法

这个真的就只能靠刷题,不敢说每家公司对于笔试的重视程度怎么样,反正笔试基本上是必须要过的一关

  • 队列。

  • 数组。

  • 栈。

  • 链表。

  • 树。

  • 散列表(哈希表)。

  • 堆。

  • 图。

  • 无序树:树中任意节点的子结点之间没有顺序关系、这种树称为无序树、也称为自由树。

  • 有序树:树中任意节点的子结点之间有顺序关系、这种树称为有序树。

  • 二叉树:每个节点最多含有两个子树的树称为二叉树。

  • 完全二叉树。

  • 满二叉树。

  • 斜树。

  • 平衡二叉树。

  • 霍夫曼树:带权路径最短的二叉树称为哈夫曼树或最优二叉树。

  • 红黑树。 以及各种遍历方式、按层打印、统计距离等等。 树是基础,基本的数据结构还包括图、图的遍历方式。 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 动态代理和 GClib 动态代理、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文件或者博客里

一周之后,或者几天之后在复习一遍,(艾宾浩斯遗忘曲线)温故而知新