java面试整理

本文详细解答了Java面试中关于基础数据结构(String、StringBuffer、StringBuilder、ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、ConcurrentHashMap)的区别,JVM内存模型、Spring框架、MyBatis和Redis操作,以及内存溢出排查、事务处理和AOP等方面的问题。
摘要由CSDN通过智能技术生成

Java面试题整理

基础篇

String、StringBuffer、StringBuilder有什么区别?

String是不可变得因为他被final关键字进行修饰
StringBuffer和String都是线程安全得
StringBuilder是线程不安全得
字符串反转可以使用 reverse 进行反转

ArryList 和 LinkedList 有什么区别?

arraylist 底层是数组 linkedlist底层是链表
arraylist 查询快增删慢linkedlist查询慢增删快

什么ArryList插⼊速度慢

因为arrylist插入时候会涉及扩容得问题,扩容相当于新建一个arraylist然后数据复制过去所以就比较慢,但是当他有足够容量时候其实是不慢得

ArryList初始容量是多少?扩容之后是多少?

初始是10 扩容后是1.5倍

HashSet与LinkedHashSet有什么区别?

HashSet是无序得 LinkedHashSet 是有序得
LinkedHashSet 是hashset得子类

HashSet 是如何保证不重复的?

hashset 他里面封装了hashmap 值得话存放到key上 value存放得是一个固定变量

HashMap、ConcurrentHashMap有什么区别(jdk1.8)?

一个是线程安全一个是线程不安全得一个允许存入空值一个不允许

HashMap、ConcurrentHashMap的底层使⽤的什么数据结构

数组加链表 jdk 1.8 之后增加了红黑树 当数组长度 = 8 链表长度等于 64时候会转换成红黑

Map中的加载因⼦是什么?为什么要设置为值0.75?

加载因子是来决定map什么时候就行扩容得, 0.75 是空间和时间上来说最优选择

ConcurrentHashMap什么时候会触发扩容操作?

当链表长度达到8并且数组容量小于64得时候会触发
或者当扩容因子达到0.75时候

HashMap、ConcurrentHashMap是如何解决hash冲突的?

通过数组加链表方式来解决得如果地址相同就存放链表

sychronized和local区别

1,sychronized是Java中的一个关键字 local 是jdk提供得一个类
2,sychronized 是自动帮我们获取锁 local 就需要我们手动获取和释放
3,sychronized 是非公平锁 local是非公平锁和公平锁都可
4,sychronized锁得是 对象 local锁得是一个int变量

java中类加载器有哪些 ?

bootstrap,extclassloader ,appclassloader

什么是双亲委派?

双亲委派就是类加载器会先让父类去进行加载如果加载到自己就不加载了加载不到自己在进行加载顺序分别是 appclassliader->extcalssloader - >bootstrap

什么是守护线程

在Java中守护是jvm得后台线程比如垃圾回收就是守护线程他会在所以普通线程都停止运行后在自动停止

什么是并发并行串行

1,并发就是多个线程去执行同一个任务
2,并行是多个任务同时执行
3,串行是顺序执行排队

什么是死锁造成原因和解决方案

原因:1,一个资源每次只能被一个线程占用
2,一个线程在阻塞时候不去释放资源
3,一个线程占有资源时候不能被强制释放
4,不能形成首尾相连,比如A现在持有A锁,B现在持有B锁 A线程还没释放锁呢就去获取B锁 B也是
解决方案
1,让所有线程获取锁顺序都保持一致
2,给锁增加超时时间

AQS是什么

AQS 是实现锁得一个框架他其实就是一个双向链表得数组他里面就是给线程进行排队用的

说一下什么是反射

反射其实就是可以让你获取到任意一个类得成员变量,成员方法,构造方法进行操作
实现反射得方式可以使用Class.fornama(‘’) 和 类名.Class
优点:可有动态获取一个类提高代码得复用性
缺点:性能比较低因为是动态获取得jvm没办法对其进行优化
代码可读性较低

说一下什么是抽象类和接口

