阅读建议】文章主要为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文章:二叉树遍历、两数之和、杨辉三角整数转罗马数

拿到企鹅offer的学弟来报喜了!相关推荐

  1. 今天,一个收到谷歌Offer的学弟用50W年薪秀了我一脸...

    我是LJJ,首先我要说:这篇文章有结结实实的福利,要坚持读完,因为干货多,所以它的过程有些乏味. OK,进入正文: 2018,庞大的毕业生涌入社会.每一个人都在为工作彷徨. 2018年硕士毕业生邱熙却 ...

  2. 双非院校非科班的学弟,刚刚拿到了腾讯、网易、美团等大厂Offer

    △Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 359 篇原创分享 作者 l 霜华 来源 l Hollis(ID:hollischuang) 本文来自作者投稿,作者是是双 ...

  3. 二本院校学弟大二开始实习,大三收割阿里、腾讯实习offer

    点击上方 "大数据肌肉猿"关注, 星标一起成长 后台回复[加群],进入高质量学习交流群 2021年大数据肌肉猿公众号奖励制度 今天介绍的是学校的直系学弟,二本独立院校软工专业,他大 ...

  4. 四面阿里!终获offer!乔戈里直系学弟四面阿里面经分享!

    在四面之前,出现了个小插曲.就是面试官上午估计是有跟我打过电话,但是貌似跟饿了么的外卖员跟我打电话冲突了「应该都是走的阿里的电话系统」,导致我压根没接到电话「外卖员还说给我打电话我一直不接,我说我压根 ...

  5. 从刚入职阿里的学弟那里薅来的面试题,速速领取~~~

    最近收到学弟好消息,经历几番尝试和挣扎,终于在今年入职阿里,实现了自己的职业梦想!! 学弟17年毕业国内211院校本科,19-21年在业内有些知名度小厂工作,下半年的时候准备跳槽. 学弟准备跳槽前,经 ...

  6. 写给准备参加秋招的学弟学妹们~一定要来看哦~

    一. 写在前面 这两天找工作不易,由衷感慨,很多书都没早看,所以希望学弟学妹们能多看点书,特别是我们qtech的ACMer们,我们这种acm弱校的ACMer走出来的,acm水平都不行,如果再像我当年那 ...

  7. 小透明学弟的华为上岸之路

    分享直系学弟 "离奇" 的求职经历和心路历程. 大家好,我是鱼皮,今天给大家分享一位 同校同系 学弟的亲身经历. 这位学弟自称小透明,就读软件工程专业,即将本科毕业入职华为,职位是 ...

  8. 内推学弟进了腾讯,看看他的标杆简历!

    直系学弟的简历分享,凡人也可以成仙?! 大家好,我是鱼皮,求职季快到了,很多小伙伴问我:简历应该怎么写才能吸引面试官呢? 其实之前给大家分享过鱼皮自己的求职简历和简历模板(数据是模拟的哈): [外链图 ...

  9. 奉劝想把编程学好的学弟们 · 如何高效学习编程?

    大家好,我是安然无虞. 目录 一.毕业想成为程序员,现在该怎么学? 1.IT行业是不是值得进入? 2.想做研发工作,该学习什么? 二.怎么学,有方法吗? 1.入门攻略 怎么学好C语言 使用C语言写一些 ...

最新文章

  1. AI Time | 激辩自动驾驶:近在咫尺还是遥遥无期
  2. Java学习笔记20
  3. 阿里云盘又送福利啦?空间大时间长,不要犹豫快上车!
  4. 收集常用的正则表达式
  5. 记-更改配置而不需停止并重新启动服务
  6. Bazel构建工具的安装
  7. 观后感,读了几篇博文
  8. 更换分布式文件系统副本组成员的硬件或操作系统——第一步:计划
  9. HBase的BulkLoad详解
  10. 浏览器根对象window之performance
  11. .Net码农就业求职储备(新手进阶)
  12. 计算机英语新增词汇,GRE新增词汇汇总
  13. 手机音频拼接软件_5款适合新手的手机音频剪辑APP
  14. vi 和 vim 编辑器的使用
  15. Comparator.comparing比较排序
  16. XML采用Boost::regex解析实例
  17. interpro 数据库
  18. 基于深度学习的中文语音识别系统框架搭建
  19. python tableau工作流_【干货】五分钟Get到Tableau五个实用小技巧
  20. 西安职业中等专业学校计算机专业,西安实验职业中等专业学校毕业及就业介绍...

热门文章

  1. 新能源消纳的“张家口样本”
  2. 解决中国大学mooc网页版不能登陆问题
  3. QM跨国收购 量子计算QPU市场风云变换
  4. tarjan+拓扑序+差分--2018.10.16模拟赛T2
  5. 数据科学家必知必会的7款Python工具,你会几个?
  6. redis + lua解决抢红包高并发的问题
  7. python turtle画小兔子图片_如何用Python画一只兔子——turtle库circle()画圆函数的详细用法介绍...
  8. Android程序获取root权限问题的最终解决与分析
  9. 程序员,你为什么值这么多钱? 1
  10. QQ邮箱登录PC布局实战笔记一