Java的后端的面试题

https://blog.csdn.net/guorui_java/article/details/107803283

题目篇
一、Java基础
1、JDK 和 JRE 有什么区别?
2、== 和 equals 的区别是什么?
3、两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
4、final 在 java 中有什么作用?
5、java 中的 Math.round(-1.5) 等于多少?
6、String 属于基础的数据类型吗?
7、java 中操作字符串都有哪些类?它们之间有什么区别?
8、String str="i"与 String str=new String(“i”)一样吗?
9、如何将字符串反转?
10、String 类的常用方法都有那些?
11、抽象类必须要有抽象方法吗?
12、普通类和抽象类有哪些区别?
13、抽象类能使用 final 修饰吗?
14、接口和抽象类有什么区别?
15、java 中 IO 流分为几种?
16、BIO、NIO、AIO 有什么区别?
17、Files的常用方法都有哪些?
18、什么是反射?
19、什么是 java 序列化?什么情况下需要序列化?
20、动态代理是什么?有哪些应用?
21、怎么实现动态代理?
22、为什么要使用克隆?
23、如何实现对象克隆?
24、深拷贝和浅拷贝区别是什么?
25、throw 和 throws 的区别?
26、final、finally、finalize 有什么区别?
27、try-catch-finally 中哪个部分可以省略?
28、try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
29、常见的异常类有哪些?
30、new String(“a”) + new String(“b”) 会创建几个对象?

二、Java集合
1、java 容器都有哪些?
2、Collection 和 Collections 有什么区别?
3、List、Set、Map 之间的区别是什么?
4、HashMap 和 Hashtable 有什么区别?
5、说一下 HashMap 的实现原理?
6、set有哪些实现类?
7、说一下 HashSet 的实现原理?
8、ArrayList 和 LinkedList 的区别是什么?
9、如何实现数组和 List 之间的转换?
10、ArrayList 和 Vector 的区别是什么?
11、Array 和 ArrayList 有何区别?
12、在 Queue 中 poll()和 remove()有什么区别?
13、哪些集合类是线程安全的?
14、迭代器 Iterator 是什么?
15、Iterator 怎么使用?有什么特点?
16、Iterator 和 ListIterator 有什么区别?
17、怎么确保一个集合不能被修改?
18、队列和栈是什么?有什么区别?

三、多线程
1、Synchronized 用过吗,其原理是什么?
2、请对比下 volatile 对比 Synchronized 的异同。
3、请谈谈 volatile 有什么特点,为什么它能保证变量对所有线程的可见性?
4、JVM 对 Java 的原生锁做了哪些优化?
5、为什么说 Synchronized 是非公平锁?
6、什么是锁消除和锁粗化?
7、为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?什么是 CAS,它有什么特性?
8、乐观锁一定就是好的吗?
9、跟 Synchronized 相比,可重入锁 ReentrantLock 其实现原理有什么不同?
10、那么请谈谈 AQS 框架是怎么回事儿?
11、请尽可能详尽地对比下 Synchronized 和 ReentrantLock 的异同。
12、ReentrantLock 是如何实现可重入性的?
13、除了 ReetrantLock,你还接触过 JUC 中的哪些并发工具?
14、请谈谈 ReadWriteLock 和 StampedLock。
15、如何让 Java 的线程彼此同步?你了解过哪些同步器?请分别介绍下。
16、CyclicBarrier 和 CountDownLatch 看起来很相似,请对比下呢?
17、Java 线程池相关问题
18、Java 中的线程池是如何实现的?
19、创建线程池的几个核心构造参数?
20、线程池中的线程是怎么创建的?是一开始就随着线程池的启动创建好的吗?
21、既然提到可以通过配置不同参数创建出不同的线程池,那么 Java 中默认实现好的线程池又有哪些呢?请比较它们的异同
22、如何在 Java 线程池中提交线程?
23、什么是 Java 的内存模型,Java 中各个线程是怎么彼此看到对方的变量的?
24、ThreadLocal 是什么?有哪些使用场景?
25、既然 volatile 能够保证线程间的变量可见性,是不是就意味着基于 volatile 变量的运算就是并发安全的?
26、Java8开始ConcurrentHashMap,为什么舍弃分段锁?
27、请谈谈 ThreadLocal 是怎么解决并发安全的?
28、很多人都说要慎用 ThreadLocal,谈谈你的理解,使用 ThreadLocal 需要注意些什么?
29、什么是上下文切换?
30、线程的run()和start()有什么区别?
31、为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?
32、什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing )?
33、为什么 wait(), notify()和 notifyAll()必须在同步方法或者同步块中被调用?
34、Thread 类中的 yield 方法有什么作用?
35、Java 如何实现多线程之间的通讯和协作?
36、为什么代码会重排序?
37、什么是自旋
38、多线程中 synchronized 锁升级的原理是什么?
39、synchronized 和 ReentrantLock 区别是什么?
40、volatile 关键字的作用
41、Java Concurrency API 中的 Lock 接口(Lock interface)是什么?对比同步它有什么优势?
42、AQS是什么?
43、AQS 对资源的共享方式?

四、Java Web
1、jsp 和 servlet 有什么区别?
2、jsp 有哪些内置对象?作用分别是什么?
3、说一下 jsp 的 4 种作用域?
4、session 和 cookie 有什么区别?
5、说一下 session 的工作原理?
6、如果客户端禁止 cookie 能实现 session 还能用吗?
7、spring mvc 和 struts 的区别是什么?
8、如何避免 sql 注入?
9、什么是 XSS 攻击,如何避免?
10、什么是 CSRF 攻击,如何避免?

五、网络
1、http 响应码 301 和 302 代表的是什么?有什么区别?
2、forward 和 redirect 的区别?
3、简述 tcp 和 udp的区别?
4、tcp 为什么要三次握手,两次不行吗?为什么?
5、说一下 tcp 粘包是怎么产生的?
6、OSI 的七层模型都有哪些?
7、get 和 post 请求有哪些区别?
8、如何实现跨域?
9、说一下 JSONP 实现原理?

六、设计模式
1、请列举出在 JDK 中几个常用的设计模式?
2、什么是设计模式?你是否在你的代码里面使用过任何设计模式?
3、Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
4、在 Java 中,什么叫观察者设计模式(observer design pattern)?
5、使用工厂模式最主要的好处是什么?在哪里使用?
6、举一个用 Java 实现的装饰模式(decorator design pattern)?它是作用于对象层次还是类层次?
7、在 Java 中,为什么不允许从静态方法中访问非静态变量?
8、设计一个 ATM 机,请说出你的设计思路?
9、在 Java 中,什么时候用重载,什么时候用重写?
10、举例说明什么情况下会更倾向于使用抽象类而不是接口

七、Spring/SpringMVC
1、什么是 Spring 框架?Spring 框架有哪些主要模块?
2、使用 Spring 框架能带来哪些好处?
3、什么是控制反转(IOC)?什么是依赖注入?
4、请解释下 Spring 框架中的 IoC?
5、BeanFactory 和 ApplicationContext 有什么区别?
6、Spring 有几种配置方式?
7、请解释 Spring Bean 的生命周期?
8、Spring Bean 的作用域之间有什么区别?
9、什么是 Spring inner beans?
10、Spring 框架中的单例 Beans 是线程安全的么?
11、请举例说明如何在 Spring 中注入一个 Java Collection?
12、如何向 Spring Bean 中注入一个 Java.util.Properties?
13、请解释 Spring Bean 的自动装配?
14、请解释自动装配模式的区别?
15、如何开启基于注解的自动装配?
16、请举例解释@Required 注解?
17、请举例解释@Autowired 注解?
18、请举例说明@Qualifier 注解?
19、构造方法注入和设值注入有什么区别?
20、Spring 框架中有哪些不同类型的事件?
21、FileSystemResource 和 ClassPathResource 有何区别?
22、Spring 框架中都用到了哪些设计模式?

