![](https://img-blog.csdnimg.cn/20190918140213434.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java面试
姜皓
胸藏文墨怀若谷 腹有诗书气自华
展开
-
Java 源码剖析(25)--生产环境如何排除和优化 JVM
垃圾回收算法1)如何判断一个对象是否“死亡”2)垃圾回收的算法有哪些?3)GC Roots死亡对象判断说到 Java 虚拟机不得不提的一个词就是 “垃圾回收”(GC,Garbage Collection),而垃圾回收的执行速度则影响着整个程序的执行效率。1)如何判断一个对象是否“死亡”垃圾回收器首先要做的就是,判断一个对象是存活状态还是死亡状态,死亡的对象将会被标识为垃圾数据并等待收集器进行清除。判断一个对象是否为死亡状态的常用算法有两个:引用计数器算法和可达性分析算法。引用计数算法(Refere原创 2020-09-23 15:51:28 · 326 阅读 · 0 评论 -
Java 源码剖析(23)--JVM 的内存布局和运行原理
JVM 的内存布局和运行原理1)JVM 的内存布局1.1)堆1.2)方法区1.3)程序计数器1.4)虚拟机栈1.5) 本地方法栈2)类的生命周期2.1)加载阶段2.2) 验证阶段2.3)准备阶段2.4)解析阶段2.5) 初始化JVM(Java Virtual Machine,Java 虚拟机)顾名思义就是用来执行 Java 程序的“虚拟主机”,实际的工作是将编译的 class 代码(字节码)翻译成底层操作系统可以运行的机器码并且进行调用执行,这也是 Java 程序能够“一次编写,到处运行”的原因(因为它会原创 2020-09-13 10:55:40 · 198 阅读 · 0 评论 -
Java 源码剖析(22)--Redis 如何实现高可用
Redis 如何实现高可用1)实现高可用的方式1.1)数据持久化1.2)Redis 主从同步1.3)Redis 哨兵模式1.4)Redis 集群2)小结1)实现高可用的方式Redis 高可用的手段主要有以下四种:数据持久化主从数据同步(主从复制)Redis 哨兵模式(Sentinel)Redis 集群(Cluster)其中数据持久化保证了系统在发生宕机或者重启之后数据不会丢失,增加了系统的可靠性和减少了系统不可用的时间(省去了手动恢复数据的过程);而主从数据同步可以将数据存储至多台服务器原创 2020-08-24 11:33:56 · 150 阅读 · 0 评论 -
Java 源码剖析(21)--Redis 如何实现消息队列
Redis 如何实现消息队列1)实现消息队列的方式2)使用 List 实现消息队列3)使用 Stream 实现消息队列1)实现消息队列的方式在 Redis 中实现消息队列的方式有几种?早在 Redis 2.0 版本之前使用 Redis 实现消息队列的方式有两种:使用 List 类型实现使用 ZSet 类型实现其中使用List 类型实现的方式最为简单和直接,它主要是通过 lpush、rpop 存入和读取实现消息队列的,如下图所示:lpush 可以把最新的消息存储到消息队列(List 集合)原创 2020-08-19 14:46:48 · 384 阅读 · 0 评论 -
Java 源码剖析(20)--Redis 怎样实现分布式锁
Redis 怎样实现的分布式锁1) 分布式锁1.1) 分布式锁的常见实现方式:2)单机锁3)使用 Redis 实现分布式锁4)锁超时如果在分布式环境下使用就会出现锁不生效的问题,需要使用分布式锁来解决。1) 分布式锁分布式锁是控制分布式系统之间同步访问共享资源的一种方式,是为了解决分布式系统中,不同的系统或是同一个系统的不同主机共享同一个资源的问题,它通常会采用互斥来保证程序的一致性,这就是分布式锁的用途以及执行原理。分布式锁示意图如下图所示:1.1) 分布式锁的常见实现方式:基于 MySQL原创 2020-08-19 11:29:53 · 152 阅读 · 0 评论 -
Java 源码剖析(16)--浅谈MySQL 的运行机制
MySQL 的运行机制1) MySQL 是如何运行的2) 查询缓存的利弊3)如何选择数据库引擎4)InnoDB 自增主键5)小结1) MySQL 是如何运行的MySQL 的执行流程是这样的,首先客户端先要发送用户信息去服务器端进行授权认证。如果使用的是命令行工具,通常需要输入如下信息:mysql -h 主机名(IP) -u 用户名 -P 端口 -p其中:-h 表示要连接的数据库服务器的主机名或者 IP 信息;-u 表示数据库的用户名称;-P 表示数据库服务器的端口号,小写的 -p 表示原创 2020-07-21 11:00:53 · 129 阅读 · 0 评论 -
Java 源码剖析(15)--MQ 的作用及特点
MQ 的作用及特点1) MQ 的作用1.1) 使用 MQ 实现消息通讯1.2) 使用 MQ 实现日志系统2) MQ 的特点及注意事项2.1)MQ 的特点2.2)引入 MQ 系统会带来的问题3) 常用的 MQ 中间件3.1)Redis 轻量级的消息中间件3.2)RabbitMQ3.3)Kafka3.4)Kafka VS RabbitMQ1) MQ 的作用MQ 可以用来实现削峰填谷,也就是使用它可以解决短时间内爆发式的请求任务,在不使用 MQ 的情况下会导致服务处理不过来,出现应用程序假死的情况,而使用了原创 2020-07-20 21:00:25 · 876 阅读 · 0 评论 -
Java 源码剖析(14)--SpringBoot 有哪些优点
SpringBoot的优点及与Spring 的区别1)Spring Boot 的优点1.1)更快速的构建能力1.2)起步依赖1.3)内嵌容器支持1.4)Actuator 监控2)知识扩展2.1)Spring Boot 启动源码分析2.2)Spring Boot 的启动流程3)小结1)Spring Boot 的优点作为 Java 开发人员对 Spring 框架都很熟悉,Spring 为 Java 程序提供了全面的基础架构支持,包含了很多非常实用的功能,如 Spring JDBC、Spring AOP、Sp原创 2020-07-20 20:26:28 · 515 阅读 · 0 评论 -
Java 源码剖析(13)--MyBatis 使用了哪些设计模式?
MyBatis 使用了哪些设计模式1)简介2)工厂模式3)建造者模式(Builder)4)单例模式5)适配器模式6)代理模式7)模板方法模式8)装饰器模式1)简介MyBatis 的前身是 IBatis,IBatis 是由 Internet 和 Abatis 组合而成,其目的是想当做互联网的篱笆墙,围绕着数据库提供持久化服务的一个框架,2010 年正式改名为 MyBatis。它是一款优秀的持久层框架,支持自定义 SQL、存储过程及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取原创 2020-07-17 19:53:33 · 370 阅读 · 0 评论 -
Java 源码剖析(12)--浅谈 Spring IoC 和 DI
浅谈 Spring IoC 和 DI1)Spring IoC2)DI3)知识扩展3.1)Spring IoC 的优点3.2)Spring IoC 注入方式汇总3.3)Spring AOP1)Spring IoCIoC(Inversion of Control,翻译为“控制反转”)不是一个具体的技术,而是一种设计思想。与传统控制流相比,IoC 会颠倒控制流,在传统的编程中需要开发者自行创建并销毁对象,而在 IoC 中会把这些操作交给框架来处理,这样开发者就不用关注具体的实现细节了,拿来直接用就可以了,这就原创 2020-07-11 17:39:35 · 189 阅读 · 0 评论 -
Java 源码剖析(11)--Spring Bean 的作用域和注册方式
Spring Bean 的作用域和注册方式1)Spring Bean 的注册方式2)Spring Bean 的作用域3)知识扩展3.1)同名 Bean 问题3.2)Bean 生命周期1)Spring Bean 的注册方式在 Spring 容器中管理一个或多个 Bean,这些 Bean 的定义表示为 BeanDefinition 对象,这些对象包含以下重要信息:Bean 的实际实现类Bean 的作用范围Bean 的引用或者依赖项Bean 的注册方式有三种:1)XML 配置文件的注册方式原创 2020-07-11 17:03:46 · 247 阅读 · 0 评论 -
Java 源码剖析(10)--手写一个消息队列和延迟消息队列
手写一个消息队列和延迟消息队列1)消息队列的使用场景1.1)商品秒杀1.2)系统解耦1.3)日志记录2)消息中间件 RabbitMQ3)手写一个消息队列和延迟消息队列1)消息队列的使用场景1.1)商品秒杀在做秒杀活动时,会发生短时间内出现爆发式的用户请求,如果不采取相关的措施,会导致服务器忙不过来,响应超时的问题,轻则会导致服务假死,重则会让服务器直接宕机,给用户带来的体验也非常不好。如果这个时候加上了消息队列,服务器接收到用户的所有请求后,先把这些请求全部写入到消息队列中再排队处理,这样就不会导致同原创 2020-07-11 15:53:14 · 1264 阅读 · 0 评论 -
Java 源码剖析(09)--如何实现本地缓存和分布式缓存
如何实现本地缓存和分布式缓存1)本地缓存和分布式缓存1.1)本地缓存1.1)分布式缓存2)知识扩展2.1)EhCache 和 Guava 的使用及特点分析2.2)LRU 和 LFU 的区别3)EhCache 基础使用4)手动实现一个缓存系统5)小结缓存(Cache) 是指将程序或系统中常用的数据对象存储在像内存这样特定的介质中,以避免在每次程序调用时,重新创建或组织数据所带来的性能损耗,从而提高了系统的整体运行速度。以目前的系统架构来说,用户的请求一般会先经过缓存系统,如果缓存中没有相关的数据,就会在其原创 2020-07-09 19:34:22 · 900 阅读 · 0 评论 -
Java 源码剖析(08)--如何实现动态代理
如何实现动态代理1)动态代理是如何实现的?2)JDK Proxy 和 CGLib 的使用及代码分析2.1)JDK Proxy 动态代理实现2.2)CGLib 的实现2.2)Lombok 原理分析3)动态代理和静态代理的区别?4)小结动态代理是程序在运行期间动态构建代理对象和动态调用代理方法的一种机制,如何实现动态代理?JDK Proxy 和 CGLib 有什么区别?1)动态代理是如何实现的?动态代理的常用实现方式是反射。反射机制是指程序在运行期间可以访问、检测和修改其本身状态或行为的一种能力,使用反射原创 2020-07-02 17:39:43 · 212 阅读 · 0 评论 -
Java 源码剖析(07)--简述深克隆和浅克隆
深克隆和浅克隆的实现原理1)深克隆和浅克隆的区别2)知识扩展2.1)clone() 源码分析2.2)Arrays.copyOf()2.3)深克隆实现方式汇总2.3.1)所有对象都实现克隆2.3.2)通过构造方法实现深克隆2.3.3)通过字节流实现深克隆2.3.4)通过第三方工具实现深克隆2.3.5)通过 JSON 工具类实现深克隆3)克隆设计理念猜想4)小结使用克隆可以为我们快速地构建出一个已有对象的副本,它属于 Java 基础的一部分,什么是浅克隆和深克隆?如何实现克隆?1)深克隆和浅克隆的区别浅克原创 2020-07-02 14:42:13 · 284 阅读 · 0 评论 -
Java 源码剖析(06)--synchronized 和 ReentrantLock 的实现原理
synchronized 和 ReentrantLock 的实现原理1)synchronized 和 ReentrantLock的区别2)知识扩展2.1)ReentrantLock 源码分析2.2)公平锁 VS 非公平锁3)JDK 1.6 锁优化3.1)自适应自旋锁3.2)锁升级4)小结在 JDK 1.5 之前共享对象的协调机制只有 synchronized 和 volatile,在 JDK 1.5 中增加了新的机制 ReentrantLock,该机制的诞生并不是为了替代 synchronized,而是在原创 2020-07-01 17:04:16 · 167 阅读 · 0 评论 -
Java 源码剖析(05)--浅谈对锁的理解
浅谈对锁的理解1)死锁2)知识扩展2.1)悲观锁和乐观锁2.2)可重入锁2.3)共享锁和独占锁3)小结在并发编程中有两个重要的概念:线程和锁,多线程是一把双刃剑,它在提高程序性能的同时,也带来了编码的复杂性,对开发者的要求也提高了一个档次。而锁的出现就是为了保障多线程在同时操作一组资源时的数据一致性,当我们给资源加上锁之后,只有拥有此锁的线程才能操作此资源,而其他线程只能排队等待使用此锁。1)死锁锁是指在并发编程中,当有多个线程同时操作一个资源时,为了保证数据操作的正确性,我们需要让多线程排队一个一个原创 2020-06-30 17:44:50 · 307 阅读 · 0 评论 -
Java 源码剖析(04)--详解 ThreadPoolExecutor 的参数含义
详解 ThreadPoolExecutor1)ThreadPoolExecutor 的参数含义2)线程池任务执行的主要流程3)知识扩展3.1)execute() 和 submit() 的区别3.2)线程池的拒绝策略3.3)自定义拒绝策略3.4)ThreadPoolExecutor 扩展4)总结线程池是为了避免线程频繁的创建和销毁带来的性能消耗,而建立的一种池化技术,它是把已创建的线程放入“池”中,当有任务来临时就可以重用已有的线程,无需等待创建的过程,这样就可以有效提高程序的响应速度。但如果要说线程池的话原创 2020-06-29 21:01:33 · 312 阅读 · 0 评论 -
Java 源码剖析(03)--线程的状态有哪些?
线程的状态有哪些?1)线程是如何工作的?2)知识扩展2.1)BLOCKED 和 WAITING 的区别2.2)start() 和 run() 的区别2.3)线程优先级2.4)线程的常用方法线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在。一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此线程之间的切换更加节省资源、更加轻量化,也因此被称为轻量级的进程。1)线程是如何工作的?线程的状态在 JDK 1.5 之后以枚举的方式被定义在 Thread 的源码原创 2020-06-28 20:59:57 · 740 阅读 · 0 评论 -
Java 源码剖析(02)--HashMap 底层实现原理是什么?
HashMap 底层实现原理是什么?1)HashMap 底层实现2)知识扩展2.1)HashMap 源码分析2.2)什么是加载因子?2.2)HashMap 死循环分析3)总结1)HashMap 底层实现在 JDK 1.7 中 HashMap 是以数组加链表的形式组成的,JDK 1.8 之后新增了红黑树的组成结构,当链表大于 8 并且哈希桶的容量大于 64 时,链表结构会转换成红黑树结构,它的组成结构如下图所示:数组中的元素我们称之为哈希桶,它的定义如下:static class Node<K原创 2020-06-26 16:41:12 · 197 阅读 · 0 评论 -
Java 源码剖析(01)--String 的特点是什么?
String 的特点是什么?1)String 有哪些重要的方法1.1)多构造方法1.2)equals() 比较两个字符串是否相等1.3) compareTo() 比较两个字符串1.4) 其他重要方法2)知识扩展2.1)== 和 equals 的区别2.2)final 修饰的好处2.3)String 和 StringBuilder、StringBuffer 的区别2.4)String 和 JVM1)String 有哪些重要的方法以主流的 JDK 版本 1.8 来说,String 内部实际存储结构为 cha原创 2020-06-25 18:03:41 · 203 阅读 · 0 评论 -
Java--【Java容器】ArrayList全解析
ArrayList全解析一、ArrayList结构图ArrayList 是 java 集合框架中比较常用的数据结构了,继承自 AbstractList,实现了 List 接口。底层基于数组实现容量大小动态变化,允许 null 的存在,同时还实现了 RandomAccess、Cloneable、Serializable 接口,所以ArrayList 是支持快速访问、复制、序列化的。...转载 2019-10-23 16:14:02 · 376 阅读 · 0 评论 -
Java--【面向对象】int与Integer的区别
int与Integer的区别一、int与Integer的基本使用对比 Integer是 int 的包装类;int 是基本数据类型; Integer变量必须实例化后才能使用;int 变量不需要; Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ; Integer的默认值是null;int的默认值是0。 二、int与...转载 2019-10-22 21:31:22 · 206 阅读 · 0 评论 -
Java--【面向对象】Java中重载与重写的区别
Java中重载与重写的区别一、重载(Overloading) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载是一个类中多态性的一种表现。 Java的方法重载就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性...转载 2019-10-22 14:36:51 · 187 阅读 · 0 评论 -
Java--【面向对象】Java中==, equals 和 hashCode 的区别与联系
Java中==、equals 和 hashCode 的区别与联系一、概述概念: == : 该操作符生成的是一个boolean结果,它计算的是操作数的值之间的关系 equals : Object 的 实例方法,比较两个对象的content是否相同 hashCode : Object 的 native方法, 获取对象的哈希值,用于确定该对象在哈希表中的索引位置,它实...转载 2019-10-22 13:50:55 · 566 阅读 · 0 评论 -
Java--【面向对象】Java的反射机制
Java的反射机制反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法称为java语言的反射机制。【翻译于 官方文档】本篇将从以下几个方面讲述反射的知识: class的使用 方法的反射 构造函数的反射 成员变量的反射 一、什么是class类...转载 2019-10-22 13:22:32 · 133 阅读 · 0 评论 -
Java--【面向对象】最全面的泛型详解
最全面的泛型详解泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。泛型的本质:为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参...转载 2019-10-22 10:56:21 · 277 阅读 · 0 评论 -
Java--【面向对象】内部类和静态内部类的区别
内部类和静态内部类的区别定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现特定的接口。外部类按常规的类访问方式使用内部类,唯一的差别是外部类可以访问内部类的所有方法与属性,包括私有方法与属性创建...转载 2019-10-22 10:06:33 · 359 阅读 · 0 评论 -
Java--【面向对象】final、finally和finalize的区别
final、finally和finalize的区别final根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。 final类不能被继承,没有子类,final类中的方法默认是final的。 final方法不能被子类的方法覆盖,但可以被继承。 f...转载 2019-10-21 15:20:46 · 166 阅读 · 0 评论 -
Java--【面向对象】Java面向对象六大原则
Java向对象六大原则一、单一职责原则(Single-Resposibility Principle)"对一个类而言,应该仅有一个引起它变化的原因。"本原则是我们非常熟悉地"高内聚性原则"的引申,但是通过将"职责"极具创意地定义为"变化的原因",使得本原则极具操作性,尽显大师风范。同时,本原则还揭示了内聚性和耦合生,基本途径就是提高内聚性;如果一个类承担的职责过多,那么这些职责就会相互...转载 2019-10-21 14:28:15 · 158 阅读 · 0 评论 -
Java--【面向对象】Java面向对象的特征
Java面向对象的特征面向对象的三个基本特征是:封装、继承、多态。一、封装封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。封装:就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装的优点: 将变化隔离 便于使用 提高重用性 提高安全性 封装的缺点:将变量等使用...转载 2019-10-21 14:16:58 · 145 阅读 · 0 评论