Switch数据类型支持哪些
在JDK1.5之前,switch循环只支持byte short char int四种数据类型.
JDK1.5 在switch循环中增加了枚举类与byte short char int的包装类------》对四个包装类的支持是因为java编译器在底层
手动进行拆箱,而对枚举类的支持是因为枚举类有一个ordinal方法,该方法实际上是一个int类型的数值.
JDK1.7在switch循环中增加了String类型-------》但实际上String类型有一个hashCode算法,结果也是int类型.
而byte short char类型可以在不损失精度的情况下向上转型成int类型.所以总的来说,可以认为switch中只支持int.
Java有哪些锁?区别在哪?底层如何实现的?为什么非公平锁效率高?
公平锁,非公平锁,可重入锁,共享锁排他锁,自旋锁,读写锁,悲观锁,乐观锁 无锁 偏向锁 轻量级锁 重量级锁
因为公平锁来了线程需要挂起,然后还要判断哪个线程被唤醒,
Java内存模型
主内存和工作内存,所有对象都放在主内存上,所有每个线程都有自己的工作内存,线程从主内存中将数据复制到自己的工作内存中
Java内存结构
堆负责存放对象 栈负责运行 方法区负责存放一些常量以及类信息 程序计数器负责记录程序运行的行数用于恢复运行 本地方法栈用于存放一些本地方法
线程池使用场景及其核心参数说明、拒绝策略
使用场景,io密集型,拒绝策略:1.直接抛出异常 2.不丢弃任务不抛异常,调用主线程来执行3.抛弃队列中等待最久的任务4.直接丢弃 核心参数 corepoolsize maximumpoolsize keepalicetime unit workqueue threadFactory handler
Threadlocal原理和使用场景
原理,就是threadlocal维护了一个map 里面key是一个弱引用,value是一个threadlocalmap,使用场景,每个线程都有自己的单独的实例,实例需要在多个方法中共享,但不希望被多线程共享 数据库连接,Session管理
实现多线程通讯
wait notify notifyall lock 停止线程 守护线程 join yield 优先级
Mybatis初始化和执行原理
读取XML,或者读取注解,构建Configuration对象,生成SqlSessionFactory实例,执行流程大概是,去mapper里面根据方法id拿到sql,设置参数,连接池拿到连接,执行,返回结果
Spring mvc初始化和执行原理
1.用户发送请求至前端控制器DispatcherServlet。
2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3.处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4.DispatcherServlet调用HandlerAdapter处理器适配器。
5.HandlerAdapter经过适配调用具体的处理器(controller,也叫后端控制器)。
6.Controller执行完成返回ModelAndView。
7.HandlerAdapter将Controller返回的执行结果ModelAndView返回给DispatcherServlet。
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9.ViewReslover解析之后返回具体的view。
10.DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图jsp/freemaker…中)。
11.DispatcherServlet响应用户。
Springboot如何自定义starter
创建一个spring.factories文件,在里面配上自动配置类的路径,编写自动配置类,加上@Configuration
项目中使用了springcloud哪些组件及其原理
nacos zipkin (Eureka,config) gateway,sentinel,openfeign。。。。
Redis数据类型
string list hash set zset
Redis淘汰策略
优先删除最老的数据 随机删除数据 抛异常 删除有超时时间的随机数据 删除超时时间最短的数据 删除最老的数据限于有存活时间
Redis集群方式
哨兵 主从复制 redis-cluster集群 https://www.cnblogs.com/runnerjack/p/10269277.html
Redis中string底层结构
int embstr raw 其中embstr和raw一个是44长度一下,一个是长度的,里面使用的事sdshdr存储,其中sdshdr5式存储长度不会变化且少于32个字符串,不可以扩容,,并且sds都取消了gcc的优化对齐,所以sds[-1]指向的事flags属性的内存地址
底层是char[]类型存储的,小于1M 每次分配*2 大于1M分配时多分配1M,二进制安全
MQ工作方式
work模式,一个生产者,多个消费者,每个消费者获取的消息唯一
订阅模式,一个生产者发送的消息会被多个消费者获取,
路由模式,发送消息到交换机要指定路由key,消费者将队列绑定到交换机时需要指定路由key
通配符模式,将路由键和某模式镜像匹配,此时队列需要绑定在一个模式上,
rpc模式,
MySQL数据库引擎比较
https://www.cnblogs.com/wangjian941118/p/10421716.html
事务隔离级别说明
读未提交,不可重复读,可重复读,串行化 https://www.cnblogs.com/wyaokai/p/10921323.html
默认可从复读 解决幻读需要锁表
批量导出的业务1000个,如何实现
io密集型,开多线程来导出,GZIPInputStream数据压缩传输
什么场景会出现栈溢出
在一个循环里面出现创建大对象,局部数组过大,递归调用层次太多,
一般怎么优化慢查询
根据查询字段建立索引,
什么情况下会使得索引失效
聚集索引的时候不按照顺序查询,or的时候,就是查询的时候一定要是在索引列是连续的一段 比如or,如果后面的没有索引,那么就不是连续的一段,比如 %w 存在这样的情况在b+树里面不是连续的一段,而w%则是,
Redis分布式锁中加锁与解锁的详细细节询问,过期如何续命
watchdog在过去三分之一时间之后 对锁延长时间
Spring的ApplicationEvent的使用场景
异步发送消息,每个消息都有对应的处理,,每个模块都会发送这个消息,,就可以使用 解耦使用
一个项目中可以有多个dispatcherServelt吗?为什么?
可以有,
SpringAOP涉及到什么设计模式?底层原理
责任链,装饰器模式,代理模式,原理是java代理模式和CGlib代理
SpringBoot配置文件加载优先级
命令行指定参数,由jar包外向内加载,优先加载带有profile,最后加载不带profile的
SpringBoot启动原理
从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器
Redis集群有哪些方式
主从,哨兵,cluster
MySQL事务隔离级别
读未提交,读已提交,可重复读,串行化
MySQL聚簇索引
就是几个字段连起来成为一个索引
写一个单例
DCL+构造检查防止反序列化
ArrayList底层原理
底层是个数组,
ArrayList扩容、删除、添加原理
扩容 双倍扩容 添加往数组最后添加,,,删除,
线程池核心参数说明(重要)
7大核心参数,corepoolsize 初始化线程数 maximumPoolSize 最线程数 keepAliveTime unit 超过初始化线程数之后的线程活跃时间 workQueue 等待队列 threadFactory 创建线程的工厂 handler 拒绝策略
手写一个定时的线程池
Executors.newSingleThreadScheduleExecutor().scheduleAtFixedRate(()->System.out.println(1),1,1,TimeUnit.SECONDS);
Mysql聚簇索引和非聚簇索引说明(重要)
聚集索引就是B+树 叶子节点存放的是数据,其他节点存放的是索引的,,,非聚集索引叶子节点存放的是主键值,需要再次查询,辅助索引
Java自带的序列化方式
Serializable接口 Externalizable接口
项目使用了SpringCloud哪些组件
nacos,gateway sentinel zipkin feigin
Eureka属于可用还是一致?为什么
高可用,因为如果节点挂了,eureka不会立即清除节点
Eureka实现服务治理的原理
自己注册自己,实现高可用,自我保护机制,,服务注册到Eureka上,会发送心跳,Eureka会剔除90s没有心跳的服务,
Spring注解生效的原理(AOP底层原理)
动态代理 proxy还有CGLib
项目中如何使用策略模式
例如,一个资源的操作可能有增删改查操作,然后通过,某个code来找到各个操作对应的实现类,用具体实现类来调用
HashMap底层数据结构和原理
数组+链表,超过8个就变成红黑树
ConcurrentHashMap线程安全的原理
分段锁,把Map分成多个分段,对数据操作对对应的分段加锁,而不是整个表加锁,1.8的时候变成node+cas+Synchronized,使用cas获取到node,然后对node进行加锁,
Sync和Lock的区别,底层原理
sync是关键字,lock是一个类 sync 可重入,不可中断,非公平 lock 可重入,可中断,可公平非公平
CAS中ABA如何解决
加上版本号
类加载机制中双亲委派
如果一个类加载器收到了类加载的请求,他首先不会自己去尝试加载这个类,而是把这个请求委派父类加载器去完成。每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法 完成这个请求(他的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。
ThreadLocal底层原理
底层是 以threadlocal为key,值为value 的一个entry。而key是一个弱引用,
Java线程池关键参数及其拒绝策略说明
AbortPolicy 丢弃任务抛异常 DiscardPolicy 丢弃任务 不抛异常 DiscardOldestPolicy丢弃队列最前面的任务CallerRunsPolicy由调用线程执行该任务
Jvm内存结构详细阐述
堆 栈 方法区 程序计数器 本地方法栈 执行引擎 本地接口
MySQL索引底层结构
b+树
如何优化索引查询
避免全表扫描,优先使用索引,最左前缀原则,避免跳跃使用,不能使用or,索引组合不能有null,大量重复不能建立索引,不能使用函数,模糊查询
组合索引的使用场景
多个字段更准确定位,如 姓和名能准确定位人,
MySQL隔离级别
读未提交,读已提交,可重读,可串行化
脏读、幻读的定义
脏读,读到未提交的东西,,,幻读,两次读取的内容不一样
AOP底层原理
动态代理,CGlib
JDK动态代理和CGlib动态代理对比,各自底层的实现原理
jdk动态代理必须要实现一个接口,proxy只能对某个接口进行代理,cglib是i操作字节码实现代理,用一个子类继承之后对方法进行增强
FactoryBean和BeanFactory的区别
BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修 饰对象生成的工厂Bean
SpringMVC的拦截器和Filter的异同,自己配置过吗?
拦截器是基于Java的反射机制的,而过滤器是基于函数回调。
拦截器不依赖于servlet容器,过滤器依赖于servlet容器。
拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
拦截器可以获取IOC容器中的各个bean(基于FactoryBean接口),而过滤器就不行,在拦截器里注入一个service,可以调用业务逻辑。
Nginx的负载均衡方式有哪些?正向代理和反向代理的区别
轮询,权重,ip_hash,fair按服务器响应时间分配,url_hash按照url分配服务器,正向代理 客户端通过一个代理服务器向请求的地址发送请求,反向代理是服务器通过一个代理服务器向外提供服务,正向代理服务端不知道真正请求者,反向代理 客户端并不知道真正访问的服务端
RPC框架中服务消费者如何拿到服务提供者的请求信息,各自职责
http协议是通过http调用拿到
BASE理论和CAP理论是指什么
CAP:
C:数据一致性
A:集群可用性
P:分区容错性
最多只能实现这三点中的两点,三者不可兼得。一般我们必须保证分区容错性,C/A看情况采取。
BASE:
BA:基本可用:在分布式系统中出现故障的时候,允许损失部分可用性,比如响应时间、功能上的可用性
S:软状态:是指允许系统存在中间状态,这些中间状态不会影响系统的可用性
E:最终一致性:是指系统中所有的数据副本经过一定时间后,最终能够到达一致的状态。
Mybatis中二级缓存和一级缓存的区别
一级缓存的作用域是一个sqlsession内;二级缓存作用域是针对mapper进行缓存
Netty中粘包和拆包是指什么?
粘包就是包在发送的时候可能第一次和第二次发送的数据合在了一起,拆包就是合一起之后需要拆开
TCP中为什么握手是三次而挥手是四次?
https://blog.youkuaiyun.com/jianjun_fei/article/details/102462920
用过什么设计模式?描述一下场景
策略模式,单例,工厂,
SpringBean生命周期
实例化,填充属性,setBeanName,setBeanFactory,setApplicationContext,postProcessBeforeInitilization,afterPropertiesSet,初始化,postProcessAfterInitialization,就绪,destory,
事务的原理
redolog undolog undo log记录被修改之前的记录,用来回滚,,redo log是用来恢复数据的 用于保障,已提交事务的持久化特性
Spring声明式事务为什么能每次拿到相同的connection
threadlocal
Springboot的starter组件的结构是什么样的
有一个配置类,在META-INF目录下面有一个spring.factories文件指定配置配置类中自动装配的配置
HashMap1.7和1.8的区别在哪
1.8的结构是将数组+链表+红黑树,如果链表的长度超过8,那么就转换成红黑树
公平锁和非公平锁的区别
公平锁,维护一个队列,按照请求锁的顺序获取锁,非公平锁,获取锁的线程是随机的
JVM内存结构的介绍
工作内存+主内存
垃圾回收算法有哪些?重点说说复制算法
标记清除,复制,标记整理,分代收集算法
常用的垃圾回事器有哪些?CMS的原理阐述一下
serial,parnew,parallelScavenge,CMS,g1, 初始标记(短暂stw),并发标记,预清理,重新标记(stw),并发清除,以获取最短回收停顿时间为目标的回收器
Netty使用过吗?讲下原理
在NIO的基础上封装,boss线程负责获取连接,work线程负责处理任务,通过pipline处理链来处理
粘包和拆包的解决方案有哪些?
在消息头加上整个消息的长度,,,固定长度,,,
使用过哪些Redis的数据结构
string list hash set sortedsets.......
消息幂等性如何解决
使用全局MessageID判断消费方是否消费过,或者使用业务逻辑保证唯一,比如订单号码
消息顺序消费如何解决,哪些MQ有这个特性
保证消息发送到同一个队列中就可以,Rocketmq同一个队列是顺序消费的
Redis实现分布式锁中,过期时间如何设置的(估计是在问NX和PX如何保持一致性)
过期时间setnx,watchdog来延长过期时间
匿名内部类使用外部变量为什么必须是final修饰的
因为生命周期的原因。方法中的局部变量,方法结束后这个变量就要释放掉,final保证这个变量始终指向一个对象。首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变
一条TCP连接上可以发多少个HTTP请求
如果开启长连接,是可以对应多个http请求的
class加载过程
加载,验证,准备,解析,初始化,使用,卸载,其中验证是校验class文件是否合法,文件头,版本号子类的,准备是将方区中的一些静态变量赋值,解析,虚拟机常量池内的符号引用替换为直接引用的过程,初始化,执行类构造器<client>()方法的过程,类的一些属性值的初始化,如果发现父类没有初始化,先初始化父类,

该博客围绕Java面试展开,涵盖Java锁、内存模型与结构、线程池、MyBatis、Spring MVC、Spring Boot、Redis、MySQL等多方面知识,详细介绍了各技术的原理、使用场景、参数设置、优化方法等,还涉及设计模式、网络协议等内容。
1689

被折叠的 条评论
为什么被折叠?



