【阅读建议】文章主要为Java开发工程师面试指南,涵盖了Java基础知识,并发编程及JVM和分布式,容器篇,算法提升练习等。阅读本文大概需要15分2秒。
最近公号后台收到一位小伙伴留言,说最近拿到腾讯的offer,满是感谢的话语,因为看了我写的一些技术文章,面试的时候几个知识点都答对了。收到信息后我倍感欣慰,第一次有小伙伴因为我的文章拿到心仪的offer还是企鹅,为了特别纪念这次开心专门写一篇文章,一方面是自己对所学技术知识的梳理总结,另一方面也可以跟大家一起学习探讨交流,以此共勉!大家一起加油!
目录
前言
又到了新一届校招时期也是金九银十的跳槽季,回想起当初自己的经历,简直惨不忍睹。好在最后有公司收留去实习,也不枉自己的一番努力。2020年真是艰苦的一年,对于毕业季求职和找工作的来说无疑是雪上加霜,小编这里结合了自身所学整理了一篇价值10w的面试资料,供有缘人参考,码字不易,如觉得对你有帮助请给小编点个赞转发一下加个关注。最后,祝大家都能收获满意的offer!
一、Java基础篇
基本数据类型、java语法、数据结构、算法等,这些是作为一个合格的Java程序员所必须要掌握的技能知识。
整理推荐一些学习网站和书籍:从入门到高级Java书籍推荐 推荐10个程序员常去的网站
整理一份Java面试基础题:Java面试基础题
二、多线程/高并发
2.1 concurrent并发包
- volatile
- lock
- synchronized
- wait
详细查看另一篇文章:java多线程关键字volatile、lock、synchronized
2.2 创建线程的方式
1、继承 Thread
2、实现Runnable接口--无返回值
3、实现Callable接口--有返回对象
2.3 线程池
ThreadPoolFactory:
1、newFixedThreadPool:不固定线程池大小的线程池,无限使用内存大小的线程池
2、newShcledulThreadPool:定时周期运行的固定长度大小的线程池
3、newSingleThreadPool:单线程的线程池,只创建一个线程的线程池
4、newCachedThreadPool:没有核心线程数,无限循环利用原先创建的线程
详细查看另一篇文章:Java并发编程小结
三、JVM篇
3.1 内存模型
主内存:所有线程共享的一块区域,每个线程读取的最新数据都是从主内存中获取
工作内存:每个线程所特有的,每个线程操作自己的变量等,操作完之后往主内存中加载和写入
java线程:所有线程可并行执行的项
3.2 内存管理机制
程序计数器:线程所特有的,程序运行的命令行号指示器,如程序所运行的当前位置和下一步位置。
java堆:所有线程所共有的,最大的一块内存区域,通常是对象实例初始化存储的区域,如new Object对象后所产生的对象占据的内存区域。
方法区:所有线程所共有的,除了java堆外最大的内存区域,通常存储类信息、常量、静态变量、即时编译后的代码等。
java虚拟机栈:虚拟机执行java方法服务,线程私有的,生命周期与线程相同。创建栈帧:局部变量表,操作数栈,动态链接,方法出口等信息。
本地方法栈:虚拟机执行本地native方法所需的类库,如rt.jar包的类库
运行时常量池:方法区的一部分,类的版本、字段、方法、接口。
3.3 类加载机制
- 加载
- 验证
- 准备
- 解析
- 初始化
3.4 垃圾回收机制
3.4.1 垃圾收集器
serial收集器---单线程的收集器
parNew收集器---serial的多线程版本
serialOld收集器---老一代的serialOld收集器(Client模式下的虚拟机使用)
parallelOld收集器---标记整理算法
parallel scavenge收集器
cms收集器---最短回收停顿时间为目标,B/S架构,强调服务响应速度,StopTheWorld
g1收集器
3.4.2 年轻代/年老代永久代
3.5 双亲委派模型
每个类的初始化加载均由其父类加载进行加载,不是由他自己进行加载。
启动加载器-bootstrapClassLoader
扩展加载器-extentionClassLoader
应用加载器-applicationClassLoader
自定义加载器
如rt.jar中的Object类,是由顶层的启动加载器加载,如果不是双亲委派模型,即普通加载:那么就会产生矛盾和冲突
详细查看JVM篇:JVM虚拟机深入理解+GC回收+类加载 和 JVM之:GC算法和GC收集器
四、设计模式
设计模式基本是面试必问的点,23种基本设计模式不需要你全部掌握,但是基本常见的设计模式必须掌握。
- 单例模式 懒汉饿汉模式
- 工厂模式
- 工厂方法模式
- 抽象工厂模式
- 代理模式
- 装饰模式
- 建造者模式
- 观察者模式
详细查看设计模式篇:Java常见的设计模式
五、Spring核心
Spring大家族系列知识为广大开发者提供了极大的便利,也可以说是Java程序员的音符,Spring集成能给系统框架带来质的飞跃。
其核心主要为:Spring的核心特性就是IOC和AOP,IOC(Inversion of Control),即“控制反转”;AOP(Aspect-OrientedProgramming),即“面向切面编程”。
1.ioc/di 控制反转/依赖注入
把对象的创建交给spring容器管理,减少对象之间的耦合,容易扩展
2.aop切面编程
全称是Aspect Orient Programming,即面向切面编程。是对OOP(Object Orient Programming)的一种补充,用于处理一些具有横切性质的服务。常常用于日志输出、安全控制等。
详细查看Spring篇:面试常被问的25个Spring知识点
六、分布式篇
分布式作为近几年主流开发框架,也是必须要掌握的知识,主要以RPC(Dubbo)、SpringBoot/SpringCloud两种常见主流框架。各大厂也相继推出自己的开源分布式框架,可谓是百花齐放百家争鸣呀。
6.1 SpringBoot原理和基本知识
@SpringBootApplication注解
包含如下三个:
@Configuration注解,标明该类使用Spring的注解方式
@ComponentScan注解,启用组件扫描,当使用注解标志其他控制器Controller或service时,组件扫描注解能够发现并加载到这些应用上下使用到的bean
@EnableAutoConfiuration注解,标明使用自动配置;如autowired注解等,自动加载配置的注解。
详细查看SpringBoot介绍篇:Spring、SpringMVC和SpringBoot的比较
6.2 Dubbo原理和基本知识
Dubbo的基本结构:
- 提供者Provider:向注册中心注册服务,暴露服务提供的一方;
- 服务消费者Comsumer:向注册中心注册服务,并获取服务提供列表来使用,服务消费的一方;
- 注册中心Register:服务注册与发现的注册中心;
- 服务监控中心Monitor:统计服务调用次数和调用时间的监控中心;
- 服务容器Container:服务运行容器。
详细查看Dubbo篇:Dubbo基本原理介绍
6.3 SpringCloud微服务
SpringCloud是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说,它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来,从而简化了开发者的代码量。
- 路由网关
- 配置中心
- 链路追踪
- 服务熔断
- 日志
- 服务监控
详细查看分布式专栏:深入理解SpringCloud与微服务构建 和 SpringCloud与Dubbo的比较
七、数据库
数据库的重要性不言而喻了,系统一切皆数据,而数据库即是数据存储的容器。主要以2大种类数据库:关系型数据库和非关系型数据库,关系型数据库主要以Oracle、MySQL,非关系型数据库NoSQL以mongodb,redis。
- 数据模型
- 数据库三范式
- 数据库事务
- SQL注入
- SQL语句
- 存储引擎
- 索引
- SQL优化
详细查看数据库篇:数据库索引(Oracle和Mysql)学习总结
八、MyBatis
MyBtis是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
- #{}和${}符号:#符在mybatis加载的时候,会预处理成?,进而用stateMent的set方法进行sql语句操作,可有效防止SQL注入。
- $符是字符串替换,直接替换掉值。
- dao(mapper)是如何进行SQL结果查询的?
- mybatis会把它加载成mapperStateMent;mapper的接口加载后就对应为xml配置文件中的namespace全限定名;根据dao的接口名和接口方法名
- 唯一对应到一个namespace,也即是唯一的key;
查看相关文章:SpringCloud+MyBatis分页处理(前后端分离)
九、消息中间件/缓存
分布式插件技术是分布式开发中必须要掌握的技术,包括:消息队列、分布式缓存、分库分表插件等。
9.1 常见消息队列
- kafka
- RabbitMq
- RocketMq
- ActiveMQ
详细查看消息队列篇:消息中间件之:Kafka、ActiveMQ、RabbitMQ、RocketMQ
9.2 分布式缓存
- Redis
- Memcached
详细查看Redis篇:Redis快速入门 和 Redis的三种模式:主从、哨兵、集群
十、jdk源码
除了以上技术点外,面试官经常在末尾会问你一些jdk源码知识,以考察你平常是否有研究过jdk源码,这是对标准程序员的一个考量重要点,也是评价一个程序员是否有深入思考的习惯。
- jdk1.8
- String
- Object
- Map
- ArrayList
- LinkedList
- HashMap
- ConcurrentHashMap
查看几篇源码文章:HashMap都在用,原理你真的了解吗? 和 ArrayList源码浅析 和 LinkedList源码分析 和 ArrayList与LinkedList的比较 和 JDK1.8的几个简单Lambda表达式
十一、Docker容器集群
容器就是将软件打包成标准化单元,以用于开发、交付和部署。
11.1 容器概念
- 容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
- 容器化软件适用于基于Linux和Windows的应用,在任何环境中都能够始终如一地运行。
- 容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
11.2 Docker思想
- 集装箱
- 标准化: ①运输方式、②存储方式、 ③API接口
- 隔离
11.3 Docker特性
- 轻量,在一台机器上运行的多个Docker容器可以共享这台机器的操作系统内核;它们能够迅速启动,只需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的,并共享一些公共文件。这样就能尽量降低磁盘用量,并能更快地下载镜像。
- 标准,Docker容器基于开放式标准,能够在所有主流Linux版本、Microsoft Windows以及包括VM、裸机服务器和云在内的任何基础设施上运行。
- 安全,Docker赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台机器。
十二、实战:LeetCode
对于一些一线大厂,尤其是校招时,会着重考察你的编程实战能力。有的甚至当场要求你手写代码:快速排序、二分查找、杨辉三角、二叉树遍历等。这就要求不仅要掌握基本数据结构和算法,还要有强硬的编程实战能力以及临场发挥。对于心仪的公司和心仪的职位,一定要准备充分了才去面试,这里推荐LeetCode,上面有很多算法题供你练习。很多工作了的大牛也经常在上面锻炼自己的算法和编程思维,工作了也不忘充电学习:学而不思则罔思而不学则殆。