八、Spring Boot/Spring Cloud
1、什么是 Spring Boot?
2、Spring Boot 有哪些优点?
3、什么是 JavaConfig?
5、Spring Boot 中的监视器是什么?
6、如何在 Spring Boot 中禁用 Actuator 端点安全性?
7、如何在自定义端口上运行 Spring Boot 应用程序?
8、什么是 YAML?
9、如何实现 Spring Boot 应用程序的安全性?
10、如何集成 Spring Boot 和 ActiveMQ?
11、如何使用 Spring Boot 实现分页和排序?
12、什么是 Swagger?你用 Spring Boot 实现了它吗?
13、什么是 Spring Profiles?
14、什么是 Spring Batch?
15、什么是 FreeMarker 模板?
16、如何使用 Spring Boot 实现异常处理?
17、您使用了哪些 starter maven 依赖项?
18、什么是 CSRF 攻击?
19、什么是 WebSockets?
20、什么是 AOP?
21、什么是 Apache Kafka?
22、我们如何监视所有 Spring Boot 微服务?
23、什么是 spring cloud?
24、spring cloud 断路器的作用是什么?
26、spring cloud 的核心组件有哪些?

九、Hibernate
1、为什么要使用 hibernate?
2、什么是 ORM 框架?
3、hibernate 中如何在控制台查看打印的 sql 语句?
4、hibernate 有几种查询方式?
5、hibernate 实体类可以被定义为 final 吗?
6、在 hibernate 中使用 Integer 和 int 做映射有什么区别?
7、hibernate 是如何工作的?
8、get()和 load()的区别?
9、说一下 hibernate 的缓存机制?
10、hibernate 对象有哪些状态?
11、在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?
12、hibernate 实体类必须要有无参构造函数吗?为什么?

十、MyBatis
1、mybatis 中 #{}和 ${}的区别是什么?
2、mybatis 有几种分页方式?
3、RowBounds 是一次性查询全部结果吗?为什么?
4、mybatis 逻辑分页和物理分页的区别是什么?
5、mybatis 是否支持延迟加载?延迟加载的原理是什么?
6、说一下 mybatis 的一级缓存和二级缓存?
7、mybatis 和 hibernate 的区别有哪些?
8、mybatis 有哪些执行器(Executor)?
9、mybatis 分页插件的实现原理是什么?
10、mybatis 如何编写一个自定义插件?

十一、RabbitMQ
1、RabbitMQ的使用场景有哪些?
2、RabbitMQ有哪些重要的角色?
3、RabbitMQ有哪些重要的组件?
4、RabbitMQ中 vhost 的作用是什么?
5、RabbitMQ的消息是怎么发送的?
6、RabbitMQ怎么保证消息的稳定性?
7、RabbitMQ怎么避免消息丢失?
8、要保证消息持久化成功的条件有哪些?
9、RabbitMQ持久化有什么缺点?
10、RabbitMQ有几种广播类型?
11、RabbitMQ怎么实现延迟消息队列?
12、RabbitMQ集群有什么用?
13、RabbitMQ节点的类型有哪些?
14、RabbitMQ集群搭建需要注意哪些问题?
15、RabbitMQ每个节点是其他节点的完整拷贝吗?为什么?
16、RabbitMQ集群中唯一一个磁盘节点崩溃了会发生什么情况?
17、RabbitMQ对集群节点停止顺序有要求吗?

十二 、Kafka(未掌握,暂时不做)
如何获取 topic 主题的列表
生产者和消费者的命令行是什么?
consumer是推还是拉?
讲讲kafka维护消费状态跟踪的方法
讲一下主从同步
为什么需要消息系统,mysql 不能满足需求吗?
Zookeeper 对于 Kafka 的作用是什么?
数据传输的事务定义有哪三种?
Kafka 判断一个节点是否还活着有那两个条件?
Kafka 与传统 MQ 消息系统之间有三个关键区别
讲一讲 kafka 的 ack 的三种机制
消费者如何不自动提交偏移量,由应用提交?
消费者故障,出现活锁问题如何解决?
如何控制消费的位置
kafka分布式(不是单机)的情况下,如何保证消息的顺序消费?
kafka的高可用机制是什么?
kafka如何减少数据丢失
kafka如何不消费重复数据?比如扣款,我们不能重复的扣。
十三、Zookeeper(未掌握,暂时不做)
ZooKeeper 提供了什么?
Zookeeper 文件系统
ZAB 协议?
四种类型的数据节点 Znode
Zookeeper Watcher 机制 – 数据变更通知
客户端注册 Watcher 实现
服务端处理 Watcher 实现
客户端回调 Watcher
ACL 权限控制机制
Chroot 特性
会话管理
服务器角色
Zookeeper 下 Server 工作状态
数据同步
zookeeper 是如何保证事务的顺序一致性的?
分布式集群中为什么会有 Master?
zk 节点宕机如何处理?
zookeeper 负载均衡和 nginx 负载均衡区别
Zookeeper 有哪几种几种部署模式?
集群最少要几台机器,集群规则是怎样的?
集群支持动态添加机器吗?
Zookeeper 对节点的 watch监听通知是永久的吗?为什么不是永久的?
Zookeeper 的 java 客户端都有哪些?
chubby 是什么,和 zookeeper 比你怎么看?
说几个 zookeeper 常用的命令。
ZAB 和 Paxos 算法的联系与区别?
Zookeeper 的典型应用场景
十四、MySql
1、数据库的三范式是什么?
2、一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
3、如何获取当前数据库版本?
4、说一下 ACID 是什么?
5、char 和 varchar 的区别是什么?
6、float 和 double 的区别是什么?
7、mysql 的内连接、左连接、右连接有什么区别?
8、mysql 索引是怎么实现的?
9、怎么验证 mysql 的索引是否满足需求?
10、说一下数据库的事务隔离?
11、说一下 mysql 常用的引擎?
12、说一下 mysql 的行锁和表锁?
13、说一下乐观锁和悲观锁?
14、mysql 问题排查都有哪些手段?
15、如何做 mysql 的性能优化?

十五、Redis
1、Redis是什么?都有哪些使用场景?
2、Redis有哪些功能?
3、Redis和 memecache 有什么区别?
4、Redis为什么是单线程的?
5、什么是缓存穿透?怎么解决?
6、Redis支持的数据类型有哪些?
7、Redis支持的 java 客户端都有哪些?
8、jedis 和 redisson 有哪些区别?
9、怎么保证缓存和数据库数据的一致性?
10、Redis持久化有几种方式?
11、Redis怎么实现分布式锁?
12、Redis分布式锁有什么缺陷?
13、Redis如何做内存优化?
14、Redis淘汰策略有哪些?
15、Redis常见的性能问题有哪些?该如何解决?

