面试题
Java 基础
- JDK 和 JRE 有什么区别?
JDK:jdk 包含jre jvm ,jdk是java开发工具包
JDK:jdk包含jvm,包含java基础类库 jdk是java运行环境
- == 和 equals 的区别是什么?
==:对比的是基本数据类型的值
equals:底层是==实现,但是对比的是hacode的值
- 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
String str1 = "通话";
String str2 = "重地";
System.out.println(String.format("str1:%d | str2:%d", str1.hashCode(),str2.hashCode()));
System.out.println(str1.equals(str2));
结果:
str1:1179395 | str2:1179395
false
- final 在 java 中有什么作用?
修饰类:不能被继承
修饰方法:表示方法不能被重写;
修饰基本数据类型:需要赋值, 且值固定不能发生改变
修饰引用数据类型:引用地址不能发生改变,值可以修改
- java 中的 Math.round(-1.5) 等于多少?
ceil的英文意义是天花板,该方法就表示向上取整
floor的英文意义是地板,该方法就表示向下取整
round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整
- String 属于基础的数据类型吗?
不属于,String属于引用数据类型,final修饰的类
String类型的字面值是存储在常量池中
- java 中操作字符串都有哪些类?它们之间有什么区别?
String: final修饰,String类的方法都是返回new String。即对String对象的任何改变都不影响到原对象,对字符串的修改操作都会生成新的对象。
StringBuffer:对字符串的操作的方法都加了synchronized,保证线程安全。
StringBuilder:StringBuilder : 不保证线程安全,在方法体内需要进行字符串的修改操作,可以new StringBuilder对象,调用StringBuilder对象的append、replace、delete等方法修改字符串。
Sting修饰的类不能被更改性能更低,占内存量更高 Stringbuffer Stringbuilder 加强了对字符串的操作 可以更改,但是StringBuffer的安全性能高,适合多线程使用,Stringbuider性能更低适合单线程操作
- String str="i"与 String str=new String(“i”)一样吗?
不一样,使用String str=“i”,java虚拟机会把它分配到常量池中,而 String str=new String(“i”)创建了一个对象,会被分到堆内存中。
Java为了避免产生大量的String对象,设计了一个字符串常量池。
工作原理是这样的,创建一个字符串时,JVM首先为检查字符串常量池中是否有值相等的字符串,如果有,则不再创建,直接返回该字符串的引用地址,
若没有,则创建,然后放到字符串常量池中,并返回新创建的字符串的引
- 如何将字符串反转?
利用Stringbuffer和Stringbuilder
递归
String 类的常用方法都有那些?
抽象类必须要有抽象方法吗?
普通类和抽象类有哪些区别?
抽象类能使用 final 修饰吗?
抽象类不能使用final方法, 因为抽象类不能实例化,子类必须实现父类的抽象方法
- 接口和抽象类有什么区别?
抽象类有构造方法,接口没有
抽象类有普通成员变量,接口中的成员变量是默认被final修饰的必须赋值且不能发生改变
抽象类有普通方法,如果接口需要定义普通方法的话需要default修饰
一个类可以实现多个接口,但只能继承一个抽象类
接口可以多实现,抽象类只能单一继承
java 中 IO 流分为几种?
BIO、NIO、AIO 有什么区别?
Files的常用方法都有哪些?
java 容器都有哪些?
容器
- Collection 和 Collections 有什么区别?
Collection:集合类的顶级接口
Collections:是集合的工具类,提供了一系列排序查找修改的静态方法
- List、Set、Map 之间的区别是什么?
List:有序能重复 ,可以为空
Set:无序不能重复 ,可以为空
List和Set都实现Collection
Map:map键值对映射,键值能为空
HashMap 和 Hashtable 有什么区别?
如何决定使用 HashMap 还是 TreeMap?
说一下 HashMap 的实现原理?
1.数据结构:数组,链表,红黑树
初始容量:16
加载因子:0.75
阈值大于12会发生扩容
数组大于64,阈值大于8时树化成红黑树
2:算法:利用hash算法决定k的值和位置
说一下 HashSet 的实现原理?
ArrayList 和 LinkedList 的区别是什么?
ArrayList:动态数组,查询速度快,增删慢
LinkedList:双向链表,查询速度慢,增删块,
如何实现数组和 List 之间的转换?
ArrayList 和 Vector 的区别是什么?
Array 和 ArrayList 有何区别?
在 Queue 中 poll()和 remove()有什么区别?
哪些集合类是线程安全的?
vector,concurrentHashMap,HashTable,stack
迭代器 Iterator 是什么?
Iterator 怎么使用?有什么特点?
Iterator 和 ListIterator 有什么区别?
怎么确保一个集合不能被修改?
多线程
- 并行和并发有什么区别?
并行指多个事件在同一个时刻发生;并发指在某时刻只有一个事件在发生,某个时间段内由于 CPU 交替执行,可以发生多个事件。
并行没有对 CPU 资源的抢占;并发执行的线程需要对 CPU 资源进行抢占。
并行执行的线程之间不存在切换;并发操作系统会根据任务调度系统给线程分配线程的 CPU 执行时间,线程的执行会进行切换。
- 线程和进程的区别?
进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。(进程是资源分配的最小单位)
线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)
守护线程是什么?
创建线程有哪几种方式?
thread runable callable 线程池
- 说一下 runnable 和 callable 有什么区别?
runable:run方法
callable:call方法
- 线程有哪些状态?
线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。
- sleep() 和 wait() 有什么区别?
sleep() 方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争cpu的执行时间。
因为sleep() 是static静态的方法,他不能改变对象的机锁,当一个synchronized块中调用了sleep() 方法,线程虽然进入休眠,但是对象的机锁没有被释放,其他线程依然无法访问这个对象。
wait()是Object类的方法,当一个线程执行到wait方法时,它就进入到一个和该对象相关的等待池,同时释放对象的机锁,使得其他线程能够访问,可以通过notify,notifyAll方法来唤醒等待的线程
sleep() 和 wait() 的区别就是 调用sleep方法的线程不会释放对象锁,而调用wait() 方法会释放对象锁
notify()和 notifyAll()有什么区别?
线程的 run()和 start()有什么区别?
44.创建线程池有哪几种方式?
newFixedThreadPool
newSingleThreadExector
newCachedThreadPool
45.线程池都有哪些状态?
1.RUNNING
状态说明:线程池处在RUNNING状态时,能够接收新任务,以及对已添加的任务进行处理。
状态切换:线程池的初始化状态是RUNNING。换句话说,线程池被一旦被创建,就处于RUNNING状态,并且线程池中的任务数为0!
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
2.SHUTDOWN
状态说明:线程池处在SHUTDOWN状态时,不接收新任务,但能处理已添加的任务。
状态切换:调用线程池的shutdown()接口时,线程池由RUNNING -> SHUTDOWN。
3.STOP
状态说明:线程池处在STOP状态时,不接收新任务,不处理已添加的任务,并且会中断正在处理的任务。
状态切换:调用线程池的shutdownNow()接口时,线程池由(RUNNING or SHUTDOWN ) -> STOP。
4.TIDYING
状态说明:当所有的任务已终止,ctl记录的”任务数量”为0,线程池会变为TIDYING状态。当线程池变为TIDYING状态时,会执行钩子函数terminated()。terminated()在ThreadPoolExecutor类中是空的,若用户想在线程池变为TIDYING时,进行相应的处理;可以通过重载terminated()函数来实现。
状态切换:当线程池在SHUTDOWN状态下,阻塞队列为空并且线程池中执行的任务也为空时,就会由 SHUTDOWN -> TIDYING。
当线程池在STOP状态下,线程池中执行的任务为空时,就会由STOP -> TIDYING。
5.TERMINATED
状态说明:线程池彻底终止,就变成TERMINATED状态。
状态切换:线程池处在TIDYING状态时,执行完terminated()之后,就会由 TIDYING -> TERMINATED。
线程池中 submit()和 execute()方法有什么区别?
在 java 程序中怎么保证多线程的运行安全?
多线程锁的升级原理是什么?
多线程synchronized 锁升级的原理
synchronized 锁升级原理:在锁对象的对象头里面有一个 threadid 字段,在第一次访问的时候 threadid 为空,jvm 让其持有偏向锁,并将 threadid 设置为其线程 id,再次进入的时候会先判断 threadid 是否与其线程 id 一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了 synchronized 锁的升级。
锁的升级的目的
锁升级是为了减低了锁带来的性能消耗。在 Java 6 之后优化 synchronized 的实现方式,使用了偏向锁升级为轻量级锁再升级到重量级锁的方式,从而减低了锁带来的性能消耗。
- 什么是死锁?
互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链。
怎么防止死锁?
ThreadLocal 是什么?有哪些使用场景?
说一下 synchronized 底层实现原理?
synchronized 和 volatile 的区别是什么?
synchronized 和 Lock 有什么区别?
synchronized 和 ReentrantLock 区别是什么?
说一下 atomic 的原理?
反射
什么是反射?
什么是 java 序列化?什么情况下需要序列化?
动态代理是什么?有哪些应用?
怎么实现动态代理?
对象拷贝
为什么要使用克隆?
如何实现对象克隆?
深拷贝和浅拷贝区别是什么?
Java Web
jsp 和 servlet 有什么区别?
jsp 有哪些内置对象?作用分别是什么?
说一下 jsp 的 4 种作用域?
session 和 cookie 有什么区别?
说一下 session 的工作原理?
如果客户端禁止 cookie 能实现 session 还能用吗?
spring mvc 和 struts 的区别是什么?
如何避免 sql 注入?
什么是 XSS 攻击,如何避免?
什么是 CSRF 攻击,如何避免?
异常
- throw 和 throws 的区别?
1)throws 用在方法声明后,跟在后面的是异常类名 (Execution ),throw 用在方法体内,跟的是异常的对象名 (new Execution)。
2)throws 后可以跟多个异常类名,用逗号隔开;而 throw 只能抛出一个异常对象名。
3)throws 表示抛出的异常由该方法调用者处理,throw表示抛出的异常由自己处理(定义方法体内)
4)throws 表示会出现异常的一种可能性,不一定会发生该异常;throw 要是执行了则一定抛出了某种异常且后面的代码都不执行。
- final、finally、finalize 有什么区别?
final:
如果一个类被声明为 final ,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract 的,又被声明为 final 的。
将变量或方法声明为 final ,可以保证它们在使用中不被改变。被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为 final 的方法也同样只能使用,不能重写。
另外,在早期的 Java 实现版本中,会将 final 方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的 Java 版本已经不需要使用 final 方法进行这些优化了)。类中所有的private 方法都隐式地指定为 final 。
String 、Integer、Long等类都是final修饰的类。其保存值的属性也是final修饰的。
final修饰基本数据类型和修饰引用数据类型。
如果final修饰的是一个基本数据类型的数据,一旦赋值后就不能再次更改 ,而对于引用类型变量而言,它仅仅保存的是一个引用,final只保证这个引用类型变量所引用的地址不会发生改变,即一直引用这个对象,但这个对象属性是可以改变的。
finally:
在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
通常在处理一些资源的时候,会使用finally来关闭相关资源。比如说:操作文件,使用ReentrantLock锁,分布式锁等。
在以下 4 种特殊情况下,finally块不会被执行:
在 finally 语句块中发生了异常。
在前面的代码中用了 System.exit() 退出程序。
程序所在的线程死亡。
关闭 CPU 。
finalize:
finalize是Object的一个方法,它的目的是保证对象在被垃圾收集前完成特定资源的回收。
不过finalize已经不推荐使用,JDK9已经标记为过时。
try-catch-finally 中哪个部分可以省略?
try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
会。
(1)finally的作用就是,无论出现什么状况,finally里的代码一定会被执行。
(2)如果在catch中return了,也会在return之前,先执行finally代码块。
(3)而且如果finally代码块中含有return语句,会覆盖其他地方的return。
(4)对于基本数据类型的数据,在finally块中改变return的值对返回值没有影响,而对引用数据类型的数据会有影响。
- 常见的异常类有哪些?
RunTime Exception 运行异常
Compilation Exception 编译异常
InputMisMatch Exception 输入类型不匹配{有可能是{nextInt异常,数据类型异常}
ArrayIndexOutOfBoundes Exception 数组索引越界
Arithmetiv Exception 算数异常
NullPointException空指针异常
IllegalAccessException:非法侵入异常
ConcurrentModificationException:并发修改异常
PersistenceException:映射文件加载异常
网络
http 响应码 301 和 302 代表的是什么?有什么区别?
forward 和 redirect 的区别?
简述 tcp 和 udp的区别?
tcp 为什么要三次握手,两次不行吗?为什么?
说一下 tcp 粘包是怎么产生的?
OSI 的七层模型都有哪些?
get 和 post 请求有哪些区别?
如何实现跨域?
说一下 JSONP 实现原理?
设计模式
说一下你熟悉的设计模式?
简单工厂和抽象工厂有什么区别?
Spring/Spring MVC
为什么要使用 spring?
解释一下什么是 aop?
解释一下什么是 ioc?
spring 有哪些主要模块?
spring 常用的注入方式有哪些?
spring 中的 bean 是线程安全的吗?
spring 支持几种 bean 的作用域?
spring 自动装配 bean 有哪些方式?
spring 事务实现方式有哪些?
说一下 spring 的事务隔离?
说一下 spring mvc 运行流程?
spring mvc 有哪些组件?
@RequestMapping 的作用是什么?
@Autowired 的作用是什么?
依赖注入
Spring Boot/Spring Cloud
什么是 spring boot?
为什么要用 spring boot?
spring boot 核心配置文件是什么?
spring boot 配置文件有哪几种类型?它们有什么区别?
spring boot 有哪些方式可以实现热部署?
jpa 和 hibernate 有什么区别?
什么是 spring cloud?
spring cloud 断路器的作用是什么?
spring cloud 的核心组件有哪些?
Hibernate
为什么要使用 hibernate?
什么是 ORM 框架?
hibernate 中如何在控制台查看打印的 sql 语句?
hibernate 有几种查询方式?
hibernate 实体类可以被定义为 final 吗?
在 hibernate 中使用 Integer 和 int 做映射有什么区别?
hibernate 是如何工作的?
get()和 load()的区别?
说一下 hibernate 的缓存机制?
hibernate 对象有哪些状态?
在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?
hibernate 实体类必须要有无参构造函数吗?为什么?
Mybatis
mybatis 中 #{}和 ${}的区别是什么?
mybatis 有几种分页方式?
RowBounds 是一次性查询全部结果吗?为什么?
mybatis 逻辑分页和物理分页的区别是什么?
mybatis 是否支持延迟加载?延迟加载的原理是什么?
说一下 mybatis 的一级缓存和二级缓存?
mybatis 和 hibernate 的区别有哪些?
mybatis 有哪些执行器(Executor)?
mybatis 分页插件的实现原理是什么?
mybatis 如何编写一个自定义插件?
RabbitMQ
rabbitmq 的使用场景有哪些?
rabbitmq 有哪些重要的角色?
rabbitmq 有哪些重要的组件?
rabbitmq 中 vhost 的作用是什么?
rabbitmq 的消息是怎么发送的?
rabbitmq 怎么保证消息的稳定性?
141.rabbitmq 怎么避免消息丢失?
要保证消息持久化成功的条件有哪些?
rabbitmq 持久化有什么缺点?
rabbitmq 有几种广播类型?
rabbitmq 怎么实现延迟消息队列?
rabbitmq 集群有什么用?
rabbitmq 节点的类型有哪些?
rabbitmq 集群搭建需要注意哪些问题?
rabbitmq 每个节点是其他节点的完整拷贝吗?为什么?
rabbitmq 集群中唯一一个磁盘节点崩溃了会发生什么情况?
rabbitmq 对集群节点停止顺序有要求吗?
Kafka
kafka 可以脱离 zookeeper 单独使用吗?为什么?
kafka 有几种数据保留的策略?
kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 kafka 将如何处理?
什么情况会导致 kafka 运行变慢?
使用 kafka 集群需要注意什么?
Zookeeper
zookeeper 是什么?
zookeeper 都有哪些功能?
zookeeper 有几种部署模式?
zookeeper 怎么保证主从节点的状态同步?
集群中为什么要有主节点?
集群中有 3 台服务器,其中一个节点宕机,这个时候 zookeeper 还可以使用吗?
说一下 zookeeper 的通知机制?
MySql
数据库的三范式是什么?
一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
如何获取当前数据库版本?
说一下 ACID 是什么?
char 和 varchar 的区别是什么?
float 和 double 的区别是什么?
mysql 的内连接、左连接、右连接有什么区别?
mysql 索引是怎么实现的?
怎么验证 mysql 的索引是否满足需求?
说一下数据库的事务隔离?
说一下 mysql 常用的引擎?
说一下 mysql 的行锁和表锁?
说一下乐观锁和悲观锁?
mysql 问题排查都有哪些手段?
如何做 mysql 的性能优化?
Redis
redis 是什么?都有哪些使用场景?
redis 有哪些功能?
redis 和 memecache 有什么区别?
redis 为什么是单线程的?
什么是缓存穿透?怎么解决?
redis 支持的数据类型有哪些?
redis 支持的 java 客户端都有哪些?
jedis 和 redisson 有哪些区别?
怎么保证缓存和数据库数据的一致性?
redis 持久化有几种方式?
189.redis 怎么实现分布式锁?
redis 分布式锁有什么缺陷?
redis 如何做内存优化?
redis 淘汰策略有哪些?
redis 常见的性能问题有哪些?该如何解决?
JVM
说一下 jvm 的主要组成部分?及其作用?
说一下 jvm 运行时数据区?
说一下堆栈的区别?
队列和栈是什么?有什么区别?
什么是双亲委派模型?
说一下类加载的执行过程?
怎么判断对象是否可以被回收?
java 中都有哪些引用类型?
说一下 jvm 有哪些垃圾回收算法?
说一下 jvm 有哪些垃圾回收器?
详细介绍一下 CMS 垃圾回收器?
新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?
简述分代垃圾回收器是怎么工作的?
说一下 jvm 调优的工具?
常用的 jvm 调优的参数都有哪些?·