Java 面试全解析:核心知识点与典型面试题
500 道 Java 常见面试题 + 10 万字核心知识解析,丰富的 Java 技术栈:基础和框架,线程池和锁优化,SpringBoot 和分布式消息队列,数据结构和常用算法,设计模式和 JVM 等,易学易会:提供了大量的图片说明和代码示例
sufu1065
这个作者很懒,什么都没留下…
展开
-
开篇词:如何轻松获得 Offer
你好,我是王磊,某上市公司技术研发经理,前奇虎 360 员工,有着 10 余年的编程工作经验,目前主要负责新员工技术面试和构建企业技术架构的相关事宜。随着面试过的人数增加,我发现面试者们暴露出了技术方面的很多问题,为了让更多面试者少走一些弯路,也为了让企业能招到合适的技术人才,于是就诞生了这门课程。为了能把这门课程写好,我先后拜访了一二十家互联网公司,与不同的面试官和面试者进行面对面探讨,深入了...原创 2020-10-28 16:07:28 · 404 阅读 · 0 评论 -
第 1-1 课:Java 程序是如何执行的?
了解任何一门语言的精髓都是先俯览其全貌,从宏观的视角把握全局,然后再深入每个知识点逐个击破,这样就可以深入而快速的掌握一项技能。同样学习 Java 也是如此,本节就让我们先从整体来看一下 Java 中的精髓。Java 介绍Java 诞生于 1991 年,Java 的前身叫做 Oak(橡树),但在注册商标的时候,发现这个名字已经被人注册了,后来团队的人就在咖啡馆讨论这件事该怎么办,有人灵机一动说...原创 2020-10-28 16:07:28 · 434 阅读 · 0 评论 -
第 1-2 课:你不知道的基础数据类型和包装类 + 面试题
基本数据类型Java 基础数据按类型可以分为四大类:布尔型、整数型、浮点型、字符型,这四大类包含 8 种基础数据类型。布尔型:boolean整数型:byte、short、int、long浮点型:float、double字符型:char八种基础类型取值如下:数据类型代表含义默认值取值包装类boolean布尔型false0(false) 到 1(true...原创 2020-10-28 16:07:29 · 354 阅读 · 0 评论 -
第 1-3 课:深入理解字符串 + 面试题
字符串介绍字符串是程序开发当中,使用最频繁的类型之一,有着与基础类型相同的地位,甚至在 JVM(Java 虚拟机)编译的时候会对字符串做特殊的处理,比如拼加操作可能会被 JVM 直接合成为一个最终的字符串,从而到达高效运行的目的。1 String 特性String 是标准的不可变类(immutable),对它的任何改动,其实就是创建了一个新对象,再把引用指向该对象;String 对象赋值...原创 2020-10-28 16:07:30 · 311 阅读 · 0 评论 -
第 1-4 课:Java 中的运算符和流程控制 + 面试题
算术运算符Java 中的算法运算符,包括以下几种:算术运算符名称举例+加法1+2=3-减法2-1=1*乘法2*3=6/除法24/8=3%求余24%7=3++自增1int i=1;i++--自减1int i=1;i--我们本文要重点讲的是 “++” 和 “--”,其他的算术运算符相对比较简单直观,本文就不...原创 2020-10-28 16:07:30 · 188 阅读 · 0 评论 -
第 1-5 课:深入了解 Java 中的异常处理 + 面试题
在程序开发中,异常处理也是我们经常使用到的模块,只是平常很少去深究异常模块的一些知识点。比如,try-catch 处理要遵循的原则是什么,finally 为什么总是能执行,try-catch 为什么比较消耗程序的执行性能等问题,我们本篇内容都会给出相应的答案,当然还有面试中经常被问到的异常模块的一些面试题,也是我们本篇要讲解的重点内容。异常处理基础介绍先来看看异常处理的语法格式: try...原创 2020-10-28 16:07:31 · 238 阅读 · 0 评论 -
第 1-6 课:玩转时间 + 面试题
在 JDK 8 之前,Java 语言为我们提供了两个类用于操作时间,它们分别是:java.util.Date 和 java.util.Calendar,但在 JDK 8 的时候为了解决旧时间操作类的一些缺陷,提供了几个新的类,用于操作时间和人气,它们分别是:LocalTime、LocalDateTime、Instant,都位于 java.time 包下。时间的操作在我们日常的开发中经常见到,比如...原创 2020-10-28 16:07:31 · 285 阅读 · 0 评论 -
第 1-7 课:数组和排序算法 + 面试题
数组的定义与使用数组是 Java 编程中最重要的数据结构之一,也是最基本的数据结构,Java 中的常用集合 ArrayList、HashMap 等内部的实现都使用到了数组结构。数组是只能用来存储一种类型的集合,可以通过下标访问数值中的所有元素。数组的声明方式有以下两种,如整数型数组,请参考下面代码:方式一:int[] arr;方式二:int arr[];大部分情况下,我们会使用第一种...原创 2020-10-28 16:07:32 · 255 阅读 · 0 评论 -
第 2-1 课:类与 Object + 面试题
类介绍Java 程序是由若干个类组成的,类也是面向对象编程思想的具体实现。以下为类的基本使用:public class Cat { // 私有属性 private String name; private int age; // 构造方法 public Cat() { } // 普通方法 public void eat() {...原创 2020-10-28 16:07:32 · 263 阅读 · 0 评论 -
第 2-2 课:各种内部类和枚举类 + 面试题
内部类不仅经常出现在各种面试题中,还会在 Java 源码中频频出现,因此只有搞明白了 Java 内部类,才能搞定面试和看懂各种 Java 源码。内部类Java 内部类,分为以下四种:成员内部类静态成员内部类局部内部类匿名内部类下面分别来看这些内部类的使用。成员内部类定义在一个类中定义了另一个类,则将定义在类中的那个类称之为成员内部类。成员内部类也是最普通的内部类。使用成...原创 2020-10-28 16:07:33 · 191 阅读 · 0 评论 -
第 2-3 课:抽象类和接口 + 面试题
抽象类定义在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。简单来说,使用关键字 abstract 修饰的类就叫做抽象类。抽象类使用示例代码,如下:abstract class AbstractAnimal { public AbstractAnimal() {...原创 2020-10-28 16:07:34 · 201 阅读 · 0 评论 -
第 2-4 课:克隆和序列化 + 面试题
克隆在开始学习克隆之前,我们先来看看下面的代码,普通的对象复制,存在什么问题?class CloneTest { public static void main(String[] args) throws CloneNotSupportedException { // 等号赋值( 基本类型) int number = 6; int num...原创 2020-10-28 16:07:34 · 196 阅读 · 0 评论 -
第 3-1 课:集合详解(上) + 面试题
先来看看集合的继承关系图,如下图所示:其中:外框为虚线的表示接口,边框为实线的表示类;箭头为虚线的表示实现了接口,箭头为实线的表示继承了类。为了方便理解,我隐藏了一些与本文内容无关的信息,隐藏的这些内容会在后面的章节中进行详细地介绍。从图中可以看出,集合的根节点是 Collection,而 Collection 下又提供了两大常用集合,分别是:List:使用最多的有序集合,提...原创 2020-10-28 16:07:35 · 268 阅读 · 0 评论 -
第 3-2 课:集合详解(下) + 面试题
集合有两个大接口:Collection 和 Map,本文重点来讲解集合中另一个常用的集合类型 Map。以下是 Map 的继承关系图:Map 简介Map 常用的实现类如下:Hashtable:Java 早期提供的一个哈希表实现,它是线程安全的,不支持 null 键和值,因为它的性能不如 ConcurrentHashMap,所以很少被推荐使用。HashMap:最常用的哈希表实现,如果程序...原创 2020-10-28 16:07:36 · 224 阅读 · 0 评论 -
第 3-3 课:泛型和迭代器 + 面试题
泛型1)为什么要用泛型?在泛型没有诞生之前,我们经常会遇到这样的问题,如以下代码所示:ArrayList arrayList = new ArrayList();arrayList.add("Java");arrayList.add(24);for (int i = 0; i < arrayList.size(); i++) { String str = (String)...原创 2020-10-28 16:07:36 · 248 阅读 · 0 评论 -
第 3-4 课:数据结构——队列详解 + 面试题
队列(Queue):与栈相对的一种数据结构, 集合(Collection)的一个子类。队列允许在一端进行插入操作,而在另一端进行删除操作的线性表,栈的特点是后进先出,而队列的特点是先进先出。队列的用处很大,比如实现消息队列。Queue 类关系图,如下图所示:注:为了让读者更直观地理解,上图为精简版的 Queue 类关系图。本文如无特殊说明,内容都是基于 Java 1.8 版本。 队列(Qu...原创 2020-10-28 16:07:37 · 264 阅读 · 0 评论 -
第 4-1 课:BIO、NIO、AIO 详解 + 面试题
IO 介绍IO 是 Input/Output 的缩写,它是基于流模型实现的,比如操作文件时使用输入流和输出流来写入和读取文件等。IO 分类传统的 IO,按照流类型我们可以分为:字符流字节流其中,字符流包括 Reader、Writer;字节流包括 InputStream、OutputStream。传统 IO 的类关系图,如下图所示:IO 使用了解了 IO 之间的关系,下面我们正...原创 2020-10-28 16:07:37 · 372 阅读 · 0 评论 -
第 4-2 课:反射和动态代理 + 面试题
反射反射机制是 Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect)的能力。简单来说就是通过反射,可以在运行期间获取、检测和调用对象的属性和方法。反射的使用场景在现实中反射的使用场景有很多,比如以下几个。使用场景一:编程工具 IDEA 或 Eclipse 等,在写代码时会有代码(属性或方法名)提示,就是因为使用了反射。使用场景二:很多知名的框架,为了让程序更优雅...原创 2020-10-28 16:07:38 · 376 阅读 · 0 评论 -
第 5-1 课:线程与死锁 + 面试题
线程介绍线程(Thread)是程序运行的执行单元,依托于进程存在。一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此线程之间的切换更加节省资源、更加轻量化,因而也被称为轻量级的进程。什么是进程进程(Processes)是程序的一次动态执行,是系统进行资源分配和调度的基本单位,是操作系统运行的基础,通常每一个进程都拥有自己独立的内存空间和系统资源。简单来说,进程可以被当...原创 2020-10-28 16:07:39 · 210 阅读 · 0 评论 -
第 5-2 课:线程池——ThreadPoolExecutor + 面试题
线程池介绍线程池(Thread Pool):把一个或多个线程通过统一的方式进行调度和重复使用的技术,避免了因为线程过多而带来使用上的开销。为什么要使用线程池?可重复使用已有线程,避免对象创建、消亡和过度切换的性能开销。避免创建大量同类线程所导致的资源过度竞争和内存溢出的问题。支持更多功能,比如延迟任务线程池(newScheduledThreadPool)和缓存线程池(newCached...原创 2020-10-28 16:07:39 · 235 阅读 · 0 评论 -
第 5-3 课:线程池——Executors + 面试题
线程池的创建分为两种方式:ThreadPoolExecutor 和 Executors,上一节学习了 ThreadPoolExecutor 的使用方式,本节重点来看 Executors 是如何创建线程池的。Executors 可以创建以下六种线程池。FixedThreadPool(n):创建一个数量固定的线程池,超出的任务会在队列中等待空闲的线程,可用于控制程序的最大并发数。CachedTh...原创 2020-10-28 16:07:40 · 211 阅读 · 0 评论 -
第 5-4 课:ThreadLocal 详解 + 面试题
什么是 ThreadLocal?ThreadLocal 诞生于 JDK 1.2,用于解决多线程间的数据隔离问题。也就是说 ThreadLocal 会为每一个线程创建一个单独的变量副本。ThreadLocal 有什么用?ThreadLocal 最典型的使用场景有两个:ThreadLocal 可以用来管理 Session,因为每个人的信息都是不一样的,所以就很适合用 ThreadLocal ...原创 2020-10-28 16:07:40 · 315 阅读 · 0 评论 -
第 5-5 课:线程安全——synchronized 和 ReentrantLock + 面试题
前面我们介绍了很多关于多线程的内容,在多线程中有一个很重要的课题需要我们攻克,那就是线程安全问题。线程安全问题指的是在多线程中,各线程之间因为同时操作所产生的数据污染或其他非预期的程序运行结果。线程安全1)非线程安全事例比如 A 和 B 同时给 C 转账的问题,假设 C 原本余额有 100 元,A 给 C 转账 100 元,正在转的途中,此时 B 也给 C 转了 100 元,这个时候 A 先...原创 2020-10-28 16:07:41 · 218 阅读 · 0 评论 -
第 5-6 课:Java 并发包中的高级同步工具 + 面试题
Java 中的并发包指的是 java.util.concurrent(简称 JUC)包和其子包下的类和接口,它为 Java 的并发提供了各种功能支持,比如:提供了线程池的创建类 ThreadPoolExecutor、Executors 等;提供了各种锁,如 Lock、ReentrantLock 等;提供了各种线程安全的数据结构,如 ConcurrentHashMap、LinkedBlock...原创 2020-10-28 16:07:41 · 233 阅读 · 0 评论 -
第 5-7 课:Java 中的各种锁和 CAS + 面试题
如果说快速理解多线程有什么捷径的话,那本文介绍的各种锁无疑是其中之一,它不但为我们开发多线程程序提供理论支持,还是面试中经常被问到的核心面试题之一。因此下面就让我们一起深入地学习一下这些锁吧。乐观锁和悲观锁悲观锁和乐观锁并不是某个具体的“锁”而是一种并发编程的基本概念。乐观锁和悲观锁最早出现在数据库的设计当中,后来逐渐被 Java 的并发包所引入。悲观锁悲观锁认为对于同一个数据的并发操作,...原创 2020-10-28 16:07:42 · 185 阅读 · 0 评论 -
第 6-1 课:Spring 核心 + 面试题
Spring Framework 简称 Spring,是 Java 开发中最常用的框架,地位仅次于 Java API,就连近几年比较流行的微服务框架 SpringBoot,也是基于 Spring 实现的,SpringBoot 的诞生是为了让开发者更方便地使用 Spring,因此 Spring 在 Java 体系中的地位可谓首屈一指。当然,如果想要把 Spring 所有功能都讲的一清二楚,远远不是一...原创 2020-10-28 16:07:43 · 365 阅读 · 0 评论 -
第 6-2 课:SpringMVC 核心 + 面试题
Spring MVC 介绍Spring MVC(Spring Web MVC)是 Spring Framework 提供的 Web 组件,它的实现基于 MVC 的设计模式:Controller(控制层)、Model(模型层)、View(视图层),提供了前端路由映射、视图解析等功能,让 Java Web 开发变得更加简单,也属于 Java 开发中必须要掌握的热门框架。执行流程Spring MV...原创 2020-10-28 16:07:43 · 332 阅读 · 0 评论 -
第 6-3 课:SpringBoot 核心 + 面试题
为什么要用 Spring Boot?Spring Boot 来自于 Spring 大家族,是 Spring 官方团队(Pivotal 团队)提供的全新框架,它的诞生解决了 Spring 框架使用较为繁琐的问题。Spring Boot 的核心思想是约定优于配置,让开发人员不需要配置任何 XML 文件,就可以像 Maven 整合 Jar 包一样,整合并使用所有框架。Spring Boot 特性...原创 2020-10-28 16:07:44 · 320 阅读 · 0 评论 -
第 6-4 课:MyBatis 核心和面试题(上)
MyBatis 介绍MyBatis 是一款优秀的 ORM(Object Relational Mapping,对象关系映射)框架,它可以通过对象和数据库之间的映射,将程序中的对象自动存储到数据库中。它是 Apache 提供的一个开源项目,之前的名字叫做 iBatis,2010 年迁移到了 Google Code,并且将名字改为我们现在所熟知的 MyBatis,又于 2013 年 11 月迁移到了...原创 2020-10-28 16:07:44 · 236 阅读 · 0 评论 -
第 6-6 课:消息队列面试题汇总
1.消息队列的应用场景有哪些?答:消息队列的应用场景如下。应用解耦,比如,用户下单后,订单系统需要通知库存系统,假如库存系统无法访问,则订单减库存将失败,从而导致订单失败。订单系统与库存系统耦合,这个时候如果使用消息队列,可以返回给用户成功,先把消息持久化,等库存系统恢复后,就可以正常消费减去库存了。削峰填谷,比如,秒杀活动,一般会因为流量过大,从而导致流量暴增,应用挂掉,这个时候加上消息...原创 2020-10-28 16:07:45 · 204 阅读 · 0 评论 -
第 6-7 课:Java 分布式框架面试题合集
1.什么是 ZooKeeper?答:ZooKeeper 是一个开源的分布式应用程序协调服务,是一个典型的分布式数据一致性解决方案。设计目的是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的系统,并以一系列简单易用的原子操作提供给用户使用。2.ZooKeeper 提供了哪些功能?答:ZooKeeper 主要提供以下功能:分布式服务注册与订阅:在分布式环境中,为了保证高可用...原创 2020-10-28 16:07:46 · 283 阅读 · 0 评论 -
MySQL 面试题汇总
1.说一下 MySQL 执行一条查询语句的内部执行过程?答:MySQL 执行一条查询的流程如下:客户端先通过连接器连接到 MySQL 服务器;连接器权限验证通过之后,先查询是否有查询缓存,如果有缓存(之前执行过此语句)则直接返回缓存数据,如果没有缓存则进入分析器;分析器会对查询语句进行语法分析和词法分析,判断 SQL 语法是否正确,如果查询语法错误会直接返回给客户端错误信息,如果语法正确...原创 2020-10-28 16:07:47 · 1157 阅读 · 0 评论 -
Redis 面试题汇总
1.Redis 使用场景有哪些?答:Redis 使用场景如下:记录帖子点赞数、点击数、评论数缓存近期热帖缓存文章详情信息记录用户会话信息2.Redis 有哪些功能?答:Redis 功能如下:数据缓存功能分布式锁的功能支持数据持久化支持事务支持消息队列3.Redis 支持哪些数据类型?答:Redis 支持的数据类型如下:String 字符串List 列表S...原创 2020-10-28 16:07:47 · 183 阅读 · 0 评论 -
设计模式常见面试题汇总
1.说一下设计模式?你都知道哪些?答:设计模式总共有 23 种,总体来说可以分为三大类:创建型模式( Creational Patterns )、结构型模式( Structural Patterns )和行为型模式( Behavioral Patterns )。分类包含关注点创建型模式工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式关注于对象的创建,同时隐藏创建逻...原创 2020-10-28 16:07:48 · 649 阅读 · 0 评论 -
算法常用面试题汇总
1.说一下什么是二分法?使用二分法时需要注意什么?如何用代码实现?二分法查找(Binary Search)也称折半查找,是指当每次查询时,将数据分为前后两部分,再用中值和待搜索的值进行比较,如果搜索的值大于中值,则使用同样的方式(二分法)向后搜索,反之则向前搜索,直到搜索结束为止。二分法使用的时候需要注意:二分法只适用于有序的数据,也就是说,数据必须是从小到大,或是从大到小排序的。publi...原创 2020-10-28 16:07:48 · 201 阅读 · 0 评论 -
JVM 面试题汇总
1.什么是 JVM?它有什么作用?答:JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,顾名思义它是一个虚拟计算机,也是 Java 程序能够实现跨平台的基础。它的作用是加载 Java 程序,把字节码翻译成机器码再交由 CPU 执行的一个虚拟计算器。2.JVM 主要组成部分有哪些?答:JVM 主要组成部分如下:类加载器(ClassLoader)运行时数据区(...原创 2020-10-28 16:07:49 · 1563 阅读 · 0 评论 -
常见面试题翻车合集
1.去掉 main 方法的 static 修饰符,程序会怎样?A:程序无法编译B:程序正常编译,正常运行C:程序正常编译,正常运行一下马上退出D:程序正常编译,运行时报错答:D题目解析:运行时异常如下: 错误: main 方法不是类 xxx 中的 static, 请将 main 方法定义为: public static void main(String[] args)2....原创 2020-10-28 16:07:50 · 225 阅读 · 0 评论 -
结语|日拱一卒无有尽,功不唐捐终入海
到今天为止,我们已经共同阅读了 40 篇文章,共计 13 万字、505 道面试题,这些面试题由浅入深,系统地把 Java 面试中,可能遇到的所有知识点都囊括了。这个系列的面试课程,也汇聚了我作为面试官这 4 年的经验,同时为了写好这门课程,我联系了 20 多个面试官朋友,只为给大家提供更优质的内容。当然,千人千面,每个面试官的知识体系和擅长的技术点都是不同的,因此即使熟知了这五百多道面试题,依然...原创 2020-10-28 16:07:51 · 400 阅读 · 0 评论 -
加餐 | Java 面试通关攻略
面试分为三个重要的阶段:面试前准备面试中表现面试后复盘做好这三个阶段的准备,相信一定会有很大的收获。下面来分别看看这三个阶段需要准备哪些内容。一. 面试前准备1. 研究待面试的公司所谓知己知彼方能百战不殆,对待面试同样如此,企业希望招聘的人能够直接上手工作,因此会招聘那些和他们技术栈和业务方向相同或相似的应聘者。了解了这个信息,会为我们的面试提高成功几率,那怎么才能获得这些信息...原创 2020-10-28 16:07:51 · 383 阅读 · 0 评论 -
第 6-5 课:MyBatis 核心和面试题(下)
MyBatis 最初的设计是基于 XML 配置文件的,但随着 Java 的发展(Java 1.5 开始引入注解)和 MyBatis 自身的迭代升级,终于在 MyBatis 3 之后就开始支持基于注解的开发了。下面我们使用 Spring Boot + MyBatis 注解的方式,来实现对数据库的基本操作,具体实现步骤如下。MyBatis 注解版1)创建数据表drop table if exi...原创 2020-10-28 16:07:52 · 216 阅读 · 0 评论