十六、JVM
1、说一下 jvm 的主要组成部分?及其作用?
2、说一下 jvm 运行时数据区?
3、说一下堆栈的区别?
4、什么是类加载器,类加载器有哪些?
5、什么是双亲委派模型?
6、说一下类加载的执行过程?
7、怎么判断对象是否可以被回收?
8、java 中都有哪些引用类型?
9、说一下 jvm 有哪些垃圾回收算法?
10、说一下 jvm 有哪些垃圾回收器?
11、详细介绍一下 CMS 垃圾回收器?
12、新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?
13、简述分代垃圾回收器是怎么工作的?
14、说一下 jvm 调优的工具?
15、常用的 jvm 调优的参数都有哪些?
16、Java 类加载过程?
17、描述一下 JVM 加载 Class 文件的原理机制?
18、Java 内存分配。
19、GC 是什么? 为什么要有 GC?
20、简述 Java 垃圾回收机制
21、如何判断一个对象是否存活?(或者 GC 对象的判定方法)
22、垃圾回收的优点和原理。并考虑 2 种回收机制
23、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
24、Java 中会存在内存泄漏吗,请简单描述
25、深拷贝和浅拷贝。
26、System.gc() 和 Runtime.gc() 会做什么事情?
27、finalize() 方法什么时候被调用?析构函数 (finalization) 的目的是什么?
28、如果对象的引用被置为 null,垃圾收集器是否会立即释放对象占用的内存?
29、串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?
30、在 Java 中,对象什么时候可以被垃圾回收?
31、简述 Java 内存分配与回收策略以及 Minor GC 和 Major GC。
32、VM 的永久代中会发生垃圾回收么?
33、Java 中垃圾收集的方法有哪些?

十七、Dubbo 面试题(未掌握,暂时不做)
为什么要用 Dubbo?
Dubbo 的整体架构设计有哪些分层?
默认使用的是什么通信框架,还有别的选择吗?
服务调用是阻塞的吗?
一般使用什么注册中心?还有别的选择吗?
默认使用什么序列化框架,你知道的还有哪些?
服务提供者能实现失效踢出是什么原理?
服务上线怎么不影响旧版本?
如何解决服务调用链过长的问题?
说说核心的配置有哪些?
Dubbo 推荐用什么协议?
同一个服务多个注册的情况下可以直连某一个服务吗?
画一画服务注册与发现的流程图?
Dubbo 集群容错有几种方案?
Dubbo 服务降级,失败重试怎么做?
Dubbo 使用过程中都遇到了些什么问题?
Dubbo Monitor 实现原理?
Dubbo 用到哪些设计模式?
Dubbo 配置文件是如何加载到 Spring 中的?
Dubbo SPI 和 Java SPI 区别?
Dubbo 支持分布式事务吗?
Dubbo 可以对结果进行缓存吗?
服务上线怎么兼容旧版本?
Dubbo 必须依赖的包有哪些?
Dubbo telnet 命令能做什么?
Dubbo 支持服务降级吗?
Dubbo 如何优雅停机?
Dubbo 和 Dubbox 之间的区别?
Dubbo 和 Spring Cloud 的区别?
你还了解别的分布式框架吗?
十八、Elasticsearch 面试题(未掌握,暂时不做)
elasticsearch 了解多少,说说你们公司 es 的集群架构,索引数据大小,分片有多少,以及一些调优手段 。
elasticsearch 的倒排索引是什么
elasticsearch 索引数据多了怎么办,如何调优,部署
elasticsearch 是如何实现 master 选举的
详细描述一下 Elasticsearch 索引文档的过程
详细描述一下 Elasticsearch 搜索的过程?
Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法
lucence 内部结构是什么?
Elasticsearch 是如何实现 Master 选举的?
Elasticsearch 中的节点(比如共 20 个),其中的 10 个选了一个 master,另外 10 个选了另一个 master,怎么办?
客户端在和集群连接时,如何选择特定的节点执行请求的?
详细描述一下 Elasticsearch 索引文档的过程。
详细描述一下 Elasticsearch 更新和删除文档的过程。
详细描述一下 Elasticsearch 搜索的过程
在 Elasticsearch 中,是怎么根据一个词找到对应的倒排索引的?
Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法?
对于 GC 方面,在使用 Elasticsearch 时要注意什么?
Elasticsearch 对于大数据量(上亿量级)的聚合如何实现?
在并发情况下,Elasticsearch 如果保证读写一致?
如何监控 Elasticsearch 集群状态?
介绍下你们电商搜索的整体技术架构
介绍一下你们的个性化搜索方案?
是否了解字典树?
拼写纠错是如何实现的?

详情

一、hashcode是什么?有什么作用?
Java中Object有一个方法:

public native int hashcode();
1、hashcode()方法的作用
hashcode()方法主要配合基于散列的集合一起使用,比如HashSet、HashMap、HashTable。

当集合需要添加新的对象时,先调用这个对象的hashcode()方法,得到对应的hashcode值,实际上hashmap中会有一个table保存已经存进去的对象的hashcode值,如果table中没有改hashcode值,则直接存入,如果有,就调用equals方法与新元素进行比较,相同就不存了,不同就存入。

2、equals和hashcode的关系
如果equals为true,hashcode一定相等;
如果equals为false,hashcode不一定不相等;
如果hashcode值相等,equals不一定相等;
如果hashcode值不等,equals一定不等;
3、重写equals方法时,一定要重写hashcode方法
二、Java 容器都有哪些?
1、Collection
(1)set

HashSet、TreeSet

(2)list

ArrayList、LinkedList、Vector

2、Map
HashMap、HashTable、TreeMap

三、Collection 和 Collections 有什么区别?
1、Collection是最基本的集合接口,Collection派生了两个子接口list和set,分别定义了两种不同的存储方式。

2、Collections是一个包装类,它包含各种有关集合操作的静态方法(对集合的搜索、排序、线程安全化等)。

此类不能实例化,就像一个工具类,服务于Collection框架。

四、list与Set区别
1、List简介
实际上有两种List:一种是基本的ArrayList,其优点在于随机访问元素,另一种是LinkedList,它并不是为快速随机访问设计的,而是快速的插入或删除。
ArrayList:由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。
LinkedList :对顺序访问进行了优化,向List中间插入与删除的开销并不大。随机访问则相对较慢。
还具有下列方 法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。

2、Set简介
Set具有与Collection完全一样的接口,因此没有任何额外的功能。实际上Set就是Collection,只是行为不同。这是继承与多态思想的典型应用:表现不同的行为。Set不保存重复的元素(至于如何判断元素相同则较为负责)

Set : 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。
HashSet:为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
TreeSet: 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。

3、list与Set区别
(1)List,Set都是继承自Collection接口
(2)List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。)
(3)Set和List对比:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。

五、Synchronized 用过吗,其原理是什么?
Java多线程基础知识总结(绝对经典)

六、jsp 和 servlet 有什么区别?
1、servlet是服务器端的Java程序,它担当客户端和服务端的中间层。

2、jsp全名为Java server pages,中文名叫Java服务器页面,其本质是一个简化的servlet设计。JSP是一种动态页面设计,它的主要目的是将表示逻辑从servlet中分离出来。

3、JVM只能识别Java代码,不能识别JSP,JSP编译后变成了servlet,web容器将JSP的代码编译成JVM能够识别的Java类(servlet)。

4、JSP有内置对象、servlet没有内置对象。

七、请列举出在 JDK 中几个常用的设计模式?
1、单例模式
作用:保证类只有一个实例。

JDK中体现:Runtime类。

2、静态工厂模式
作用:代替构造函数创建对象,方法名比构造函数清晰。

JDK中体现:Integer.valueOf、Class.forName

3、抽象工厂
作用:创建某一种类的对象。

JDK中体现:Java.sql包。

4、原型模式
clone();

原型模式的本质是拷贝原型来创建新的对象,拷贝是比new更快的创建对象的方法,当需要大批量创建新对象而且都是同一个类的对象的时候考虑使用原型模式。

一般的克隆只是浅拷贝(对象的hash值不一样,但是对象里面的成员变量的hash值是一样的)。

有些场景需要深拷贝,这时我们就要重写clone方法,以ArrayList为例:

5、适配器模式
作用:使不兼容的接口相容。

JDK中体现:InputStream、OutputStream。

6、装饰器模式
作用:为类添加新的功能,防止类继承带来的类爆炸。

