【1年】Java面试题汇总
目录
Java基础
- JDK和JRE有什么区别?
答:JDK(Java Development Kit)Java开发工具集,JRE(Java Runtime Environment)Java运行环境。其中JDK包括JRE。JDK用于开发,JRE用于运行,JVM就是在JRE中。
- ==和equals的区别是什么?
答:这个分开两种类型解释,基础类型和包装类型。
-
- ==
- 基础类型(int、long等):比较值是否相等
- 包装类型(Integer、Long等):比较引用的对象地址是否相等
- equals
- 包装类型(Integer、Long等):比较引用的对象内容是否相等
- ==
- 两个对象的hashCode()相同,则equals()也一定为true,对吗?
答:不一定,hashCode相同只能说明两个对象计算的值一样,不一定键值对也相等。哈希冲突就可以解释这个,当哈希冲突时,当前key下接链表。
- final在Java中有什么作用?
答:修饰类、方法和变量
-
- 修饰类:表明这个类不能被继承
- 修饰方法:表明这个方法锁定,不能重写,但可以重载
- 修饰变量:表明变量只能被赋值一次,如果是引用类型,可以改变内容,但是不能改变引用地址
- Java中Math.round(-1,5)等于多少?
答:四舍五入, -1
- String属于基础的数据类型吗?
答:不是,是引用类型。
- Java中操作字符串都有哪些类?它们之间有什么区别?
答:String、StringBuffer、StringBuilder
-
- String
- 字符串不可变,对字符串修改操作都是重新创建对象
- String
-
- StringBuilder
- 字符串可变,对同一个对象操作,线程不安全,方法没有synchronize关键字修饰
- StringBuilder
-
- StringBuffer
- 字符串可变,对同一个对象操作,线程安全,方法有synchronize关键字修饰
- StringBuffer
- String str="i"与String str = new String("i")一样吗?
答:不一样
-
- String str=“i”;,存在方法区的常量池
- String str = new String("i");,存在堆中(创建了对象)
- 如何将字符串反转?
答:
-
- StringBuffer、StringBuilder的reverse()
- String转char[],逆序copy到新String
- String转char[],二分法交换字符,再讲char[]转String
- String的charAt()方法取出字符,再逆序copy到新String
- String类的常用方法都有哪些?
答:
-
- 长度:length()
- 数组:toCharArray()
- 判断:equals()
- 改变内容:substring()
- 位置:indexOf()、charAt()
- 抽象类必须有抽象方法吗?
答:不是,可以没有。
abstract class DemoClass{ public static void printMessage(String msg){ System.out.println(msg); } }
- 普通类和抽象类有哪些区别?
答:
-
- 普通类:不可以有抽象方法,可以被实例化
- 抽象类:不可实例化,抽象类的子类,要么也是抽象的,要么实现该抽象类声明的方法
- 抽象类能使用final修饰吗?
答:当然不可以啦,抽象类作用就是用于被继承,final修饰类时,类不可继承,两者自相矛盾。
- 接口和抽象类有什么区别?
答:
-
- 接口
- interface关键字修饰接口,implements关键字实现接口
- 不能实例化
- 任何field都是隐含public static final
- 主要目的:API定义与实现分离
- 抽象类
- abstract关键字修饰类,extends关键字继承接口
- 不能实例化
- 主要目的:代码复用
- 接口
- Java中IO流分为几种?
答:从3个维度分析吧
-
- 按流的流向:输入流和输出流
- 按操作单元:字节流和字符流
- 按流的角色:节点流和处理流
- BIO、NIO、AIO有什么区别?
答:
-
- BIO(Blocking I/O):同步阻塞I/O,也就是传统I/O
- NIO(New I/O):同步非阻塞I/O,jdk1.4以后引入java.nio,提供Channel、Selector、Buffer等对象,通过SocketChannel和ServerSocketChannel实现
- AIO(Asynchronous I/O):异步非阻塞I/O,也就是NIO2.0,jdk1.7引入,基于事件和回调机制实现的
- Files的常用方法都有哪些?
答:
-
- exists()检测文件路径是否存在
- createFile()创建文件
- delete()删除一个文件或者目录
- copy()复制文件
- read()读取文件
- write()写入文件
容器
- Java容器都有哪些?
答:总的来说,就两种:Collection、Map
- Collection和Collections有什么区别?
答:
-
- Collection:java.util.Collection是一个集合接口
- Collections:java.util.Collections是一个包装类,包含一些集合操作的静态方法
- List、Set、Map之间的区别是什么?
答:
-
- List:可重复、有序
- Set:不可重复、无序
- Map:采取键值对key-value,key唯一
- HashMap和HashTable有什么区别?
答:
-
- HashMap
- 非线程安全(方法没有synchronize)
- 允许null key和null value
- HashTable
- 线程安全(方法有synchronize)
- 不允许null key和null value
- HashMap
- 如何决定使用HashMap还是TreeMap?
答:需要有序结果用TreeMap,不需要太多排序用HashMap
-
- HashMap
- Key基于散列hashCode(),不支持排序
- 数据结构主要是数组、链表或红黑树
- TreeMap
- Key实现java.lang.Comparable,支持Key升序
- 数据结构基于红黑树
- HashMap
- 说一下HashMap的实现原理?
答:采用数组+链表/红黑树,出现哈希冲突时,在key位置下挂链表。扩容时,需要新建一个长度为原来长度2倍的新数组。HashMap转成红黑树的条件:链表长度到8、数组长度到64.
- 说一下HashSet的实现原理?
答:HashSet是基于HashMap实现的,操作基本都是直接调用HashMap的方法,HashSet不允许有重复值,元素无序。
- ArrayList和LinkedList的区别是什么?
答:
-
- ArrayList基于动态数组实现
- LinkedList基于双向链表实现
- 如何实现数组和List之间的转换?
答:
-
- 数组转List:使用java.util.Arrays工具类asList
- List转数组:使用List的toArray()方法
- ArrayList和Vector的区别是什么?
答:
-
- ArrayList
- 非线程安全
- 效率高
- 扩容机制:增加50%
- Vector
- 使用了Synchronize实现线程同步
- 效率低
- 扩容机制:增加1倍
- ArrayList
- Array和ArrayList有何区别?
答:
-
- Array
- 可以包含基本类型和对象类型
- 大小固定
- ArrayList
- 只能包含对象类型
- 大小动态变化
- Array
- 在Queue中poll()和remove()有什么区别?
答:poll()和remove()都移除并且返回队头,但是当队列为空时,poll()返回null,remove()抛出NoSuchElementException异常。
- 哪些集合类是线程安全的?
答:
-
- Vector
- HashTable
- ConcurrentHashMap
- Stack:继承于Vector
- 迭代器Iterator是什么?
答:可以用于遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现。
- Iterator怎么使用?有什么特点?
答:
怎么用
-
- Iterator()要求容器返回一个iterator
- 使用next()获取序列下一个元素
- 使用hashNext()检查序列中是否还有元素
- 使用remove()将迭代器返回的元素删除
特点
-
- 不允许线程对集合元素进行修改
- remove()方法移除集合中元素
- 依附于一个集合类对象
- Iterator和ListIterator有什么区别?
答:
-
- Iterator
- 可以遍历Set和List集合,正向遍历
- ListIterator
- 只能遍历List集合,正向和反向遍历
- 实现了Iterator接口,并包含如增加元素、替换元素等功能
- Iterator
- 怎么确保一个集合不能被修改?
答:如果考虑用final,就错了,final针对引用类型,只能是地址不变,内容可变的。因此应该采取Collections包下的方法Collections.unmodifiableList(List)和Collections.unmodifiableSet(Set)
多线程
- 并行和并发有什么区别?
答:
-
- 并行:多个线程任务在多个cpu同时执行
- 并发:多个线程任务在同一个cpu快速轮换执行
- 线程和进程的区别?
答:
-
- 进程:竞争系统资源的基本单位
- 线程:进程的一个执行单元,也称为轻量级进程
- 守护线程是什么?
答:专门用于服务其他的线程,如果其他的用户线程都执行完毕,且main线程也执行完毕,jvm退出,守护线程也会停止运行。例子“垃圾回收线程”就是一个守护线程。
- 创建线程有哪几种方式?
答:3种
-
- 继承Thread,重写run方法
- 实现Runnable接口
- 实现Callable接口
- 说一下runnable和callable有什么区别?
答:
-
- runnbale
- run接口无返回值
- 只能抛出运行时异常,无法捕获处理
- callable
- call方法有返回值,支持泛型
- 允许抛出异常,可以捕获异常信息
- runnbale
- 线程有哪些状态?
答:创建、就绪、运行、阻塞、死亡
-
- 创建:生成线程对象
- 就绪:调用start方法
- 运行:抢到cpu时间片
- 阻塞:线程运行时,被暂停
- 死亡:run方法执行完毕
- sleep()和wait()有什么区别?
答:都会让线程暂停。
-
- sleep()
- 来自Thread类的静态方法
- 暂停时,不会释放对象锁,到时间自动恢复
- wait()
- 来自Object类的成员方法
- 暂停时,放弃对象锁,进入等待队列,直到调用notify()
- sleep()
- notify()和notifyAll()有什么区别?
答:
-
- notify:唤醒的线程进入该对象的等待池,等待池中的线程不会去竞争该对象锁
- notifyAll:唤醒的线程进入该对象的锁池,锁池中的线程回去竞争该对象锁
- 线程的run()和start()有什么区别?
答:
-
- start():方法用来启动线程,轮到线程执行时,会调用run()方法
- run():抢到cpu时间片时,执行,次数不限制
- 创建线程池有哪几种方式?
答:
-
- newCachedThreadPool:可缓存线程池
- newFixedThreadPool:固定数量线程池
- newScheduledTHreadPool:延迟线程池
- newSingleThreadExecutor:单线程池
- 线程池都有哪些状态?
答:
-
- RUNNING:线程池一旦状态
- SHUTDOWN:不接受新任务,但是处理已排队的任务
- STOP:不接收新任务,不处理已排队的任务
- TIDYING:任务空
- TERMINATED:线程池彻底终止
- 线程池中submit()和execute()方法有什么区别?
答:
-
- submit()
- 执行后有返回值
- 不会抛出异常
- execute()
- 执行后没有返回值
- 会抛出异常
- submit()
- 在Java程序中怎么保证多线程的运行安全?
答:
-
- 使用synchronize关键字
- 使用volatile关键字
- lock锁机制
- 使用线程安全的类:Vector、HashTable、StringBuffer
- 多线程锁的升级原理是什么?
答:无锁->偏向锁->轻量级锁->重量级锁
- 什么是死锁?
答:
-
- 互斥条件:一个资源每次只能被一个线程调用
- 请求与保持条件:阻塞时,不释放资源
- 不剥夺条件:已获得的资源,未使用完之前,不能强行剥夺
- 循环等待
- 怎么防止死锁?
答:
-
- 设置加锁顺序
- 设置加锁时限
- 死锁检测
- ThreadLocal是什么?有哪些使用场景?
答:ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。经典实用场景:为每个线程分配一个JDBC连接的Connection,保证每个线程间不会影响各自的Connection。
- 说一下Synchronized底层实现原理?
答:底层是基于每个对象的监视器(monitor)来实现的,被synchronized修饰的代码,在被编译器编译后在被修饰的代码前后加上了一组字节指令。具体实现,哎。。。自己去看吧,一句两句说不清楚的。
- Synchronized和volatile的区别是什么?
答:
-
- synchonized
- 可以作用于变量、方法、对象
- 保证线程间的有序性、原子性和可见性
- 线程阻塞
- volatile
- 只能作用于变量
- 只保证了可见性,无法保证原子性
- 线程不阻塞
- synchonized
- Synchronized和Lock有什么区别?
答:
-
- synchronized
- 属于jvm界面
- 不需要手动释放锁
- 不可中断
- lock
- 是具体类java.util.concurrent.locks.lock,api层面的锁
- 需要手动释放锁,可能出现死锁现象
- 可中断
- synchronized
- Synchronized和ReentrantLock区别是什么?
答:
-
- synchronized
- 锁无法设置超时
- 无法实现公平锁
- JVM层面
- reentrantLock
- 锁可以设置超时
- 可以满足公平锁
- JDK代码层面
- synchronized
- 说一下Atomic的原理?
答:通过CAS原理解决并发情况下原子性问题。CAS(V, E, N)。V-需要更新的变量, E-变量当前期望值, N-更新为的值。
反射
- 什么是反射?
答:对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为Java的反射机制。
- 什么是Java序列化?什么情况下需要序列化?
答:将Java对象转换成字节流的过程。序列化是为了保存各种对象在内存中的状态。
需要序列化的场景:
-
- Java对象需要在网络上传输
- Java对象需要持久化存储到文件中
- 动态代理是什么?有哪些应用?
答:动态代理:运行时动态生成代理类。应用:AOP、事务、权限、日志。
两个重要的代理类和接口:InvocationHandler和Proxy
- 怎么实现动态代理?
答:
-
- JDK原生动态代理--基于接口实现
- CGLIB--基于继承当前类的子类实现
对象拷贝
- 为什么要使用克隆?
答:向对一个对象进行处理,又想保留原有的数据进行接下来的操作。
- 如何实现对象克隆?
答:
-
- 实现Cloneable接口,并重写Object类中的clone()方法【深、浅拷贝取决于代码实现】
- 实现Serializable接口,通过对象的序列化和反序列化实现克隆。【深拷贝】
- 深拷贝和浅拷贝区别是什么?
答:
-
- 深拷贝:复制变量值,对于引用数据,则递归到基本类型后,再复制。复制后的对象与原来的对象完全隔离,互不影响。
- 浅拷贝:复制对象属性,如果是引用类型时,实质复制的是其引用,改变值时,会影响原来的值。
Java Web
- JSP和servlet有什么区别?
答:servlet是一种服务器端的Java应用程序担当客户请求与服务器响应的中间层。JSP是一种动态页面技术。
- JSP有哪些内置对象?作用分别是什么?
答:request、response、session、application、out、pageContext、config、page、exception。作用见名取义吧。
- 说一下JSP的4种作用域?
答:
-
- application:在所有应用程序中有效
- session:在当前会话中有效
- request:在当前请求中有效
- page:在当前页面有效
- Session和Cookie有什么区别?
答:
-
- session
- 存储在服务器上
- 大小没限制
- 存储任何类型数据
- 不支持跨域访问
- cookie
- 存储在客户端浏览器上
- 大小
- 只能保管ASCII字符串
- 支持跨域访问
- session
- 说一下Session的工作原理?
答:客户端登录完毕-->服务器创建对应的session-->将sessionid发送客户端-->客户端存储在浏览器中,每次客户端访问服务器时,携带sessionid。
- 如果客户端禁止Cookie能实现Session还能用吗?
答:不能,sessionid是同cookie来传递的。可以用其他途径使用session:表单、数据库等【比较蠢,没用会这样吧】
- SpringMVC和struts的区别是什么?
答:StringMVC采用servlet实现,struts采用filter实现。至于struts,emmm没看过。
- 如何避免SQL注入?
答:
-
- 校验参数的数据格式是否合法
- 对特殊字符进行转义处理
- 预编译sql
- 什么XSS攻击,如何避免?
答:XSS攻击,即跨站脚本攻击(Cross Site Scripting)。
-
- web页面中,可由客户输入的地方,对输入的数据转义、过滤处理
- 后台输出页面时,也要对输出内容进行转义
- 什么是CSRF攻击,如何避免?
答:CSRF攻击,即跨站请求伪造攻击(Cross-site request forgery),攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作。
-
- 添加校验token
异常
- throw和throws的区别?
答:
-
- throw:表示方法内抛出某种异常对象
- throws:表示可能抛出某种异常
- final、finally、finalize有什么区别?
答:
-
- final:可以修饰类、方法、变量,表示不可变
- finally:保证某一段代码一定要被执行
- finalize:基础类java.lang.Object的一个方法,为了保证对象在垃圾回收之前完成特定资源的回收
- try-catch-finally中哪个部分可以省略?
答:可以try-catch、try-finally
- try-catch-finally中,如果catch中return了,finally还会执行吗?
答:会。原理去看编译吧,会更清楚。
- 常见的异常类有哪些?
答:
-
- NullPointException
- SQLException
- IndexOutOfBoundsException
网络
- HTTP响应码301和302代表的是什么?有什么区别?
答:
-
- 301(Moved Permanently):被请求的资源已永久移动到新位置
- 302(Found):请求的资源现在临时从不同的URI响应请求
- forward和redirect的区别?
答:
-
- forward(转发):服务器内部的重定向,客户端浏览器地址不变
- redirect(重定向):重定向页面,客户端浏览地址会改变
- 简述TCP和UDP的区别?
答:
-
- TCP
- 面向连接
- 可靠传输
- 通过三次握手建立连接
- 通讯完成时四次挥手
- UDP
- 面向无连接
- 不可靠传输
- 广播发送数据
- TCP
- TCP为什么要三次握手,两次不行吗?为什么?
答:确保双向连接时畅通的,两次握手只能保证单向连接时畅通的。
-
- step1 A->B:你好,B。
- step2 B->A:收到。你好,A。
- step3 A->B:收到,B。
- 说一下TCP粘包是怎么产生的?
答:粘包,即发送方发送的多个数据包,到接收方缓冲区首尾相连,粘成一包,被接收。产生原因,应用程序读取缓存中的数据包的速度小于接收数据包的速度。
- OSI的七层模型都有哪些?
答:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
- GET和POST请求有哪些区别?
答:实际上,二者底层都是TCP/IP。所以两者实现基本一样,但是有个重要区别。GET产生一个TCP数据包,POST产生两个TCP包。
-
- GET【幂等】:浏览器会将header和data一起发送出去,服务器响应200
- POST【非幂等】:浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200
- 如何实现跨域?
答:
-
- JSONP:兼容性好
- 只支持get请求,容易受xss(注入恶意指令代码)攻击
- cors:目前最主流,使用额外的HTTP头来告诉浏览器
- nginx
- JSONP:兼容性好
- 说一下JSONP实现原理?
答:JSONP=JSON+Padding,通过javascript callback的形式实现跨域访问。
设计模式
- 说一下你熟悉的设计模式?
答:
-
- 单例模式:保证被创建一次,节省系统开销
- 工厂模式:解耦代码
- 观察者模式:定义对象之间的一对多的依赖,当对象改变时,他的所有依赖者都会受到通知并自动更新
- 外观模式:提供一个统一的接口,用来访问子系统中的一群接口,外观定义一个高层的接口,让子系统更容易使用。
- 简单工厂和抽象工厂有什么区别?
答:
-
- 简单工厂:用来生产同一等级结构中的任意产品
- 抽象工厂:用来生产不同产品族的全部产品
Spring/Spring MVC
- 为什么要使用Spring?
答:开源的轻量级JavaBean容器框架,方便集成。
- 解释一下什么是AOP?
答:AOP,即切面编程,在运行时,动态地将代码切入到类的指定方法。相关概念:Aspect切面、Join point连接点、Advice通知、Pointcut切点。
有5种通知:
-
- 前置通知
- 后置通知
- 环绕通知
- 异常通知
- 最终通知
- 解释一下什么是IOC?
答:控制反转,由spring来负责控制对象的生命周期和对象间的关系。
- Spring有哪些主要模块?
答:
-
- AOP:切面编程
- ORM
- Core:提供bean工程IOC
- Dao:JDBC支持
- Context
- Web
- MVC
- Spring常用的注入方式有哪些?
答:
-
- 构造方法注入
- setter注入
- 基于注解注入
- Spring中的Bean是线程安全的吗?
答:不是。
- Spring支持几种Bean的作用域?
答:
-
- singleton:单例模式,bean只有一个实例
- prototype:原型模式,每次通过prototype定义的bean时,都产生一个新的bean实例
- request:每次http请求都会产生不同的bean实例
- session:同一个session共享一个bean实例
- global-session:所有session共享一鸽bean实例
- Spring自动装配Bean有哪些方式?
答:
-
- byName
- byType
- 构造函数
- autodetect
- Spring事务实现方式有哪些?
答:
-
- 编程式事务:侵入业务代码里面【rollback()、commit()】
- 声明式事务:基于AOP【@Transactional】
- 说一下Spring的事务隔离?
答:
-
- ISOLATION_DEFAULT:数据库设置了什么,就用什么【默认】
- ISOLATION_READ_UNCOMMITTED:未提交读
- ISOLATION_READ_COMMITTED:提交读
- ISOLATION_REPEATABLE_READ:可重复读
- ISOLATION_SERIALIZABLE:序列化
- 说一下Spring MVC运行流程?
答:
-
- 用户向服务器发送请求,请求被DispatcherServlet捕获
- 调用HandlerMapping获得该Handler配置的所有相关的对象
- 根据获得的Handler,选择一个HandlerAdapter,执行Handler
- 选择ViewResolver,渲染视图并返回
- Spring MVC有哪些组件?
答:太多了,选择性记吧
- 前端控制器(DispatcherServlet)
- 处理器映射器(HandlerMapping)
- 处理器适配器(HandlerAdapter)
- 拦截器(HandlerInterceptor)
- 语言环境处理器(LocaleResolver)
- 主题解析器(ThemeResolver)
- 视图解析器(ViewResolver)
- 文件上传处理器(MultipartResolver)
- 异常处理器(HandlerExceptionResolver)
- 数据转换(DataBinder)
- 消息转换器(HttpMessageConverter)
- 请求转视图翻译器(RequestToViewNameTranslator)
- 页面跳转参数管理器(FlashMapManager)
- 处理程序执行链(HandlerExecutionChain)
- @RequestMapping的作用是什么?
答:用于标识http请求地址与Controller类的方法之间的映射
- @Autowired的作用是什么?
答:可以对类成员变量、方法及构造函数进行标注,让spring完成bean自动装配。默认是byType匹配。
Spring Boot/Spring Cloud
- 什么是Spring Boot?
答:Spring下的子项目,主要简化了使用Spring的难度,简化了配置,提供了各种启动器,开发者快速上手。
- 为什么要用Spring Boot?
答:
-
- 快速整合第三方框架
- 打包方式完全采用注解化
- 简化XML配置
- 内嵌HTTP服务器
- Spring Boot核心配置文件是什么?
答:application和bootstrap
- Spring Boot配置文件有哪几种类型?它们有什么区别?
答:
-
- application:主要用于SpringBoot自动化配置文件
- bootstrap:SpringCloud注册中心、一些加密/解密场景
- Spring Boot有哪些方式可以实现热部署?
答:
-
- 模板热部署
- 调试模式Debug
- spring-boot-devtools
- Spring Loaded
- JRebel
- JPA和Hibernate有什么区别?
答:忽略吧,没学过这两个。
- 什么是Spring Cloud?
答:实现微服务的一个技术集合。
- Spring Cloud断路器的作用是什么?
答:当服务发生故障时,通过断路器的故障监控,向调用返回一个错误响应。可以理解为快速失败。
- Spring Cloud的核心组件有哪些?
答:
-
- Eureka:注册中心、客户端、服务端
- Rabbon:负载均衡
- Fegin:动态代理
- Hystrix:断路器
- Zuul:网关
Mybatis
- Mybatis中#{}和${}的区别是什么?
答:
-
- #{} 占位符
- ${} 拼接符
- Mybatis有几种分页方式?
答:
-
- 原生拼接limit
- 利用interceptor拼接sql,实现和limit一样的功能
- PageHelper插件【其实跟第二种一样的】
- RowBounds是一次性查询全部结果吗?为什么?
答:不是,Mybatis对JDBC封装时,规定了每次最多查询多少条。
- Mybatis逻辑分页和物理分页的区别是什么?
答:
-
- 逻辑分页:一次性查询全部结果,存储到list,然后代码分页
- 物理分页:拼接limit关键字
- Mybatis是否支持延迟加载?延迟加载的原理是什么?
答:支持,原理:使用CGLIB创建目标对象的代理对象,对调用目标方法,先getName(),如果是null,先去查询,再set值。
- 说一下Mybatis的一级缓存和二级缓存?
答:
-
- 一级缓存:SqlSession级别的缓存
- 二级缓存:mapper级别的缓存
- Mybatis和Hibernate的区别有哪些?
答:
-
- Mybatis
- 全ORM
- sql优化好
- Hibernate
- 半ORM
- 缓存机制好
- 有完整的日志系统
- Mybatis
- Mybatis有哪些执行器?
答:
-
- SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完就立即关闭
- ReuseExecutor:执行update或select,先找Statement对象,没有就创建,使用完不丢
- BatchExecutor:执行update,sql添加到批处理中,等待统一执行
- Mybatis分页插件的实现原理是什么?
答:在拦截方法里面,重写sql
- Mybatis如何编写一个自定义插件?
答:
-
- Executor
- StatementHandler
- ParamenterHandler
- ResultSetHandler
RabbitMQ
- RabbitMQ的使用场景有哪些?
答:
-
- 单发送单接收
- 单发送多接收
- Publish/Subscribe
- Routing
- Topics
- RabbitMQ有哪些重要的角色?
答:
-
- 生产者
- 消费者
- 代理
- RabbitMQ有哪些重要的组件
答:
-
- ConnectionFactory
- Channel
- Exchange
- Queue
- RoutingKey
- BindKey
- RabbitMQ中VHost的作用是什么?
答:mini版RabbitMQ服务器,拥有自己的队列、绑定、交换机和权限控制。
- RabbitMQ的消息是怎么发送的?
答:生产者将消息通过channel发送到exchange,exchange通过绑定的route key选择queue,消费者监听queue。
- RabbitMQ怎么保证消息的稳定性?
答:
-
- 开启事务
- 开启confirm(推荐)
- 开启RabbitMQ持久化
- 关闭RabbitMQ自动ack
- RabbitMQ怎么避免消息丢失?
答:
-
- publisher-confirms
- 消息确认机制(ACK)
- 消息持久化
- 要保证消息持久化成功的条件有哪些?
答:同时满足以下条件
-
- 声明队列设置durable=true
- 消息推送投递模式必须设置持久化,deliveryMode设置2
- 消息已经到达持久化交换器
- 消息已经到达持久化队列
- RabbitMQ持久化有什么缺点?
答:降低服务器吞吐量。
- RabbitMQ有几种广播类型?
答:
-
- direct(默认):直连
- headers
- fanout:分发模式
- topic:订阅
- RabbitMQ怎么实现延迟消息队列?
答:
-
- 消息过期进入死信交换器,再由交换器转发到延迟消费队列,实现延迟功能
- 使用插件delayed-message-exchange
MySQL
- 数据库三范式是什么?
答:
-
- 1NF:原子性,列不可分割
- 2NF:非主属性依赖主属性
- 3NF:不存在传递依赖
- 一张自增表里面总共有7条数据,删除了最后2条数据,重启MySQL数据库,又插入了一条数据,此时ID是几?
答:取决于数据库引擎
-
- MyISAM:id=8
- InnoDB:id=6
- 如何获取当前数据库版本?
答:select version()
- 说一下ACID是什么?
答:
-
- Atomicity(原子性)
- Consistency(一致性)
- Isolation(隔离性)
- Durability(持久性)
- Char和VarChar的区别是什么?
答:
-
- char:固定长度,效率高
- varchar:可变长度
- Float和Double的区别是什么?
答:
-
- float:存储8位十进制,内存中占4字节
- double:存储16位十进制,内存占8字节
- MySQL的内连接、左连接、右连接有什么区别?
答:区别,不用说了吧
-
- inner join
- left join
- right join
- MySQL索引是怎么实现的?
答:B+树
- 怎么验证MySQL的索引是否满足需求?
答:使用explain分析
- 说一下数据库的事务隔离?
答:
-
- read-uncommited:未提交读
- read-committed:提交读
- repeatable-read:可重复读
- serializable:序列化
- 说一下MySQL常用的引擎?
答:
-
- InnoDB:默认
- MyIASM
- 说一下MySQL的行锁和表锁?
答:
-
- 行锁:开销大,加锁慢,会出现死锁
- 表锁:开销小,加锁快,不会出现死锁
- 说一下乐观锁和悲观锁?
答:
-
- 乐观锁:每次拿数据都任务数据没有修改,拿到数据后,判断版本
- 悲观锁:每次拿数据都认为数据被修改了,获取数据时,先加锁
- MySQL问题排查都有哪些手段?
答:
-
- show processlist
- explain
- 开启慢查询日志
- 如何做MySQL的性能优化?
答:
-
- 常用搜索字段,加索引
- 避免select *
- 垂直分割分表
- 选择正确的存储引擎
Redis
- Redis是什么?都有哪些使用场景?
答:内存数据库,使用场景:近期热帖、用户会话信息、排行榜
- Redis有哪些功能?
答:
-
- 数据缓存
- 分布式锁
- 数据持久化
- 事务
- 消息队列
- Redis为什么是单线程的?
答:因为cpu不是redis瓶颈,瓶颈是机器内存或者网络带宽
- 什么是缓存穿透?怎么解决?
答:查询一个一定不存在的数据,每次都去数据库查询。解决方案:查询返回结果为空时,将这个空结果缓存,设定ttl
- Redis支持的数据类型有哪些?
答:string、list、hash、set、zset
- Redis支持的Java客户端都有哪些?
答:Redisson、jedis、lettuce
- Jedis和Redisson有哪些区别?
答:
-
- Jedis:提供给比较全面的redis命令支持
- Redisson:实现分布式和可扩展的Java数据结构
- 怎么保证缓存和数据库数据的一致性?
答:
-
- 合理设置缓存的过期时间
- 新增、更改、删除数据库操作时,同步更新redis
- Redis持久化有几种方式?
答:
-
- RDB:内存快照
- AOF:保存写命令
- Redis怎么实现分布锁?
答:setnx,每次只允许一个程序有这个锁
- Redis分布锁有什么缺陷?
答:不能解决超时问题。
- Redis如何做内存优化?
答:尽量使用redis的散列表。
- Redis淘汰策略有哪些?
答:
- volatile-lru:从已设置过期时间的数据集(server. db[i]. expires)中挑选最近最少使用的数据淘汰。
- volatile-ttl:从已设置过期时间的数据集(server. db[i]. expires)中挑选将要过期的数据淘汰。
- volatile-random:从已设置过期时间的数据集(server. db[i]. expires)中任意选择数据淘汰。
- allkeys-lru:从数据集(server. db[i]. dict)中挑选最近最少使用的数据淘汰。
- allkeys-random:从数据集(server. db[i]. dict)中任意选择数据淘汰。
- no-enviction(驱逐):禁止驱逐数据。
- Redis场景的性能问题有哪些?该如何解决?
答:主服务器写内存快照、redis主从复制。
JVM
- 说一下JVM的主要组成部分?及其作用?
答:
-
- 类加载器
- 运行时数据区
- 执行引擎
- 本地库接口
- 说一下JVM运行时数据区?
答:
-
- 程序计数器
- 虚拟机栈
- 本地方法栈
- 堆
- 方法区
- 说一下堆栈的区别?
答:
-
- 堆存储对象,大小远大于栈
- 栈执行程序
- 队列和栈是什么?有什么区别?
答:都是用来存储数据的,队列:FIFO,栈FILO
- 什么是双亲委派模型?
答:类加载分类:Bootstrap、Extension、Application。如果一个类加载器收到类加载请求时,先把请求交给父类,只有所有父类无法完成加载请求,子加载器才会尝试去加载类。
- 说一下类加载的执行过程?
答:
-
- 加载:class
- 检查:检查class正确性
- 准备:给静态变量分配内存
- 解析:
- 初始化
- 怎么判断对象是否可以被回收?
答:
-
- 引用计数器
- 可达性分析
- Java中都有哪些引用类型?
答:
-
- 强引用
- 弱引用
- 软引用
- 虚引用
- 说一下JVM有哪些垃圾回收算法?
答:
-
- 标记-清除算法
- 标记-整理算法
- 复制算法
- 分代算法
- 说一下JVM有哪些垃圾回收器?
答:
-
- Serial:串行
- Parallel:吞吐量优先
- CMS:响应时间优先
- G1
- 详细介绍一下CMS垃圾回收器?
答:使用的是标记-清除算法实现。
- 新生代垃圾回收器和老年代回收器都有哪些?有什么区别?
答:
-
- 新生代:Serial、Parallel
- 老年代:CMS
- 整堆:G1
- 简述分代垃圾回收器是怎么工作的?
答:这个去看详细的吧,很难文字描述。
- 说一下JVM调优的工具?
答:
-
- jconsole
- jvisualvm
- 常用的JVM调优的参数都有哪些?
答:
-
- -Xmx
- -Xmx
- -XX