拿到企鹅offer的学弟来报喜了!

阅读建议文章主要为Java开发工程师面试指南,涵盖了Java基础知识,并发编程及JVM和分布式,容器篇,算法提升练习等。阅读本文大概需要15分2秒。


最近公号后台收到一位小伙伴留言,说最近拿到腾讯的offer,满是感谢的话语,因为看了我写的一些技术文章,面试的时候几个知识点都答对了。收到信息后我倍感欣慰,第一次有小伙伴因为我的文章拿到心仪的offer还是企鹅,为了特别纪念这次开心专门写一篇文章,一方面是自己对所学技术知识的梳理总结,另一方面也可以跟大家一起学习探讨交流,以此共勉!大家一起加油!


目录

前言

一、Java基础篇

二、多线程/高并发

2.1 concurrent并发包

2.2 创建线程的方式

2.3 线程池

三、JVM篇

3.1 内存模型

3.2 内存管理机制

3.3 类加载机制

3.4 垃圾回收机制

3.4.1 垃圾收集器

3.4.2 年轻代/年老代永久代

3.5 双亲委派模型

四、设计模式

五、Spring核心

1.ioc/di 控制反转/依赖注入

2.aop切面编程

六、分布式篇

6.1 SpringBoot原理和基本知识

6.2 Dubbo原理和基本知识

6.3 SpringCloud微服务

七、数据库

八、MyBatis

九、消息中间件/缓存

9.1 常见消息队列

9.2 分布式缓存

十、jdk源码

十一、Docker容器集群

11.1 容器概念

11.2 Docker思想

11.3 Docker特性

十二、实战:LeetCode


前言

又到了新一届校招时期也是金九银十的跳槽季,回想起当初自己的经历,简直惨不忍睹。好在最后有公司收留去实习,也不枉自己的一番努力。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,上面有很多算法题供你练习。很多工作了的大牛也经常在上面锻炼自己的算法和编程思维,工作了也不忘充电学习:学而不思则罔思而不学则殆。

查看几篇leetcode文章:二叉树遍历两数之和杨辉三角整数转罗马数

评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序大视界

原创不易,请给点支持和鼓励吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值