JDK中体现:io类、Collections、List。

7、外观模式
作用:封装一组交互类,一直对外提供接口。

JDK中体现:logging包。

8、享元模式
作用:共享对象、节省内存。

JDK中体现:Integer.valueOf、String常量池。

9、代理模式
作用:

(1)透明调用被代理对象,无须知道复杂实现细节;

(2)增加被代理类的功能;

JDK中体现:动态代理。

10、迭代器模式
作用:将集合的迭代和集合本身分离。

JDK中体现:Iterator

11、命令模式
作用:封装操作,使接口一致。

JDK中体现:Runable、Callable、ThreadPoolExecutor。

八、什么是 Spring 框架?Spring 框架有哪些主要模块?
Spring是一个控制反转和面向切面的容器框架。

Spring有七大功能模块:

1、Core

Core模块是Spring的核心类库,Core实现了IOC功能。

2、AOP

Apring AOP模块是Spring的AOP库,提供了AOP(拦截器)机制,并提供常见的拦截器,供用户自定义和配置。

3、orm

提供对常用ORM框架的管理和支持,hibernate、mybatis等。

4、Dao

Spring提供对JDBC的支持,对JDBC进行封装。

5、Web

对Struts2的支持。

6、Context

Context模块提供框架式的Bean的访问方式,其它程序可以通过Context访问Spring的Bean资源,相当于资源注入。

7、MVC

MVC模块为spring提供了一套轻量级的MVC实现,即Spring MVC。

九、使用 Spring 框架能带来哪些好处?
1、轻量级框架、容器
Spring是一个容器,管理对象的生命周期和配置。基于一个可配置原型prototype,你的bean可以使单利的,也可以每次需要时都生成一个新的实例。

2、控制反转IOC
Spring通过控制反转实现松耦合。

3、支持AOP
Spring提供对AOP的支持,它允许将一些通用任务,如安全、事务、日志等进行集中式处理,从而提高了程序的复用性。

4、轻量级框架
5、方便测试
Spring提供Junit4的支持,可以通过注解方便测试spring程序。

6、对Java中很多API进行了封装
7、方便集成各种优秀框架
如Struts、hibernate、mybstis。

8、支持声明式事务处理
只需通过配置就可以完成对事务的管理,而无须手动编程。

十、什么是 Spring Boot?Spring Boot 有哪些优点?
1、Spring Boot简介
基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突、引用的不稳定性得到了解决。

2、Spring Boot 有哪些优点?
快速构建项目,可以选一些必要的组件;
对主流框架的无配置集成;
内嵌Tomcat容器,项目可独立运行;
删除了繁琐的xml配置文件;
极大地提高了开发和部署效率;
提供starter,简化maven配置;
3、SpringBoot有哪些缺点?
版本迭代速度快,一些模块改动很大;
由于无须配置,报错时很难定位;
十一、为什么要使用 hibernate?
1、hibernate对jdbc进行了封装,简化了JDBC的重复性代码;

2、hibernate对dao有一个封装类hibernateTemplate,可以继承它,实现简单的CRUD接口。

3、hibernate使用注解和配置文件,可以对实体类和映射文件进行映射;

4、hibernate有事务管理机制,保证了数据的安全性;

5、hibernate有一级缓存和二级缓存;

十二、mybatis 中 #{}和 KaTeX parse error: Expected 'EOF', got '#' at position 13: {}的区别是什么? 1、#̲{}带引号,{}不带引号;

2、#{}可以防止SQL注入;

3、${}常用于数据库表名、order by子句;

4、一般能用#{}就不要使用${};

十三、RabbitMQ的使用场景有哪些?
1、解决异步问题
例如用户注册,发送邮件和短信反馈注册成功,可以使用RabbitMQ消息队列,用户无需等待反馈。

2、服务间解耦
订单系统和库存系统,中间加入RabbitMQ消息队列,当库存系统出现问题时,订单系统依旧能正常使用,降低服务间耦合度。

3、秒杀系统
利用RabbitMQ的最大值,实现秒杀系统。

十四 、数据库的三范式是什么?
1、列不可再分;

2、每一行数据只做一件事,只与一列相关,主键;

3、每个属性都与主键有直接关系,而不是间接关系;

三大范式只是设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情结,当然要特殊对待,数据库设计最重要的是看需求和性能,需求>性能>表结构。

所以不能一味的追求三范式建立数据库。

十五、Redis是什么?都有哪些使用场景?
1、Redis是什么?
Redis是非关系型、基于内存的数据库,提供一定的持久化工厂,提供键值对形式的数据存储,数据类型包括string、list、set、hash等;
Redis支持多语言,使用方便;
支持每秒十几万的读写操作,性能远超关系型数据库,支持集群、分布式、主从同步;
具有一定的事务能力,保证了高并发的场景下数据的安全性和一致性;
2、Redis都有哪些使用场景?
读取缓存用的数据(读操作远大于写操作的数据),比如首页。
高速读写场合,如秒杀,抢红包等高并发场景。
十六、说一下 jvm 的主要组成部分?及其作用?
JVM包括类加载子系统、堆、方法区、栈、本地方法栈、程序计数器、直接内存、垃圾回收器、执行引擎。

1、类加载子系统
类加载子系统负责加载class信息,加载的类信息存放于方法区中。

2、直接内存
直接内存是在Java堆外的、直接向系统申请的内存空间。访问直接内存的速度会由于Java堆。出于性能的考虑,读写频繁的场合可能会考虑使用直接内存。

3、垃圾回收器
垃圾回收器可以对堆、方法区、直接内存进行回收。

4、执行引擎
执行引擎负责执行虚拟机的字节码,虚拟机会使用即时编译技术将方法编译成机器码后再执行。

十七、说一下 jvm 运行时数据区?
运行时数据区包括堆、方法区、栈、本地方法栈、程序计数器。

1、堆
堆解决的是对象实例存储的问题,垃圾回收器管理的主要区域。

2、方法区
方法区可以认为是堆的一部分,用于存储已被虚拟机加载的信息,常量、静态变量、即时编译器编译后的代码。

3、栈
栈解决的是程序运行的问题,栈里面存的是栈帧,栈帧里面存的是局部变量表、操作数栈、动态链接、方法出口等信息。

栈帧
每个方法从调用到执行的过程就是一个栈帧在虚拟机栈中入栈到出栈的过程。

局部变量表
用于保存函数的参数和局部变量。

操作数栈
操作数栈又称操作栈,大多数指令都是从这里弹出数据,执行运算,然后把结果压回操作数栈。

4、本地方法栈
与栈功能相同,本地方法栈执行的是本地方法,一个Java调用非Java代码的接口。

5、程序计数器(PC寄存器)
程序计数器中存放的是当前线程所执行的字节码的行数。JVM工作时就是通过改变这个计数器的值来选取下一个需要执行的字节码指令。

相应的答案

一、JDK 和 JRE 有什么区别?
JDK(Java Development Kit),Java开发工具包

JRE(Java Runtime Environment),Java运行环境

JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。

二、== 和 equals 的区别是什么?
对于基本类型,==比较的是值;
对于引用类型,比较的是地址;
equals不能用于基本类型的比较;
如果没有重写equals,equals就相当于

如果重写了equals方法,equals比较的是对象的内容;
三、final 在 java 中有什么作用?
final修饰的成员变量,必须在声明的同时赋值,一旦创建不可修改;
final修饰的方法,不能被子类重写;
final类中的方法默认是final的;
private类型的方法默认是final的;
四、java 中的 Math.round(-1.5) 等于多少?
Math提供了三个与取整有关的方法:ceil、floor、round

1、ceil:向上取整;

