logo资料库

Java面试题大全(备战2021).pdf

第1页 / 共218页
第2页 / 共218页
第3页 / 共218页
第4页 / 共218页
第5页 / 共218页
第6页 / 共218页
第7页 / 共218页
第8页 / 共218页
资料共218页,剩余部分请下载后查看
第一章:Java基础面试题
一、Java概述
1.1 何为编程
1.2 什么是Java
1.3 jdk1.5之后的三大版本
1.4 JVM、JRE和JDK的关系
1.5 什么是跨平台性?原理是什么
1.6 Java语言有哪些特点
1.7 什么是字节码?采用字节码的最大好处是什么
1.8 什么是Java程序的主类?应用程序和小程序的主类有何不同?
1.9 Java应用程序与小程序之间有那些差别?
1.10 Java和C++的区别
1.11 Oracle JDK 和 OpenJDK 的对比
二、基础语法
2.1 Java有哪些数据类型
2.2 switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上
2.3 用最有效率的方法计算 2 乘以 8
2.4 Math.round(11.5) 等于多少?Math.round(-11.5)等于多少
2.5 float f=3.4;是否正确
2.6 short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗
2.7 Java语言采用何种编码方案?有何特点?
2.8 什么Java注释
2.9 访问修饰符 public,private,protected,以及不写(默认)时的区别
2.10 &和&&的区别
2.11 Java 有没有 goto
2.12 final 有什么用?
2.13 final finally finalize区别
2.14 this关键字的用法
2.15 super关键字的用法
2.16 this与super的区别
2.17 static存在的主要意义
2.18 static的独特之处
2.19 static应用场景
2.20 static注意事项
2.21 break ,continue ,return 的区别及作用
2.22 在 Java 中,如何跳出当前的多重嵌套循环
三、面向对象
3.1 面向对象和面向过程的区别
3.2 面向对象的特征有哪些方面
3.3 什么是多态机制?Java语言是如何实现多态的?
3.4 面向对象五大基本原则是什么(可选)
3.5 抽象类和接口的对比
3.6 普通类和抽象类有哪些区别?
3.7 抽象类能使用 final 修饰吗?
3.8 创建一个对象用什么关键字?对象实例与对象引用有何不同?
3.9 成员变量与局部变量的区别有哪些
3.10 在Java中定义一个不做事且没有参数的构造方法的作用
3.11 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?
3.12 一个类的构造方法的作用是什么?若一个类没有声明构造方法,改程序能正确执行吗?为什么?
3.13 构造方法有哪些特性?
3.14 静态变量和实例变量区别
3.15 静态变量与普通变量区别
3.16 静态方法和实例方法有何不同?
3.17 在一个静态方法内调用一个非静态成员为什么是非法的?
3.18 什么是方法的返回值?返回值的作用是什么?
3.19 什么是内部类?
3.20 内部类的分类有哪些
静态内部类
成员内部类
局部内部类
匿名内部类
3.21 内部类的优点
3.22 内部类有哪些应用场景
3.23 局部内部类和匿名内部类访问局部变量的时候,为什么变量必须要加上final?
3.24 内部类相关,看程序说出运行结果
3.25 构造器(constructor)是否可被重写(override)
3.26 重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
3.27 == 和 equals 的区别是什么
3.28 hashCode 与 equals (重要)
3.29 对象的相等与指向他们的引用相等,两者有什么不同?
3.30 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递
3.31 为什么 Java 中只有值传递
3.32 值传递和引用传递有什么区别
3.33 JDK 中常用的包有哪些
3.34 import java和javax有什么区别
四、IO流
4.1 java 中 IO 流分为几种?
4.2 BIO,NIO,AIO 有什么区别?
4.3 Files的常用方法都有哪些?
五、反射
5.1 什么是反射机制?
5.2 反射机制优缺点
5.3 反射机制的应用场景有哪些?
5.4 Java获取反射的三种方法
六、常用API
6.1 字符型常量和字符串常量的区别
6.2 什么是字符串常量池?
6.3 String 是最基本的数据类型吗
6.4 String有哪些特性
6.5 String为什么是不可变的吗?
6.6 String真的是不可变的吗?
6.7 是否可以继承 String 类
6.8 String str="i"与 String str=new String(“i”)一样吗?
6.9 String s = new String(“xyz”);创建了几个字符串对象
6.10 如何将字符串反转?
6.11 数组有没有 length()方法?String 有没有 length()方法
6.12 String 类的常用方法都有那些?
6.13 在使用 HashMap 的时候,用 String 做 key 有什么好处?
6.14 String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的
6.15 自动装箱与拆箱
6.16 int 和 Integer 有什么区别
6.17 Integer a= 127 与 Integer b = 127相等吗
第二章:Java集合面试题
一、集合容器概述
1.1 什么是集合
1.2 集合的特点
1.3 集合和数组的区别
1.4 使用集合框架的好处
1.5 常用的集合类有哪些?
1.6 List,Set,Map三者的区别?List、Set、Map 是否继承自 Collection 接口?List、Map、Set 三个接口存取元素时,各有什么特点?
1.7 集合框架底层数据结构
1.8 哪些集合类是线程安全的?
1.9 Java集合的快速失败机制 “fail-fast”?
1.10 怎么确保一个集合不能被修改?
二、List接口
2.1 迭代器 Iterator 是什么?
2.2 Iterator 怎么使用?有什么特点?
2.3 如何边遍历边移除 Collection 中的元素?
2.4 Iterator 和 ListIterator 有什么区别?
2.5 遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么?Java 中 List 遍历的最佳实践是什么?
2.6 说一下 ArrayList 的优缺点
2.7 如何实现数组和 List 之间的转换?
2.8 ArrayList 和 LinkedList 的区别是什么?
2.9 ArrayList 和 Vector 的区别是什么?
2.10 插入数据时,ArrayList、LinkedList、Vector谁速度较快?阐述 ArrayList、Vector、LinkedList 的存储性能和特性?
2.11 多线程场景下如何使用 ArrayList?
2.12 为什么 ArrayList 的 elementData 加上 transient 修饰?
2.13 List 和 Set 的区别
三、Set接口
3.1 说一下 HashSet 的实现原理?
3.2 HashSet如何检查重复?HashSet是如何保证数据不可重复的?
3.3 HashSet与HashMap的区别
四、Queue
4.1 BlockingQueue是什么?
4.2 在 Queue 中 poll()和 remove()有什么区别?
五、Map接口
5.1 说一下 HashMap 的实现原理?
5.2 HashMap在JDK1.7和JDK1.8中有哪些不同?HashMap的底层实现
JDK1.8之前
JDK1.8之后
JDK1.7 VS JDK1.8 比较
5.3 HashMap的put方法的具体流程?
5.4 HashMap的扩容操作是怎么实现的?
5.5 HashMap是怎么解决哈希冲突的?
什么是哈希?
什么是哈希冲突?
HashMap的数据结构
hash()函数
JDK1.8新增红黑树
总结
5.6 能否使用任何类作为 Map 的 key?
5.7 为什么HashMap中String、Integer这样的包装类适合作为K?
5.8 如果使用Object作为HashMap的Key,应该怎么办呢?
5.9 HashMap为什么不直接使用hashCode()处理后的哈希值直接作为table的下标?
5.10 HashMap 的长度为什么是2的幂次方
5.11 HashMap 与 HashTable 有什么区别?
5.12 如何决定使用 HashMap 还是 TreeMap?
5.13 HashMap 和 ConcurrentHashMap 的区别
5.14 ConcurrentHashMap 和 Hashtable 的区别?
5.15 ConcurrentHashMap 底层具体实现知道吗?实现原理是什么?
六、辅助工具类
6.1 Array 和 ArrayList 有何区别?
6.2 如何实现 Array 和 List 之间的转换?
6.3 comparable 和 comparator的区别?
6.4 Collection 和 Collections 有什么区别?
6.5 TreeMap 和 TreeSet 在排序时如何比较元素?Collections 工具类中的 sort()方法如何比较元素?
第三章:JVM面试题
一、Java内存区域
1.1 说一下 JVM 的主要组成部分及其作用?
1.2 说一下 JVM 运行时数据区
1.3 深拷贝和浅拷贝
1.4 说一下堆栈的区别?
1.5 队列和栈是什么?有什么区别?
二、HotSpot虚拟机对象探秘
2.1 对象的创建
2.2 为对象分配内存
2.3 处理并发安全问题
2.4 对象的访问定位
句柄访问
直接指针
三、内存溢出异常
3.1 Java会存在内存泄漏吗?请简单描述
四、垃圾收集器
4.1 简述Java垃圾回收机制
4.2 GC是什么?为什么要GC
4.3 垃圾回收的优点和原理。并考虑2种回收机制
4.4 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
4.5 Java 中都有哪些引用类型?
4.6 怎么判断对象是否可以被回收?
4.7 在Java中,对象什么时候可以被垃圾回收
4.8 JVM中的永久代中会发生垃圾回收吗
4.9 说一下 JVM 有哪些垃圾回收算法?
标记-清除算法
复制算法
标记-整理算法
分代收集算法
4.10 说一下 JVM 有哪些垃圾回收器?
4.11 详细介绍一下 CMS 垃圾回收器?
4.12 新生代垃圾回收器和老年代垃圾回收器都有哪些?有什么区别?
4.13 简述分代垃圾回收器是怎么工作的?
五、内存分配策略
5.1 简述java内存分配与回收策率以及Minor GC和Major GC
对象优先在 Eden 区分配
大对象直接进入老年代
长期存活对象将进入老年代
六、虚拟机类加载机制
6.1 简述java类加载机制?
6.2 描述一下JVM加载Class文件的原理机制
6.3 什么是类加载器,类加载器有哪些?
6.4 说一下类装载的执行过程?
6.5 什么是双亲委派模型?
七、JVM调优
7.1 说一下 JVM 调优的工具?
7.2 常用的 JVM 调优的参数都有哪些?
第四章:Spring面试题
一、Spring概述
1.1 什么是spring
1.2 Spring框架的设计目标,设计理念,和核心是什么
1.3 Spring的优缺点是什么?
1.4 Spring有哪些应用场景
1.5 Spring由哪些模块组成?
1.6 Spring 框架中都用到了哪些设计模式?
1.7 详细讲解一下核心容器(spring context应用上下文) 模块
1.8 Spring框架中有哪些不同类型的事件
1.9 Spring 应用程序有哪些不同组件?
1.10 使用 Spring 有哪些方式?
二、Spring控制反转(IOC)
2.1 什么是Spring IOC 容器?
2.2 控制反转(IoC)有什么作用
2.3 IOC的优点是什么?
2.4 Spring IoC 的实现机制
2.5 Spring 的 IoC支持哪些功能
2.6 BeanFactory 和 ApplicationContext有什么区别?
2.7 Spring 如何设计容器的,BeanFactory和ApplicationContext的关系详解
2.8 ApplicationContext通常的实现是什么?
2.9 什么是Spring的依赖注入?
2.10 依赖注入的基本原则
2.11 依赖注入有什么优势
2.12 有哪些不同类型的依赖注入实现方式?
2.13 构造器依赖注入和 Setter方法注入的区别
三、Spring Beans
3.1 什么是Spring beans?
3.2 一个 Spring Bean 定义 包含什么?
3.3 如何给Spring 容器提供配置元数据?Spring有几种配置方式
3.4 Spring配置文件包含了哪些信息
3.5 Spring基于xml注入bean的几种方式
3.6 你怎样定义类的作用域?
3.7 解释Spring支持的几种bean的作用域
3.8 Spring框架中的单例bean是线程安全的吗?
3.9 Spring如何处理线程并发问题?
3.10 解释Spring框架中bean的生命周期
3.11 哪些是重要的bean生命周期方法? 你能重载它们吗?
3.12 什么是Spring的内部bean?什么是Spring inner beans?
3.13 在 Spring中如何注入一个java集合?
3.14 什么是bean装配?
3.15 什么是bean的自动装配?
3.16 解释不同方式的自动装配,spring 自动装配 bean 有哪些方式?
3.17 使用@Autowired注解自动装配的过程是怎样的?
3.18 自动装配有哪些局限性?
四、Spring注解
4.1 什么是基于Java的Spring注解配置? 给一些注解的例子
4.2 怎样开启注解装配?
4.3 @Component, @Controller, @Repository, @Service 有何区别?
4.4 @Required 注解有什么作用
4.5 @Autowired 注解有什么作用
4.6 @Autowired和@Resource之间的区别
4.7 @Qualifier 注解有什么作用
4.8 @RequestMapping 注解有什么用?
五、Spring数据访问
5.1 Spring支持的事务管理类型, spring 事务实现方式有哪些?
5.2 Spring事务的实现方式和实现原理
5.3 说一下Spring的事务传播行为
5.4 说一下 spring 的事务隔离?
5.5 Spring框架的事务管理有哪些优点?
5.6 你更倾向用那种事务管理类型?
六、Spring面向切面编程(AOP)
6.1 什么是AOP
6.2 Spring AOP and AspectJ AOP 有什么区别?AOP 有哪些实现方式?
6.3 JDK动态代理和CGLIB动态代理的区别
6.4 如何理解 Spring 中的代理?
6.5 解释一下Spring AOP里面的几个名词
6.6 Spring在运行时通知对象
6.7Spring只支持方法级别的连接点
6.8 在Spring AOP 中,关注点和横切关注的区别是什么?在 spring aop 中 concern 和 cross-cutting concern 的不同之处
6.9 Spring通知有哪些类型?
6.10 什么是切面 Aspect?
第五章:Spring Boot面试题
一、概述
1.1 什么是 Spring Boot?
1.2 Spring Boot 有哪些优点?
1.3 Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
二、配置
2.1 什么是 JavaConfig?
2.2 Spring Boot 自动配置原理是什么?
2.3 你如何理解 Spring Boot 配置加载顺序?
2.4 什么是 YAML?
2.5 YAML 配置的优势在哪里 ?
2.6 Spring Boot 是否可以使用 XML 配置 ?
2.7 spring boot 核心配置文件是什么?bootstrap.properties 和 application.properties 有何区别 ?
2.8 什么是 Spring Profiles?
2.9 如何在自定义端口上运行 Spring Boot 应用程序?
三、安全
3.1 如何实现 Spring Boot 应用程序的安全性?
3.2 比较一下 Spring Security 和 Shiro 各自的优缺点 ?
3.3 Spring Boot 中如何解决跨域问题 ?
3.4 什么是 CSRF 攻击?
四、监视器
4.1 Spring Boot 中的监视器是什么?
4.2 如何在 Spring Boot 中禁用 Actuator 端点安全性?
4.3 我们如何监视所有 Spring Boot 微服务?
五、其他
5.1 如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?Spring Boot项目如何热部署?
5.2 您使用了哪些 starter maven 依赖项?
5.3 Spring Boot 中的 starter 到底是什么 ?
5.4 spring-boot-starter-parent 有什么用 ?
5.5 Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?
5.6 运行 Spring Boot 有哪几种方式?
5.7 Spring Boot 需要独立的容器运行吗?
5.8 开启 Spring Boot 特性有哪几种方式?
5.9 如何使用 Spring Boot 实现异常处理?
5.10 如何使用 Spring Boot 实现分页和排序?
5.11 微服务中如何实现 session 共享 ?
5.12 Spring Boot 中如何实现定时任务 ?
第六章:Spring Cloud面试题
一、概述
1.1 为什么需要学习Spring Cloud
1.2 Spring Cloud优缺点
二、主要项目
2.1 Spring Cloud Config
2.2 Spring Cloud Netflix
2.3 Spring Cloud Bus
2.4 Spring Cloud Consul
2.5 Spring Cloud Security
2.6 Spring Cloud Sleuth
2.7 Spring Cloud Stream
2.8 Spring Cloud Task
2.9 Spring Cloud Zookeeper
2.10 Spring Cloud Gateway
2.11 Spring Cloud OpenFeign
三、其他
3.1 SpringBoot和SpringCloud的区别?
3.2 使用 Spring Boot 开发分布式微服务时,我们面临以下问题
3.3 服务注册和发现是什么意思?Spring Cloud 如何实现?
3.4 Spring Cloud 和dubbo区别?
3.5 负载平衡的意义什么?
3.6 什么是 Hystrix?它如何实现容错?
3.7 什么是 Netflix Feign?它的优点是什么?
3.8 什么是 Spring Cloud Bus?我们需要它吗?
3.9 Spring Cloud断路器的作用
3.10 什么是Spring Cloud Config?
3.11 什么是Spring Cloud Gateway?
第七章:Mysql面试题
一、数据库基础知识
1.1 数据库三大范式是什么
1.2 mysql有关权限的表都有哪几个
1.3 MySQL的binlog有有几种录入格式?分别有什么区别?
二、数据类型
2.1 mysql有哪些数据类型
三、引擎
3.1 MySQL存储引擎MyISAM与InnoDB区别
3.2 MyISAM索引与InnoDB索引的区别?
3.3 InnoDB引擎的4大特性
四、索引
4.1 什么是索引?
4.2 索引有哪些优缺点?
4.3 索引使用场景(重点)
4.4 索引有哪几种类型?
4.5 索引的数据结构(b树,hash)
4.6 索引的基本原理
4.7 索引算法有哪些?
4.8 索引设计的原则?
4.9 创建索引的原则(重中之重)
4.10 创建索引的三种方式,删除索引
4.11 创建索引时需要注意什么?
4.12 使用索引查询一定能提高查询的性能吗?为什么
4.13 百万级别或以上的数据如何删除
4.14 前缀索引
4.15 什么是最左前缀原则?什么是最左匹配原则
4.16 B树和B+树的区别
4.17 使用B树的好处
4.18 使用B+树的好处
4.19 Hash索引和B+树所有有什么区别或者说优劣呢?
4.20 数据库为什么使用B+树而不是B树
4.21 B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据
4.22 什么是聚簇索引?何时使用聚簇索引与非聚簇索引
4.23 非聚簇索引一定会回表查询吗?
4.24 联合索引是什么?为什么需要注意联合索引中的顺序?
五、事务
5.1 什么是数据库事务?
5.2 事物的四大特性(ACID)介绍一下?
5.3 什么是脏读?幻读?不可重复读?
5.4 什么是事务的隔离级别?MySQL的默认隔离级别是什么?
六、锁
6.1 对MySQL的锁了解吗
6.2 隔离级别与锁的关系
6.3 按照锁的粒度分数据库锁有哪些?锁机制与InnoDB锁算法
6.4 从锁的类别上分MySQL都有哪些锁呢?像上面那样子进行锁定岂不是有点阻碍并发效率了
6.5 MySQL中InnoDB引擎的行锁是怎么实现的?
6.6 InnoDB存储引擎的锁的算法有三种
6.7 什么是死锁?怎么解决?
6.8 数据库的乐观锁和悲观锁是什么?怎么实现的?
七、视图
7.1 为什么要使用视图?什么是视图?
7.2 视图有哪些特点?
7.3 视图的使用场景有哪些?
7.5 视图的缺点
7.6 什么是游标?
八、常用SQL语句
8.1 SQL语句主要分为哪几类
8.2 超键、候选键、主键、外键分别是什么?
8.3 SQL 约束有哪几种?
8.4 mysql中 in 和 exists 区别
8.5 varchar与char的区别
8.6 varchar(50)中50的涵义
8.7 int(20)中20的涵义
8.8 drop、delete与truncate的区别
8.9 UNION与UNION ALL的区别?
九、SQL优化
9.1 如何定位及优化SQL语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?
9.2 SQL的生命周期?
9.3 大表数据查询,怎么优化
9.4 超大分页怎么处理?
9.5 mysql 分页
9.6 慢查询日志
9.7 关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?
9.8 为什么要尽量设定一个主键?
9.9 主键使用自增ID还是UUID?
9.10 字段为什么要求定义为not null?
9.11 如果要存储用户的密码散列,应该使用什么字段进行存储?
9.12 优化查询过程中的数据访问
9.13 优化长难的查询语句
9.14 优化特定类型的查询语句
9.15 优化关联查询
9.16 优化子查询
9.17 优化LIMIT分页
9.18 优化UNION查询
9.19 优化WHERE子句
十、数据库优化
10.1 为什么要优化
10.2 数据库结构优化
10.3 MySQL数据库cpu飙升到500%的话他怎么处理?
10.4 大表怎么优化?某个表有近千万数据,CRUD比较慢,如何优化?分库分表了是怎么做的?分表分库了有什么问题?有用到中间件么?他们的原理知道么?
10.5 MySQL的复制原理以及流程
10.6 读写分离有哪些解决方案?
10.7 备份计划,mysqldump以及xtranbackup的实现原理
10.8 数据表损坏的修复方式有哪些?
第八章:Redis面试题
一、概述
1.1 什么是Redis
1.2 Redis有哪些优缺点
1.3 为什么要用 Redis /为什么要用缓存
1.4 为什么要用 Redis 而不用 map/guava 做缓存?
1.5 Redis为什么这么快
二、数据类型
2.1 Redis有哪些数据类型
2.2 Redis的应用场景
三、持久化
3.1 什么是Redis持久化?
3.2 Redis 的持久化机制是什么?各自的优缺点?
3.3 如何选择合适的持久化方式
3.4 Redis持久化数据和缓存怎么做扩容?
四、过期键的删除策略
4.1 Redis的过期键的删除策略
4.2 Redis key的过期时间和永久有效分别怎么设置?
4.3 我们知道通过expire来设置key 的过期时间,那么对过期的数据怎么处理呢?
五、内存相关
5.1 MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据
5.2 Redis的内存淘汰策略有哪些
5.3 Redis主要消耗什么物理资源?
5.4 Redis的内存用完了会发生什么?
5.5 Redis如何做内存优化?
六、线程模型
6.1 Redis线程模型
七、事务
7.1 什么是事务?
7.2 Redis事务的概念
7.3 Redis事务的三个阶段
7.4 Redis事务相关命令
7.5 事务管理(ACID)概述
7.6 Redis事务支持隔离性吗
7.7 Redis事务保证原子性吗,支持回滚吗
7.8 Redis事务其他实现
八、集群方案
8.1 哨兵模式
8.2 官方Redis Cluster 方案(服务端路由查询)
8.3 基于客户端分配
8.4 基于代理服务器分片
8.5 Redis 主从架构
8.6 Redis集群的主从复制模型是怎样的?
8.7 生产环境中的 redis 是怎么部署的?
8.8 说说Redis哈希槽的概念?
8.9 Redis集群会有写操作丢失吗?为什么?
8.10 Redis集群之间是如何复制的?
8.11 Redis集群最大节点个数是多少
8.12 Redis集群如何选择数据库?
九、分区
9.1 Redis是单线程的,如何提高多核CPU的利用率?
9.2 为什么要做Redis分区?
9.3 你知道有哪些Redis分区实现方案?
9.4 Redis分区有什么缺点?
十、分布式问题
10.1 Redis实现分布式锁
10.2 如何解决 Redis 的并发竞争 Key 问题
10.3 分布式Redis是前期做还是后期规模上来了再做好?为什么?
10.4 什么是 RedLock
十一、缓存异常
11.1 缓存雪崩
11.2 缓存穿透
11.3 缓存击穿
11.4 缓存预热
11.5 缓存降级
11.6 热点数据和冷数据
11.7 缓存热点key
十二、常用工具
12.1 Redis支持的Java客户端都有哪些?官方推荐用哪个?
12.2 Redis和Redisson有什么关系?
12.3 Jedis与Redisson对比有什么优缺点?
十三、其他问题
13.1 如何保证缓存与数据库双写时的数据一致性?
13.2 Redis常见性能问题和解决方案?
13.3 Redis如何做大量数据插入?
13.4 假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?
13.5 使用Redis做过异步队列吗,是如何实现的
13.6 Redis如何实现延时队列
13.7 Redis回收进程如何工作的?
13.8Redis回收使用的是什么算法?
第九章:RabbitMQ面试题
一、消息队列简述
1.1 为什么使用MQ?MQ的优点
1.2 消息队列有什么优缺点?RabbitMQ有什么优缺点?
1.3 你们公司生产环境用的是什么消息中间件?
1.4 Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?
1.5 MQ 有哪些常见问题?如何解决这些问题?
二、什么是RabbitMQ?
2.1 rabbitmq 的使用场景
2.2 RabbitMQ基本概念
2.3 RabbitMQ的工作模式
2.4 如何保证RabbitMQ消息的顺序性?
2.5 消息如何分发?
2.6 消息怎么路由?
2.7 消息基于什么传输?
2.8 如何保证消息不被重复消费?或者说,如何保证消息消费时的幂等性?
2.9 如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费了消息?
2.10 如何保证RabbitMQ消息的可靠传输?
2.11 为什么不应该对所有的 message 都使用持久化机制?
2.12 如何保证高可用的?RabbitMQ 的集群
2.13 如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?
2.14 设计MQ思路
第十章:Dubbo面试题
一、基础知识
1.1 为什么要用 Dubbo?
1.2 Dubbo 是什么?
1.3 Dubbo 的使用场景有哪些?
1.4 Dubbo 核心功能有哪些?
二、架构设计
2.1 Dubbo 核心组件有哪些?
2.2 Dubbo 服务器注册与发现的流程?
Dubbo 的整体架构设计有哪些分层?
2.3 Dubbo Monitor 实现原理?
三、分布式框架
3.1 Dubbo 类似的分布式框架还有哪些?
3.2 Dubbo 和 Spring Cloud 有什么关系?
3.3 Dubbo 和 Spring Cloud 有什么哪些区别?
3.4 Dubbo 和 Dubbox 之间的区别?
四、注册中心
4.1 Dubbo 有哪些注册中心?
4.2 Dubbo 的注册中心集群挂掉,发布者和订阅者之间还能通信么?
五、集群
5.1 Dubbo集群提供了哪些负载均衡策略?
5.2 Dubbo的集群容错方案有哪些?
六、配置
6.1 Dubbo 配置文件是如何加载到 Spring 中的?
6.2 说说核心的配置有哪些?
6.3 Dubbo 超时设置有哪些方式?
6.4 服务调用超时会怎么样?
七、通信协议
7.1 Dubbo 使用的是什么通信框架?
7.2 Dubbo 支持哪些协议,它们的优缺点有哪些?
八、设计模式
8.1 Dubbo 用到哪些设计模式?
九、运维管理
9.1 服务上线怎么兼容旧版本?
9.2 Dubbo telnet 命令能做什么?
9.3 Dubbo 支持服务降级吗?
9.4 Dubbo 如何优雅停机?
十、SPI
10.1 Dubbo SPI 和 Java SPI 区别?
十一、其他
11.1 Dubbo 支持分布式事务吗?
11.2 Dubbo 可以对结果进行缓存吗?
11.3 Dubbo 必须依赖的包有哪些?
11.4 Dubbo 支持哪些序列化方式?
11.5 Dubbo 在安全方面有哪些措施?
11.6 服务调用是阻塞的吗?
11.7 服务提供者能实现失效踢出是什么原理?
11.8 同一个服务多个注册的情况下可以直连某一个服务吗?
11.9Dubbo 服务降级,失败重试怎么做?
11.10 Dubbo 使用过程中都遇到了些什么问题?
十二、RPC
12.1 为什么要有RPC
12.2 什么是RPC
12.3 PRC架构组件
12.4 RPC和SOA、SOAP、REST的区别
12.5 RPC框架需要解决的问题?
12.6 RPC的实现基础?
12.7 RPC使用了哪些关键技术?
12.8 主流RPC框架有哪些
12.9 RPC的实现原理架构图
第十一章:Netty面试题
1. Netty 是什么?
2. Netty 的特点是什么?
3. Netty 的优势有哪些?
4. Netty 的应用场景有哪些?
5. Netty 高性能表现在哪些方面?
6. BIO、NIO和AIO的区别?
7. NIO的组成?
8. Netty的线程模型?
9. TCP 粘包/拆包的原因及解决方法?
10. 什么是 Netty 的零拷贝?
11. Netty 中有哪种重要组件?
12. Netty 发送消息有几种方式?
13. 默认情况 Netty 起多少线程?何时启动?
14. 了解哪几种序列化协议?
15. 如何选择序列化协议?
16. Netty 支持哪些心跳类型设置?
17. Netty 和 Tomcat 的区别?
18. NIOEventLoopGroup源码?
第十二章:分布式与架构涉及
一、架构设计
1.1 请列举出在JDK中几个常用的设计模式?
1.2 什么是设计模式?你是否在你的代码里面使用过任何设计模式?
1.3 静态代理、JDK动态代理以及CGLIB动态代理
静态代理
动态代理
cglib代理
1.4 单例模式
1.5 工厂模式
1.6 观察者模式
1.7 装饰器模式
1.8 秒杀系统设计
二、分布式
2.1 分布式
2.2 集群
2.3 微服务
2.4 多线程
2.5 高并发
2.6 分布式系统的目标与要素
2.7 分布式系统设计两大思路:中心化和去中心化
2.8 分布式与集群的区别是什么?
2.9 CAP定理
2.10 CAP定理的证明
2.11 BASE理论
2.12 BASE理论的核心思想
2.13 BASE理论三要素
1. 基本可用
2. 软状态
3. 最终一致性
2021 Java 面试大全 公众号:Java 旅途
这本面试手册包含了 Java 基础、Java 集合、JVM、Spring、Spring Boot、Spring Cloud、Mysql、Redis、RabbitMQ、Dubbo、Netty、分布式及架构设计等方面 的技术点。内容难度参差,满足初中高级 Java 工程师的面试需求。面试手册 由 Java 旅途公众号整理。如果你想实时关注我的技术文章或者获取更多技术 资料,可以关注我的公众号。
第一章:Java基础面试题 一、Java概述 1.1 何为编程 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。 为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够 理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人 和计算机之间交流的过程就是编程。 1.2 什么是Java Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指 针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代 表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。 1.3 jdk1.5之后的三大版本 Java SE(J2SE,Java 2 Platform Standard Edition,标准版) Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为Java EE和Java ME提供基础。 Java EE(J2EE,Java 2 Platform Enterprise Edition,企业版) Java EE 以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端Java 应 用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API, 可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web2.0应 用程序。2018年2月,Eclipse 宣布正式将 JavaEE 更名为 JakartaEE Java ME(J2ME,Java 2 Platform Micro Edition,微型版) Java ME 以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和 打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安 全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。 1.4 JVM、JRE和JDK的关系 JVM Java Virtual Machine是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此 Java语言可以实现跨平台。 JRE Java Runtime Environment包括Java虚拟机和Java程序所需的核心类库等。核心类库主要是java.lang 包:包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异 常处理类等,系统缺省加载这个包 如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。 JDK Java Development Kit是提供给Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE。所以 安装了JDK,就无需再单独安装JRE了。其中的开发工具:编译工具(javac.exe),打包工具(jar.exe)等 JVM&JRE&JDK关系图 1公众号:Java旅途
1.5 什么是跨平台性?原理是什么 所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行。 实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该 系统就可以运行java程序。 1.6 Java语言有哪些特点 简单易学(Java语言的语法与C语言和C++语言很接近) 面向对象(封装,继承,多态) 平台无关性(Java虚拟机实现平台无关性) 支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的) 支持多线程(多线程机制使应用程序在同一时间并行执行多项任) 健壮性(Java语言的强类型机制、异常处理、垃圾的自动收集等) 安全性 1.7 什么是字节码?采用字节码的最大好处是什么 字节码:Java源代码经过虚拟机编译器编译后产生的文件(即扩展为.class的文件),它不面向任何特定 的处理器,只面向虚拟机。 采用字节码的好处: Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解 释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器, 因此,Java程序无须重新编译便可在多种不同的计算机上运行。 先看下java中的编译器和解释器: Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟机器。这台虚拟的机器在 任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的 代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代 码叫做字节码(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解 2公众号:Java旅途
释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟 机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然 后在特定的机器上运行,这就是上面提到的Java的特点的编译与解释并存的解释。 Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm---->jvm中解释器----- >机器可执行的二进制机器码---->程序运行。 1.8 什么是Java程序的主类?应用程序和小程序的主类有何不同? 一个程序中可以有多个类,但只能有一个类是主类。在Java应用程序中,这个主类是指包含main()方法 的类。而在Java小程序中,这个主类是一个继承自系统类JApplet或Applet的子类。应用程序的主类不一 定要求是public类,但小程序的主类要求必须是public类。主类是Java程序执行的入口点。 1.9 Java应用程序与小程序之间有那些差别? 简单说应用程序是从主线程启动(也就是main()方法)。applet小程序没有main方法,主要是嵌在浏览器 页面上运行(调用init()线程或者run()来启动),嵌入浏览器这点跟flash的小游戏类似。 1.10 Java和C++的区别 我知道很多人没学过C++,但是面试官就是没事喜欢拿咱们Java和C++比呀!没办法!!!就算没学过 C++,也要记下来! 都是面向对象的语言,都支持封装、继承和多态 Java不提供指针来直接访问内存,程序内存更加安全 Java的类是单继承的,C++支持多重继承;虽然Java的类不可以多继承,但是接口可以多继承。 Java有自动内存管理机制,不需要程序员手动释放无用内存 1.11 Oracle JDK 和 OpenJDK 的对比 1. Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次; 2. OpenJDK 是一个参考模型并且是完全开源的,而Oracle JDK是OpenJDK的一个实现,并不是完全 开源的; 3. Oracle JDK 比 OpenJDK 更稳定。OpenJDK和Oracle JDK的代码几乎相同,但Oracle JDK有更多的 类和一些错误修复。因此,如果您想开发企业/商业软件,我建议您选择Oracle JDK,因为它经过 了彻底的测试和稳定。某些情况下,有些人提到在使用OpenJDK 可能会遇到了许多应用程序崩溃 的问题,但是,只需切换到Oracle JDK就可以解决问题; 4. 在响应性和JVM性能方面,Oracle JDK与OpenJDK相比提供了更好的性能; 5. Oracle JDK不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来 获取最新版本; 6. Oracle JDK根据二进制代码许可协议获得许可,而OpenJDK根据GPL v2许可获得许可。 二、基础语法 2.1 Java有哪些数据类型 定义:Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同 大小的内存空间。 分类 基本数据类型 数值型 整数类型(byte,short,int,long) 浮点类型(float,double) 3公众号:Java旅途
字符型(char) 布尔型(boolean) 引用数据类型 类(class) 接口(interface) 数组([]) Java基本数据类型图 2.2 switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上 在 Java 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。从 Java5 开始,Java 中引入 了枚举类型,expr 也可以是 enum 类型,从 Java 7 开始,expr 还可以是字符串(String),但是长整 型(long)在目前所有的版本中都是不可以的。 2.3 用最有效率的方法计算 2 乘以 8 2 << 3(左移 3 位相当于乘以 2 的 3 次方,右移 3 位相当于除以 2 的 3 次方)。 2.4 Math.round(11.5) 等于多少?Math.round(-11.5)等于多少 Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加 0.5 然后进行下取整。 2.5 float f=3.4;是否正确 不正确。3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting, 也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成 float f =3.4F;。 2.6 short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗 对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型,因此 s1+1 运算结果也是 int型,需要强制转换类型才 能赋值给 short 型。 而 short s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于 s1 = (short(s1 + 1);其中有隐含的强制类型 转换。 2.7 Java语言采用何种编码方案?有何特点? Java语言采用Unicode编码标准,Unicode(标准码),它为每个字符制订了一个唯一的数值,因此在任 何的语言,平台,程序都可以放心的使用。 4公众号:Java旅途
2.8 什么Java注释 定义:用于解释说明程序的文字 分类 作用 单行注释 格式: // 注释文字 多行注释 格式: /* 注释文字 */ 文档注释 格式:/** 注释文字 */ 在程序中,尤其是复杂的程序中,适当地加入注释可以增加程序的可读性,有利于程序的修改、调试和 交流。注释的内容在程序编译的时候会被忽视,不会产生目标代码,注释的部分不会对程序的执行结果 产生任何影响。 注意事项:多行和文档注释都不能嵌套使用。 2.9 访问修饰符 public,private,protected,以及不写(默认)时的区别 定义:Java中,可以使用访问修饰符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的 访问权限。 分类 private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类) default (即缺省,什么也不写,不使用任何关键字): 在同一包内可见,不使用任何修饰符。使用对 象:类、接口、变量、方法。 protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部 类)。 public : 对所有类可见。使用对象:类、接口、变量、方法 访问修饰符图 2.10 &和&&的区别 &运算符有两种用法:(1)按位与;(2)逻辑与。 &&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔 值都是true 整个表达式的值才是 true。&&之所以称为短路运算,是因为如果&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。 注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。 5公众号:Java旅途
2.11 Java 有没有 goto goto 是 Java 中的保留字,在目前版本的 Java 中没有使用。 2.12 final 有什么用? 用于修饰类、属性和方法; 被final修饰的类不可以被继承 被final修饰的方法不可以被重写 被final修饰的变量不可以被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引 用指向的内容是可以改变的 2.13 final finally finalize区别 final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修 饰变量表 示该变量是一个常量不能被重新赋值。 finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法 finally代码块 中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。 finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾 回收器来调 用,当我们调用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否 可回收的 最后判断。 2.14 this关键字的用法 this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。 this的用法在java中大体可以分为3种: 1.普通的直接引用,this相当于是指向当前对象本身。 2.形参与成员名字重名,用this来区分: public Person(String name, int age) {    this.name = name;    this.age = age; } 3.引用本类的构造函数 class Person{    private String name;    private int age;        public Person() {   }    public Person(String name) {        this.name = name;   }    public Person(String name, int age) {        this(name);        this.age = age; 6公众号:Java旅途
分享到:
收藏