接口就是定义了一个声明约定他没有方法体 ,具体实现由类去做
抽象类就是抽取某些共有属性也就是对代码得维护和重用

说一下动态代理

动态代理常见得就是JDK动态代理和CGLiB动态代理
JDK动态代理他是通过代理类和目标类实现得接口动态生成得,不需要自己编写生成得动态代理和目标类都要实现相同得接口就是INvocatIonHandler接口 没有实现得话他就没办法使用jdk生成
CGLiB动态代理是通过继承方式目标类不需要实现待定得接口更加灵活但是如果类被Final修饰那么他无法使用CGlib
区别 实现方式不同jdk是通过反射去实现得但是CGlib是通过字节码技术需要引入相关jar包

说一下JVM内存模型

jvm内存模型分为堆,栈,方法区,程序计数器
栈:主要存放一些局部变量是线程私有得里面包含局部变量表,操作数栈,执行出口等
堆:里面主要就是新生代老年代
程序计数器:就是记录当前线程执行到那里了

生产内存溢出你怎么排查得

首先可以使用top命令查看下程序pid 然后根据pid 下载下来dump文件命令是
jmap -dump:format=b,file=heap.prof 17561 format=b 代表生成dunp文件 file=heap.prof是生成文件得路径17561是pid 执行这个命令时候JVM会将整个堆信息输出到该文件里面 整个过程为了保证完整性 服务会暂停应用,然后可以使用JDK自带一个jvisualvm工具解析就可以了

说一下mysql事务

事务就是针对一批操作要不全部成功要不全部失败
特性
原子性 :要不全部成功要不全部失败
一致性:一个事务必须由一个一致性状态变更成另外一个一致性状态比如A给B转钱A钱少了 B钱没有增加着就代表不是一致性得
隔离性:是指一个事务在操作时候不受其他事务影响
持久性:一个事务一旦提交他对数据库改变就是永久得
事务又分为显示事务和隐式事务 隐式事务 就是不需要我们进行手动操作,显示事务就是需要手动提交回滚
事务隔离级别:
读未提交,读已提交,可重复读,串行
事务存在一些问题
脏读:就是一个事务读取到另外一个事务还没提交数据
不可重复读:就是假设事务A读取数据读取到值是1 但是他还没有提交事务呢 事务B针对这数据进行修改改成了B并且提交事务了那么A在读时间结果就是B了
幻读:假设事务A查数据取前面10行首次查询是没问题得,但是这时候事务B插入几条数据事务A再次查询时候可能就查询出来12条他以为自己出现幻觉了

框架篇

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

Spring IOC

ioc控制反转他其实就是我们把对象交给了spring来帮我们进行管理了由他来帮我们创建对象和赋值简化了我们开发中得代码

Spring Bend是线程安全的吗

Bend如果是有状态得那么他线程不安全 如果是无状态得是线程安全得

Spring得生命周期

1,对象实例化 就是调用得后置处理器里面通过反射创建对象还可以对对象进行一些其他操作
2,初始化 就是给一些对象赋值执行实现了Aware接口的方法可以获取到对象属性信息然后通过前置处理器可以拿到这个Bean相关得所有属性进行初始化
3,使用完整对象
4,销毁

Spring事务是怎么实现得

1,Spring事务是通过AOP来实现得
2,他首先会扫描当前类是否加了事务注解加了的话他就会把当前类添加到事务管理器里面
3,他会修改数据库链接状态为非自动提交
4,然后执行sql当执行成功spring来帮我们提交,执行失败就回滚

Spring 常用注解

@Mapper 描述数据层 (Mapper)
@Service 描述业务层 (Service)
@Repository 标识持久层 / 数据访问层组件(Dao)
@Component 可以描述各种组件(当组件不好归类时)
@Controller 描述控制层 接收用户请求 执行 视图解析器 。
返回一个ModelAndView对象,传给指定的jsp
@ResponseBody 将Java对象转为JSON
@Bean 描述在方法上,把方法的返回值交给容器管理,不需要再手动调用该方法。
@Autowired 按照类型自动注入 获取对应的bean对象。如果注入的类型有多个实现类,则需要注入具体实现类的名称。
@Resource 按名称自动注入 获取对应的bean对象
@RequestMapping(“/xxx”) 注解类上 通过"/xxx"来指定控制器可以处理哪些URL请求。