Math.ceil(11.3) = 12;

Math.ceil(-11.3) = 11;

2、floor:向下取整;

Math.floor(11.3) = 11;

Math.floor(-11.3) = -12;

3、round:四舍五入;

加0.5然后向下取整。

Math.round(11.3) = 11;

Math.round(11.8) = 12;

Math.round(-11.3) = -11;

Math.round(-11.8) = -12;

五、String 属于基础的数据类型吗?
不属于。

八种基本数据类型:byte、short、char、int、long、double、float、boolean。

六、String str="i"与 String str=new String(“i”)一样吗?
String str="i"会将起分配到常量池中,常量池中没有重复的元素,如果常量池中存中i,就将i的地址赋给变量,如果没有就创建一个再赋给变量。

String str=new String(“i”)会将对象分配到堆中,即使内存一样,还是会重新创建一个新的对象。

七、如何将字符串反转?
将对象封装到stringBuilder中,调用reverse方法反转。

八、String 类的常用方法都有那些?
1、常见String类的获取功能

length:获取字符串长度;
charAt(int index):获取指定索引位置的字符;
indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引;

substring(int start):从指定位置开始截取字符串,默认到末尾;
substring(int start,int end):从指定位置开始到指定位置结束截取字符串;
2、常见String类的判断功能

equals(Object obj): 比较字符串的内容是否相同,区分大小写;
contains(String str): 判断字符串中是否包含传递进来的字符串;
startsWith(String str): 判断字符串是否以传递进来的字符串开头;
endsWith(String str): 判断字符串是否以传递进来的字符串结尾;
isEmpty(): 判断字符串的内容是否为空串"";
3、常见String类的转换功能

byte[] getBytes(): 把字符串转换为字节数组;
char[] toCharArray(): 把字符串转换为字符数组;
String valueOf(char[] chs): 把字符数组转成字符串。valueOf可以将任意类型转为字符串;
toLowerCase(): 把字符串转成小写;
toUpperCase(): 把字符串转成大写;
concat(String str): 把字符串拼接;
4、常见String类的其他常用功能

replace(char old,char new) 将指定字符进行互换
replace(String old,String new) 将指定字符串进行互换
trim() 去除两端空格
int compareTo(String str) 会对照ASCII 码表 从第一个字母进行减法运算 返回的就是这个减法的结果,如果前面几个字母一样会根据两个字符串的长度进行减法运算返回的就是这个减法的结果,如果连个字符串一摸一样 返回的就是0。

九、new String(“a”) + new String(“b”) 会创建几个对象?
对象1:new StringBuilder()

对象2:new String(“a”)

对象3:常量池中的"a"

对象4:new String(“b”)

对象5:常量池中的"b"

深入剖析:StringBuilder中的toString():

对象6:new String(“ab”)

强调一下,toString()的调用,在字符串常量池中,没有生成"ab"

附加题:

String s1 = new String(“1”) + new String(“1”);//s1变量记录的地址为:new String
s1.intern();//在字符串常量池中生成"11"。如何理解:jdk6:创建了一个新的对象"11",也就有新的地址;jdk7:此时常量池中并没有创建"11",而是创建了一个指向堆空间中new String(“11”)的地址;
String s2 = “11”;
System.out.println(s1 == s2);//jdk6:false;jdk7:true
十、普通类和抽象类有哪些区别?
抽象类不能被实例化;
抽象类可以有抽象方法,只需申明,无须实现;
有抽象方法的类一定是抽象类;
抽象类的子类必须实现抽象类中的所有抽象方法,否则子类仍然是抽象类;
抽象方法不能声明为静态、不能被static、final修饰。
十一、接口和抽象类有什么区别?
1、接口

接口使用interface修饰;
接口不能实例化;
类可以实现多个接口;
①java8之前,接口中的方法都是抽象方法,省略了public abstract。②java8之后;接口中可以定义静态方法,静态方法必须有方法体,普通方法没有方法体,需要被实现;
2、抽象类

抽象类使用abstract修饰;
抽象类不能被实例化;
抽象类只能单继承;
抽象类中可以包含抽象方法和非抽象方法,非抽象方法需要有方法体;
如果一个类继承了抽象类,①如果实现了所有的抽象方法,子类可以不是抽象类;②如果没有实现所有的抽象方法,子类仍然是抽象类。
十二、java 中 IO 流分为几种?
1、按流划分,可以分为输入流和输出流;

2、按单位划分,可以分为字节流和字符流;

字节流:inputStream、outputStream;

字符流:reader、writer;

十三、说一下 jsp 的 4 种作用域?
application、session、request、page

十四、BIO、NIO、AIO 有什么区别?
1、同步阻塞BIO

一个连接一个线程。

JDK1.4之前,建立网络连接的时候采用BIO模式,先在启动服务端socket,然后启动客户端socket,对服务端通信,客户端发送请求后,先判断服务端是否有线程响应,如果没有则会一直等待或者遭到拒绝请求,如果有的话会等待请求结束后才继续执行。

2、同步非阻塞NIO

NIO主要是想解决BIO的大并发问题,BIO是每一个请求分配一个线程,当请求过多时,每个线程占用一定的内存空间,服务器瘫痪了。

JDK1.4开始支持NIO,适用于连接数目多且连接比较短的架构,比如聊天服务器,并发局限于应用中。

一个请求一个线程。

3、异步非阻塞AIO

一个有效请求一个线程。

JDK1.7开始支持AIO,适用于连接数目多且连接比较长的结构,比如相册服务器,充分调用OS参与并发操作。

十五、Files的常用方法都有哪些?
exist
createFile
createDirectory
write
read
copy
size
delete
move
十六、什么是反射?
所谓反射,是java在运行时进行自我观察的能力,通过class、constructor、field、method四个方法获取一个类的各个组成部分。

在Java运行时环境中,对任意一个类,可以知道类有哪些属性和方法。这种动态获取类的信息以及动态调用对象的方法的功能来自于反射机制。

十七、什么是 java 序列化?什么情况下需要序列化?
序列化就是一种用来处理对象流的机制。将对象的内容流化,将流化后的对象传输于网络之间。

序列化是通过实现serializable接口,该接口没有需要实现的方法,implement Serializable只是为了标注该对象是可被序列化的,使用一个输出流(FileOutputStream)来构造一个ObjectOutputStream对象,接着使用ObjectOutputStream对象的writeObejct(Object object)方法就可以将参数的obj对象到磁盘,需要恢复的时候使用输入流。

序列化是将对象转换为容易传输的格式的过程。

例如,可以序列化一个对象,然后通过HTTP通过Internet在客户端和服务器之间传输该对象。在另一端,反序列化将从流中心构造成对象。

一般程序在运行时,产生对象,这些对象随着程序的停止而消失,但我们想将某些对象保存下来,这时,我们就可以通过序列化将对象保存在磁盘,需要使用的时候通过反序列化获取到。

对象序列化的最主要目的就是传递和保存对象,保存对象的完整性和可传递性。

譬如通过网络传输或者把一个对象保存成本地一个文件的时候,需要使用序列化。

十八、为什么要使用克隆?如何实现对象克隆?深拷贝和浅拷贝区别是什么?
1、什么要使用克隆?

想对一个对象进行复制,又想保留原有的对象进行接下来的操作,这个时候就需要克隆了。

2、如何实现对象克隆?

实现Cloneable接口,重写clone方法;
实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深克隆。
BeanUtils,apache和Spring都提供了bean工具,只是这都是浅克隆。
3、深拷贝和浅拷贝区别是什么?

浅拷贝:仅仅克隆基本类型变量,不克隆引用类型变量;
深克隆:既克隆基本类型变量,又克隆引用类型变量;
4、代码实例

