09 Java面试总结
文章
07.深克隆和浅克隆有什么区别?它的实现方式有哪些?
深克隆和浅克隆有什么区别?它的实现方式有哪些?使用克隆可以为我们快速地构建出一个已有对象的副本,它属于 Java 基础的一部分,也是面试中常被问到的知识点之一。 我们本课时的面试题是,什么是浅克隆和深克隆?如何实现克隆? 典型回答浅克隆(Shadow Clone)是把原型对象中成员变量为值类型的属性都复制给克隆对象,把原型对象中成员变量为引用类型的引用地址也复制给克隆对象,也就是原型对象中如果有成员变量为引用对象,则此引用对象的地址是共享给原型对象和克隆对象的。 简单来说就是浅克隆只会复制原型对象,但不会复制它所引用的对象,如下图所示: 深克隆(Deep Clone)是将原型对象中的所有类型,无论是值类型还是引用类型,都复制一份给克隆对象,也就是说深克隆会把原型对象和原型对象所引用的对象,都复制一份给克隆对象,如下图所示: 在 Java 语言中要实现克隆则需要实现 Cloneable 接口,并重写 Object 类中的 clone() 方法,实现代码如下: 123456789101112131415161718192021222324252627282930313233343...
08.动态代理是如何实现的?JDK Proxy 和 CGLib 有什么区别?
动态代理是如何实现的?JDK Proxy 和 CGLib 有什么区别?90% 的程序员直接或者间接的使用过动态代理,无论是日志框架或 Spring 框架,它们都包含了动态代理的实现代码。动态代理是程序在运行期间动态构建代理对象和动态调用代理方法的一种机制。 我们本课时的面试题是,如何实现动态代理?JDK Proxy 和 CGLib 有什么区别? 典型回答动态代理的常用实现方式是反射。反射机制是指程序在运行期间可以访问、检测和修改其本身状态或行为的一种能力,使用反射我们可以调用任意一个类对象,以及类对象中包含的属性及方法。 但动态代理不止有反射一种实现方式,例如,动态代理可以通过 CGLib 来实现,而 CGLib 是基于 ASM(一个 Java 字节码操作框架)而非反射实现的。简单来说,动态代理是一种行为方式,而反射或 ASM 只是它的一种实现手段而已。 JDK Proxy 和 CGLib 的区别主要体现在以下几个方面: JDK Proxy 是 Java 语言自带的功能,无需通过加载第三方类实现; Java 对 JDK Proxy 提供了稳定的支持,并且会持续的升级和更新 JD...
09.如何实现本地缓存和分布式缓存?
如何实现本地缓存和分布式缓存?缓存(Cache) 是指将程序或系统中常用的数据对象存储在像内存这样特定的介质中,以避免在每次程序调用时,重新创建或组织数据所带来的性能损耗,从而提高了系统的整体运行速度。 以目前的系统架构来说,用户的请求一般会先经过缓存系统,如果缓存中没有相关的数据,就会在其他系统中查询到相应的数据并保存在缓存中,最后返回给调用方。 缓存既然如此重要,那本课时我们就来重点看一下,应该如何实现本地缓存和分布式缓存? 典型回答本地缓存是指程序级别的缓存组件,它的特点是本地缓存和应用程序会运行在同一个进程中,所以本地缓存的操作会非常快,因为在同一个进程内也意味着不会有网络上的延迟和开销。 本地缓存适用于单节点非集群的应用场景,它的优点是快,缺点是多程序无法共享缓存,比如分布式用户 Session 会话信息保存,由于每次用户访问的服务器可能是不同的,如果不能共享缓存,那么就意味着每次的请求操作都有可能被系统阻止,因为会话信息只保存在某一个服务器上,当请求没有被转发到这台存储了用户信息的服务器时,就会被认为是非登录的违规操作。 除此之外,无法共享缓存可能会造成系统资源的浪费...
10.如何手写一个消息队列和延迟消息队列?
如何手写一个消息队列和延迟消息队列?第一次听到“消息队列”这个词时,不知你是不是和我反应一样,感觉很高阶很厉害的样子,其实当我们了解了消息队列之后,发现它与普通的技术类似,当我们熟悉之后,也能很快地上手并使用。 我们本课时的面试题是,消息队列的使用场景有哪些?如何手动实现一个消息队列和延迟消息队列? 典型回答消息队列的使用场景有很多,最常见的使用场景有以下几个。 1.商品秒杀比如,我们在做秒杀活动时,会发生短时间内出现爆发式的用户请求,如果不采取相关的措施,会导致服务器忙不过来,响应超时的问题,轻则会导致服务假死,重则会让服务器直接宕机,给用户带来的体验也非常不好。如果这个时候加上了消息队列,服务器接收到用户的所有请求后,先把这些请求全部写入到消息队列中再排队处理,这样就不会导致同时处理多个请求的情况;如果消息队列长度超过可以承载的最大数量,那么我们可以抛弃当前用户的请求,通知前台用户“页面出错啦,请重新刷新”等提示,这样就会有更好的交互体验。 2.系统解耦使用了消息队列之后,我们可以把系统的业务功能模块化,实现系统的解耦。例如,在没有使用消息队列之前,当前台用户完善了个人信息之...
11.底层源码分析Spring的核心功能和执行流程(上)
底层源码分析 Spring 的核心功能和执行流程(上)Spring Framework 已是公认的 Java 标配开发框架了,甚至还有人说 Java 编程就是面向 Spring 编程的,可见 Spring 在整个 Java 体系中的重要位置。 Spring 中包含了众多的功能和相关模块,比如 spring-core、spring-beans、spring-aop、spring-context、spring-expression、spring-test 等,本课时先从面试中必问的问题出发,来帮你更好的 Spring 框架。 我们本课时的面试题是,Spring Bean 的作用域有哪些?它的注册方式有几种? 典型回答在 Spring 容器中管理一个或多个 Bean,这些 Bean 的定义表示为 BeanDefinition 对象,这些对象包含以下重要信息: Bean 的实际实现类 Bean 的作用范围 Bean 的引用或者依赖项 Bean 的三种注册方式 XML 配置文件的注册方式 Java 注解的注册方式 Java API 的注册方式 1. XML 配置文件注册方式1234&...
12.底层源码分析 Spring 的核心功能和执行流程(下)
底层源码分析 Spring 的核心功能和执行流程(下)上一课时我们讲了 Bean 相关的内容,它其实也是属于 IOC 的具体实现之一,本课时我们就来讲讲 Spring 中其他几个高频的面试点,希望能起到抛砖引玉的作用,能为你理解 Spring 打开一扇门。因为 Spring 涉及的内容和知识点太多了,用它来写一本书也绰绰有余,因此这里我们只讲核心的内容,希望下来你能查漏补缺,完善自己的 Spring 技术栈。 我们本课时的面试题是,谈一谈你对 IOC 和 DI 的理解。 典型回答IOC(Inversion of Control,翻译为“控制反转”)不是一个具体的技术,而是一种设计思想。与传统控制流相比,IOC 会颠倒控制流,在传统的编程中需要开发者自行创建并销毁对象,而在 IOC 中会把这些操作交给框架来处理,这样开发者就不用关注具体的实现细节了,拿来直接用就可以了,这就是控制反转。 IOC 很好的体现出了面向对象的设计法则之一——好莱坞法则:“别找我们,我们找你”。即由 IOC 容器帮对象找到相应的依赖对象并注入,而不是由对象主动去找。 举个例子,比如说传统找对象,先要设定好你...
13.MyBatis使用了哪些设计模式?在源码中是如何体现的?
MyBatis 使用了哪些设计模式?在源码中是如何体现的?MyBatis 的前身是 IBatis,IBatis 是由 Internet 和 Abatis 组合而成,其目的是想当做互联网的篱笆墙,围绕着数据库提供持久化服务的一个框架,2010 年正式改名为 MyBatis。它是一款优秀的持久层框架,支持自定义 SQL、存储过程及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作,还可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Ordinary Java Object,普通 Java 对象)为数据库中的记录。 关于 MyBatis 的介绍与使用,官方已经提供了比较详尽的中文参考文档,可点击这里查看,而本课时则以面试的角度出发,聊一聊不一样的知识点,它也是 MyBatis 比较热门的面试题之一,MyBatis 使用了哪些设计模式?在源码中是如何体现的? 注意:本课时使用的 MyBatis 源码为 3.5.5。 典型回答1.工厂模式工厂模式想必都比较熟悉,它是 Java 中最常用的设计模式之一。工厂模式就...
14.SpringBoot有哪些优点?它和Spring有什么区别?
SpringBoot 有哪些优点?它和 Spring 有什么区别?Spring 和 Spring Boot 的区别很多新手容易搞混,从这道简单的面试题也可以很轻易试探出你的 Java 基础功底,如果连这个问题都答不上来的话,通常就没有什么下文了,因为这已经是用人单位对面试者的最低要求了,所以本课时我们就来看一下二者的区别,以及 Spring Boot 的特性。 我们本课时的面试题是,Spring 和 Spring Boot 有什么区别?Spring Boot 的优点有哪些? 典型回答作为 Java 开发人员对 Spring 框架都很熟悉,Spring 为 Java 程序提供了全面的基础架构支持,包含了很多非常实用的功能,如 Spring JDBC、Spring AOP、Spring ORM、Spring Test 等,这些模块的出现,大大的缩短了应用程序的开发时间,同时提高了应用开发的效率。 Spring Boot 本质上是 Spring 框架的延伸和扩展,它的诞生是为了简化 Spring 框架初始搭建以及开发的过程,使用它可以不再依赖 Spring 应用程序中的 XML 配置,...
15.MQ有什么作用?你都用过哪些MQ中间件
MQ 有什么作用?你都用过哪些 MQ 中间件?在第10篇中讲过“手写消息队列”,当时粗略的讲了 Java API 中使用 Queue 实现自定义消息队列,以及使用 Delayed 实现延迟队列的示例;同时还讲了 RabbitMQ 中的一些基础概念。本课时我们将会更加深入的讲解 MQ(Message Queue,消息队列)中间件,以及这些热门中间件的具体使用。 我们本课时的面试题是,MQ 常见的使用场景有哪些?你都用过哪些 MQ 中间件? 典型回答在介绍 MQ 的使用场景之前,先来回忆一下 MQ 的作用。MQ 可以用来实现削峰填谷,也就是使用它可以解决短时间内爆发式的请求任务,在不使用 MQ 的情况下会导致服务处理不过来,出现应用程序假死的情况,而使用了 MQ 之后可以把这些请求先暂存到消息队列中,然后进行排队执行,那么就不会出现应用程序假死的情况了,所以它的第一个应用就是商品秒杀以及产品抢购等使用场景,如下图所示: 使用 MQ 实现消息通讯使用 MQ 可以作为消息通讯的实现手段,利用它可以实现点对点的通讯或者多对多的聊天室功能。 点对点的消息通讯如下图所示: 多对多的消息通讯...
16.MySQL 的运行机制是什么?它有哪些引擎?
MySQL 的运行机制是什么?它有哪些引擎?数据库是 Java 程序员面试必问的知识点之一,它和 Java 的核心面试点共同组成了一个完整的技术面试。而数据库一般泛指的就是 MySQL,因为 MySQL 几乎占据了数据库的半壁江山,即使有些公司没有使用 MySQL 数据库,如果你对 MySQL 足够精通的话,也是会被他们录取的。因为数据库的核心与原理基本是相通的,所以有了 MySQL 的基础之后,再去熟悉其他数据库也是非常快的,那么接下来的几个课时就让我们好好的学习一下 MySQL。 我们本课时的面试题是,MySQL 是如何运行的?说一下它有哪些引擎? 典型回答MySQL 的执行流程是这样的,首先客户端先要发送用户信息去服务器端进行授权认证。如果使用的是命令行工具,通常需要输入如下信息: mysql -h 主机名(IP) -u 用户名 -P 端口 -p 其中: -h 表示要连接的数据库服务器的主机名或者 IP 信息; -u 表示数据库的用户名称; -P 表示数据库服务器的端口号, 小写的 -p 表示需要输入数据库的密码。 具体使用示例,如下图所示: 当输入正确密码之后可...