Spring AOP面向切面

前置@Before,后置@After,最终@AfterReturning,异常@AfterThrowing,环绕@Around

说一下springMVC和springBoot得区别

MVC他是属于一个web开发得MVC框架,他里面包含了前端视图开发,文件配置,XML,Config等配置比较繁琐
boot得话他对比MVC来说他就更注重后端微服务接口一个开发大大简化了一个配置流程区别MVC来说得话他就是专注于后端开发和前端一个解耦,虽然也可以放一起但是那不就违反了初衷了吗

springMVC执行流程

用户发送请求 -> dispatcherServlet(前端控制器)他把请求得handler也就是地址等待信息 给handlermapping(处理器映射器)然后映射器根据url找到handler 在返回给前端控制器,然后前端控制器在拿这个handler 给 handlerAdapter(处理器适配器) 然后他找到对应处理器执行handler 并且返回给前端控制器 moderAndView 然后前端控制器在请求视图解析器返回视图对象然后进行渲染后返回给用户

mybatis中#{} 和 ¥{}得区别是啥

#{}是预编译处理 ¥{} 是字符串替换
#{}在处理时候会替换成?调用里面得set方法进行赋值 占位符 ¥{} 得话就是直接字符串拼接
使用#{}可以防止sql注入得风险

mybatis是如何进行分页得

1,可以在sql里面使用limit来进行物理分页
2,也可以使用RowBounds对象进行分页他是针对ResultSet结果集进行得内存分页
3,也可以使用分页插件

mybatis缓存

他分为一级缓存和二级缓存
一级缓存:默认开启他是sqlSession级别得
二级缓存:他是mapper级别得是跨sqlSession 但是他有问题会产生数据脏读

中间件篇

redis持久化策略

redis持久化策略得话是两个 一个是RDB和AOF RDB的话是通过foke生成子线程然后针对数据生成快照,AOF得话是存储得命令日志一般默认得是主线程执行完之后把命令存储到AOF文件中

AOF文件过大怎么解决

可以使用AOF重新针对文件进行一个重新生成他相当于是把当前redis里面最新数据重新生成一个AOF文件然后覆盖之前文件当然重新操作也是新建一个子线程执行得

AOF在重写过程中又更改数据了你怎么保证你这个是最新得

当AOF在执行重写操作时候他主线程执行完之后会往AOF缓存区也保存下执行命令然后AOF缓存区内容最终也是要更新到新生成得AOF文件

那使用RDB机制的话如果你设置同步时间间隔较长会有数据丢失问题

这个我们可以让RDB和AOF来结合使用,当我初次备份时候使用RDF备份全量数据然后AOF只记录同步时间间隔增量数据假设RDB设置20秒同步一次,那么我AOF就只同步这20秒发生更改就可以了,这样也避免了说因为宕机导致的RDB丢失这20秒间隔数据,也保证了AOF不会有数据量过大问题

Redis删除机制有哪些

删除机制的话有
1,定时删除:在我给某个key设置过期时间时间同时给他创建了定时器当我时间到达时候立马删除但是这操作都是主线程执行的会有阻塞不推荐
2,惰性删除:就是当到期时候不立刻删除当我再次get使用到他的时候在进行删除
3,定期删除:就是我每隔一段时间随机选出一些key然后删除掉里面过期的
最佳组合就是 惰性加定期

当新数据来了redis里面内存不够了怎么办

这就涉及到内存删除策略了
volatile-lru:挑选最近最少使用的数据淘汰
volatile-lfu:挑选最近使用次数最少的数据淘汰
volatile-ttl:挑选将要过期的数据淘汰
volatile-random:任意选择数据淘汰
allkeys-lru:挑选最近最少使用的数据淘汰
allkeys-lfu:挑选最近使用次数最少的数据淘汰
allkeys-random:任意选择数据淘汰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值