十九、throw 和 throws 的区别?
1、throw

作用在方法内,表示抛出具体异常,由方法体内的语句处理;
一定抛出了异常;
2、throws

作用在方法的声明上,表示抛出异常,由调用者来进行异常处理;
可能出现异常,不一定会发生异常;
二十、final、finally、finalize 有什么区别?
final可以修饰类,变量,方法,修饰的类不能被继承,修饰的变量不能重新赋值,修饰的方法不能被重写

finally用于抛异常,finally代码块内语句无论是否发生异常,都会在执行finally,常用于一些流的关闭。

finalize方法用于垃圾回收。

一般情况下不需要我们实现finalize,当对象被回收的时候需要释放一些资源,比如socket链接,在对象初始化时创建,整个生命周期内有效,那么需要实现finalize方法,关闭这个链接。

但是当调用finalize方法后,并不意味着gc会立即回收该对象,所以有可能真正调用的时候,对象又不需要回收了,然后到了真正要回收的时候,因为之前调用过一次,这次又不会调用了,产生问题。所以,不推荐使用finalize方法。

二十一、try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

二十二、常见的异常类有哪些?
NullPointerException:空指针异常;
SQLException:数据库相关的异常;
IndexOutOfBoundsException:数组下角标越界异常;
FileNotFoundException:打开文件失败时抛出;
IOException:当发生某种IO异常时抛出;
ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出此异常;
NoSuchMethodException:无法找到某一方法时,抛出;
ArrayStoreException:试图将错误类型的对象存储到一个对象数组时抛出的异常;
NumberFormatException:当试图将字符串转换成数字时,失败了,抛出;
IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。
ArithmeticException当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。

下一片

Java面试题总结(乱序版,2020-08-18)

哪 吒

于 2020-08-20 13:12:09 发布

4364
收藏 16
分类专栏: 高频面试题
版权

高频面试题
专栏收录该内容
26 篇文章241 订阅
订阅专栏
一、HashMap 和 Hashtable 有什么区别?
HashMap是线程不安全的,HashTable是线程安全的;
HashMap中允许键和值为null,HashTable不允许;
HashMap的默认容器是16,为2倍扩容,HashTable默认是11,为2倍+1扩容;
二、JVM 对 Java 的原生锁做了哪些优化?
1、自旋锁
在线程进行阻塞的时候,先让线程自旋等待一段时间,可能这段时间其它线程已经解锁,这时就无需让线程再进行阻塞操作了。

自旋默认次数是10次。

2、自适应自旋锁
自旋锁的升级,自旋的次数不再固定,由前一次自旋次数和锁的拥有者的状态决定。

3、锁消除
在动态编译同步代码块的时候,JIT编译器借助逃逸分析技术来判断锁对象是否只被一个线程访问,而没有其他线程,这时就可以取消锁了。

4、锁粗化
当JIT编译器发现一系列的操作都对同一个对象反复加锁解锁,甚至加锁操作出现在循环中,此时会将加锁同步的范围粗化到整个操作系列的外部。

锁粒度:不要锁住一些无关的代码。

锁粗化:可以一次性执行完的不要多次加锁执行。

三、为什么说 Synchronized 是非公平锁?
当锁被释放后,任何一个线程都有机会竞争得到锁,这样做的目的是提高效率,但缺点是可能产生线程饥饿现象。

四、jsp 有哪些内置对象?作用分别是什么?
JSP九大内置对象:

pageContext,页面上下文对象,相当于页面中所有功能的集合,通过它可以获取JSP页面的out、request、response、session、application对象。
request
response
session
application,应用程序对象,application实现了用户间数据的共享,可存放全局变量,它开始于服务器启动,知道服务器关闭。
page,就是JSP本身。
exception
out,out用于在web浏览器内输出信息,并且管理应用服务器上的输出缓冲区,作用域page。
config,取得服务器的配置信息。
五、http 响应码 301 和 302 代表的是什么?有什么区别?
301和302状态码都表示重定向,当浏览器拿到服务器返回的这个状态码后悔自动跳转到一个新的URL地址。

301代表永久性重定向,旧地址被永久移除,客户端向新地址发送请求。

302代表暂时性重定向,旧地址还在,客户端继续向旧地址发送请求。

303代表暂时性重定向,重定向到新地址时,必须使用GET方法请求新地址。

307代表暂时性重定向,与302的区别在于307不允许从POST改为GET。

307代表永久性重定向,与301的区别在于308不允许从POST改为GET。

六、什么是设计模式?你是否在你的代码里面使用过任何设计模式?
1、什么是设计模式?
设计模式是解决软件开发某些特定问题而提出的一些解决方案,也可以理解为解决问题的一些固定思路。

通过设计模式可以帮助我们增强代码的可复用性、可扩展性、灵活性。

我们使用设计模式的最终目的是实现代码的高内聚、低耦合。

2、设计模式的七大原则
单一职责原则
接口隔离原则
依赖倒转原则
里式替换原则
开闭原则
迪米特法则
合成复用原则
3、你是否在你的代码里面使用过任何设计模式?
(1)单例模式

JDK种的runtime,Spring种的singeton。

(2)简单工厂模式

Spring的BeanFactory,根据传入一个唯一标识来获得bean对象。

(3)原型模式

clone()

(4)代理模式

Spring的AOP中,Spring实现AOP功能的原理就是代理模式,①JDK动态代理。②CGLIB动态代理,使用Advice(通知)对类进行方法级别的切面增强。

(5)装饰器模式

为类添加新的功能,防止类爆炸;

IO流、数据源包装,Spring中用到的装饰器模式表现在Wrapper。

七、什么是控制反转(IOC)?什么是依赖注入?
借助Spring实现具有依赖关系的对象之间的解耦。

对象A运行需要对象B,由主动创建变为IOC容器注入,这便是控制反转。

获得依赖对象的过程被反转了,获取依赖对象的过程由自身创建变为由IOC容器注入,这便是依赖注入。

八、BeanFactory 和 ApplicationContext 有什么区别?
1、BeanFactory是Spring的最底层接口,包含bean的定义,管理bean的加载,实例化,控制bean的生命周期,特点是每次获取对象时才会创建对象。

ApplicationContext是BeanFactory的子接口,拥有BeanFactory的全部功能,并且扩展了很多高级特性,每次容器启动时就会创建所有的对象。

ApplicationContext的额外功能:

继承MessageSource,支持国际化;
统一的资源文件访问方式;
提供在监听器中注册bean;
同时加载过个配置文件;
载入多个(有继承关系)上下文,使得每个上下文都专注于一个特定的层次,比如应用的web层;
2、BeanFactory通常以编程的方式被创建,ApplicationContext可以以声明的方式创建,如使用ContextLoader。

3、BeanFactory 和 ApplicationContext都支持BeanPostProcessor,BeanFactoryPostProcessor,但BeanFactory需要手动注册,ApplicationContext则是自动注册。

九、什么是 JavaConfig?
JavaConfig是Spring3.0新增的概念,就是以注解的形式取代Spring中繁琐的xml文件。

JavaConfig结合了xml的解耦和java编译时检查的优点。

@Configuration,表示这个类是配置类;

@ComponentScan,相当于xml的<context:componentScan basepackage=>;

@Bean,相当于xml的;

@EnableWebMvc,相当于xml的mvc:annotation-driven;

@ImportResource,相当于xml的;

@PropertySource,用于读取properties配置文件;

@Profile,一般用于多环境配置,激活时可用@ActiveProfile(“dev”)注解;

十、什么是 ORM 框架?
ORM(Object-relational mapping),对象关系映射。

是为了解决面向对象与关系型数据库存在的不匹配问题。

ORM框架的优点:

开发效率更高
数据访问更抽象、轻便
支持面向对象封装
十一、mybatis 是否支持延迟加载?延迟加载的原理是什么?
1、mybatis 是否支持延迟加载?
延迟加载其实就是讲数据加载时机推迟,比如推迟嵌套查询的时机。

延迟加载可以实现先查询主表,按需实时做关联查询,返回关联表结果集,一定程度上提高了效率。

mybatis仅支持关联对象association和关联集合对象collection的延迟加载,association是一对一,collection是一对多查询,在mybatis配置文件中可以配置lazyloadingEnable=true/false。

2、延迟加载的原理是什么?
使用CGLIB为目标对象建立代理对象,当调用目标对象的方法时进入拦截器方法。

比如调用a.getB().getName(),拦截器方法invoke()发现a.getB()为null,会单独发送事先准备好的查询关联B对象的sql语句,把B查询出来然后调用a.setB(b),也是a的对象的属性b就有值了,然后调用getName(),这就是延迟加载的原理。

十二、RabbitMQ有哪些重要的角色?有哪些重要的组件?
1、RabbitMQ有哪些重要的角色?
客户端、RabbitMQ、服务端。

2、有哪些重要的组件?
(1)connectionFactory(连接管理器)

应用程序与RabbitMQ之间建立连接的管理器。

(2)Channel(信道)

消息推送使用的信道。

(3)RoutingKey(路由键)

用于把生产者的数据分配到交换机上。

(4)Exchange(交换机)

用于接受和分配消息。

(5)BindKey(绑定键)

用于把交换机的消息绑定到队列上

(6)Queue(队列)

用于存储生产者消息。

十三、一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
一般情况下,我们创建的表类型是InnoDB。

不重启MySQL,如果新增一条记录,id是8;
重启,ID是6;因为InnoDB表只把自增主键的最大ID记录在内存中,如果重启,已删除的最大ID会丢失。
如果表类型是MyISAM,重启之后,最大ID也不会丢失,ID是8;

InnoDB必须有主键(建议使用自增主键,不用UUID,自增主键索引查询效率高)、支持外键、支持事务、支持行级锁。

系统崩溃后,MyISAM很难恢复;

综合考虑,优先选择InnoDB,MySQL默认也是InnoDB。

十四、Redis有哪些功能?
1、服务端的数据缓存
专门部署一个Redis的服务器;

2、持久化
Redis持久化指的是Redis会把内存中的数据写到磁盘中,在Redis重启时先加载这些数据,就觉Redis服务器重启导致的内存丢失问题。

3、哨兵(Sentinel)和复制
Sentinel可以管理多个Redis服务器,它提供了监控、提醒以及自动的故障转移功能;

复制则是让Redis服务器可以配备备份的服务器;

Redis也是通过这两个功能保证Redis的高可用;

4、集群(Cluster)
单台服务器资源总是有上限的,CPU和IO资源可以通过主从复制,进行读写分离,把一部分CPU和IO的压力转移到从服务器上,但是内存资源怎么办,主从模式只是数据的备份,并不能扩充内存;

现在我们可以横向扩展,让每台服务器只负责一部分任务,然后将这些服务器构成一个整体,对外界来说,这一组服务器就像是集群一样。

十五、什么是类加载器,类加载器有哪些?

1、什么是类加载器?
类加载器负责加载所有的类,其为所有被载入内存的类生成一个java.lang.Class实例对象。

2、类加载器有哪些?
JVM有三种类加载器:

(1)启动类加载器

该类没有父加载器,用来加载Java的核心类,启动类加载器的实现依赖于底层操作系统,属于虚拟机实现的一部分,它并不继承自java.lang.classLoader。

(2)扩展类加载器

它的父类为启动类加载器,扩展类加载器是纯java类,是ClassLoader类的子类,负责加载JRE的扩展目录。

(3)应用程序类加载器

它的父类为扩展类加载器,它从环境变量classpath或者系统属性java.lang.path所指定的目录中加载类,它是自定义的类加载器的父加载器。

十六、说一下类加载的执行过程?
当程序主动使用某个类时,如果该类还未被加载到内存中,JVM会通过加载、连接、初始化3个步骤对该类进行类加载。

1、加载
加载指的是将类的class文件读入到内存中,并为之创建一个java.lang.Class对象。

类的加载由类加载器完成,类加载器由JVM提供,开发者也可以通过继承ClassLoader基类来创建自己的类加载器。

通过使用不同的类加载器可以从不同来源加载类的二进制数据,通常有如下几种来源:

从本地文件系统加载
从jar包加载
通过网络加载

一、java 中操作字符串都有哪些类?它们之间有什么区别?
1、String

String是不可变对象,每次对String类型的改变时都会生成一个新的对象。

2、StringBuilder

线程不安全,效率高,多用于单线程。

3、StringBuffer

线程安全,由于加锁的原因,效率不如StringBuilder,多用于多线程。

不频繁的字符串操作使用String,操作频繁的情况不建议使用String。

StringBuilder > StringBuffer > String。

二、说一下 HashMap 的实现原理?
1、简介
HashMap基于map接口,元素以键值对方式存储,允许有null值,HashMap是线程不安全的。

2、基本属性
初始化大小,默认16,2倍扩容;
负载因子0.75;
初始化的默认数组;
size
threshold。判断是否需要调整hashmap容量
3、HashMap的存储结构
JDK1.7中采用数组+链表的存储形式。

HashMap采取Entry数组来存储key-value,每一个键值对组成了一个Entry实体,Entry类时机上是一个单向的链表结构,它具有next指针,指向下一个Entry实体,以此来解决Hash冲突的问题。

HashMap实现一个内部类Entry,重要的属性有hash、key、value、next。

JDK1.8中采用数据+链表+红黑树的存储形式。当链表长度超过阈值(8)时,将链表转换为红黑树。在性能上进一步得到提升。

三、set有哪些实现类?
1、HashSet
HashSet是set接口的实现类,set下面最主要的实现类就是HashSet(也就是用的最多的),此外还有LinkedHashSet和TreeSet。
HashSet是无序的、不可重复的。通过对象的hashCode和equals方法保证对象的唯一性。
HashSet内部的存储结构是哈希表,是线程不安全的。
2、TreeSet
TreeSet对元素进行排序的方式:

元素自身具备比较功能,需要实现Comparable接口,并覆盖compareTo方法。
元素自身不具备比较功能,需要实现Comparator接口,并覆盖compare方法。
3、LinkedHashSet
LinkedHashSet是一种有序的Set集合,即其元素的存入和输出的顺序是相同的。

四、说一下 HashSet 的实现原理?
HashSet实际上是一个HashMap实例,数据存储结构都是数组+链表。

HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value都是一个统一的对象PRESENT。

private static final Object PRESENT = new Object();
HashSet中add方法调用的是底层HashMap中的put方法,put方法要判断插入值是否存在,而HashSet的add方法,首先判断元素是否存在,如果存在则插入,如果不存在则不插入,这样就保证了HashSet中不存在重复值。

通过对象的hashCode和equals方法保证对象的唯一性。

五、请谈谈 volatile 有什么特点,为什么它能保证变量对所有线程的可见性?
volatile只能作用于变量,保证了操作可见性和有序性,不保证原子性。

在Java的内存模型中分为主内存和工作内存,Java内存模型规定所有的变量存储在主内存中,每条线程都有自己的工作内存。

主内存和工作内存之间的交互分为8个原子操作:

lock
unlock
read
load
assign
use
store
write
volatile修饰的变量,只有对volatile进行assign操作,才可以load,只有load才可以use,,这样就保证了在工作内存操作volatile变量,都会同步到主内存中。

六、为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?什么是 CAS,它有什么特性?
Synchronized的并发策略是悲观的,不管是否产生竞争,任何数据的操作都必须加锁。

乐观锁的核心是CAS,CAS包括内存值、预期值、新值,只有当内存值等于预期值时,才会将内存值修改为新值。

七、乐观锁一定就是好的吗?
乐观锁认为对一个对象的操作不会引发冲突,所以每次操作都不进行加锁,只是在最后提交更改时验证是否发生冲突,如果冲突则再试一遍,直至成功为止,这个尝试的过程称为自旋。

乐观锁没有加锁,但乐观锁引入了ABA问题,此时一般采用版本号进行控制;
也可能产生自旋次数过多问题,此时并不能提高效率,反而不如直接加锁的效率高;
只能保证一个对象的原子性,可以封装成对象,再进行CAS操作;
八、forward 和 redirect 的区别?
forward是直接请求转发;redirect是间接请求转发,又叫重定向。
forward,客户端和浏览器执行一次请求;redirect,客户端和浏览器执行两次请求。
forward,经典的MVC模式就是forward;redirect,用于避免用户的非正常访问。(例如用户非正常访问,servlet就可以将HTTP请求重定向到登录页面)。
forward,地址不变;redirect,地址改变。
forward常用方法:RequestDispatcher类的forward()方法;redirect常用方法:HttpServletRequest类的sendRedirect()方法。
九、Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
保证程序只有一个对象的实例,叫做单例模式;

内部类的方式实现单例模式,是线程安全的;

双重验证方式实现单例模式也是线程安全的;

【源码分析设计模式 1】JDK中的单例模式

十、Spring 有几种配置方式?
1、xml配置文件

<?xml version="1.0" encoding="UTF-8"?>

<bean id="jackma" class="com.tyq.dto.User">
    <property name="name" value="jackma" />
    <property name="age" value="55" />
    <property name="dog" ref="jm" />
 </bean>

<bean id="jm" class="com.tyq.dto.Dog">
    <property name="name" value="jack" />
    <property name="breed" value="金毛" />
    <property name="age" value="2" />
</bean>
2、基于注解的方式 项目越来越大,基于xml配置太麻烦,Spring 2.x时代提供了声明bean的注解。

(1)Bean的定义

@Component、@Controller、@Service、@Repository。

(2)Bean的注入

@Autowire

3、基于Java的方式
Spring 3.x以后,可以通过Java代码装配Bean。

@Configuration
public class DemoConfig {
@Bean
public User jackma(){
return new User();
}
@Bean
public Dog dog(){
return new Dog();
}
@Bean //两个狗
public Dog haqi(){
return new Dog();
}
}
@Component(“jackma”)
public class User {
private String name;
private int age;
private Dog dog;

//get,set方法略
}
原来就是配置类啊,通过@Bean、@Component、getBean方式进行Bean的注册和发现。

十一、Spring Boot 中的监视器是什么?
监听器也叫listener,是servlet的监听器,可以用于监听web应用程序中某些对象的创建、销毁、增加、修改、删除等动作的发生,然后做出相应的响应处理。当范围对象的状态发生变化时,服务器自动调用监听器对象中的方法,常用于系统加载时进行信息初始化,统计在线人数和在线用户,统计网站的访问量。

配置监听器的方法:

通过@Component把监听器加入Spring容器中管理;
在application.properties中添加context.listener.classes配置;
在方法上加@EventListener注解;
十二、hibernate 中如何在控制台查看打印的 sql 语句?
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
十三、说一下 mybatis 的一级缓存和二级缓存?
一级缓存是session级别的缓存,默认开启,当查询一次数据库时,对查询结果进行缓存,如果之后的查询在一级缓存中存在,则无需再访问数据库;

二级缓存是sessionFactory级别的缓存,需要配置才会开启。当进行sql语句查询时,先查看一级缓存,如果不存在,访问二级缓存,降低数据库访问压力。

十四、RabbitMQ中 vhost 的作用是什么?
vhost可以理解为mini版的RabbitMQ,其内部均含有独立的交换机、绑定、队列,最重要的是拥有独立的权限系统,可以做到vhost范围内的用户控制。从RabbitMQ全局考虑,不同的应用可以跑在不同的vhost上,作为不同权限隔离的手段。

十五、如何获取当前数据库版本?
//MySQL,mysql -v
select version();
//Oracle
select * from v$version;
十六、Redis和 memecache 有什么区别?
1、Redis相比memecache,拥有更多的数据结构和支持更丰富的数据操作。

(1)Redis支持key-value,常用的数据类型主要有String、Hash、List、Set、Sorted Set。

(2)memecache只支持key-value。

2、内存使用率对比,Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于memecache。

3、性能对比:Redis只使用单核,memecache使用多核。

4、Redis支持磁盘持久化,memecache不支持。

Redis可以将一些很久没用到的value通过swap方法交换到磁盘。

5、Redis支持分布式集群,memecache不支持。

十七、怎么判断对象是否可以被回收?
1、引用计数算法
(1)判断对象的引用数量

通过判断对象的引用数量来决定对象是否可以被回收;
每个对象实例都有一个引用计数器,被引用+1,完成引用-1;
任何引用计数为0的对象实例可以被当做垃圾回收;
(2)优缺点

优点:执行效率高,程序受影响较小;
无法检测出循环引用的情况,导致内存泄漏;
2、可达性分析算法
通过判断对象的引用链是否可达来决定对象是否可以被回收。

如果程序无法再引用该对象,那么这个对象肯定可以被回收,这个状态称为不可达。

那么不可达状态如何判断呢?

答案是GC roots,也就是根对象,如果一个对象无法到达根对象的路径,或者说从根对象无法引用到该对象,该对象就是不可达的。

以下三种对象在JVM中被称为GC roots,来判断一个对象是否可以被回收。

(1)虚拟机栈的栈帧

每个方法在执行的时候,JVM都会创建一个相应的栈帧(操作数栈、局部变量表、运行时常量池的引用),当方法执行完,该栈帧就从栈中弹出,这样一来,方法中临时创建的独享就不存在了,或者说没有任何GC roots指向这些临时对象,这些对象在下一次GC的时候便会被回收。

(2)方法区中的静态属性

静态属性数据类属性,不属于任何实例,因此该属性自然会作为GC roots。这要这个class在,该引用指向的对象就一直存在,class也由被回收的时候。

class何时会被回收?

堆中不存在该类的任何实例
加载该类的classLoader已经被回收
该类的java.lang.class对象没有在任何地方被引用,也就是说无法通过反射访问该类的信息
(3)本地方法栈引用的对象

十八、java 中都有哪些引用类型?
1、强引用

Java中默认声明的就是强引用,比如:

Object obj = new Object();
obj = null;
只要强引用存在,垃圾回收器将永远不会回收被引用的对象。如果想被回收,可以将对象置为null;

2、软引用(SoftReference)

在内存足够的时候,软引用不会被回收,只有在内存不足时,系统才会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会跑出内存溢出异常。

byte[] buff = new byte[1024 * 1024];
SoftReference<byte[]> sr = new SoftReference<>(buff);
3、弱引用(WeakReference)

进行垃圾回收时,弱引用就会被回收。

4、虚引用(PhantomReference)

5、引用队列(ReferenceQueue)

引用队列可以与软引用、弱引用、虚引用一起配合使用。

当垃圾回收器准备回收一个对象时,如果发现它还有引用,就会在回收对象之前,把这个引用加入到引用队列中。

程序可以通过判断引用队列中是否加入了引用,来判断被引用的对象是否将要被垃圾回收,这样可以在对象被回收之前采取一些必要的措施。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值