1、==和equals的区别
== 如果比较基本类型,比较的是值
== 如果比较引用类型,比较的是内存地址
equlas是Object类的方法,本质上与==一样,但是有些类重写了equals方法,比如String的equals被重写后,比较的是内存地址,另外重写了equlas后,也必须重写hashcode()方法
详情参考:https://blog.csdn.net/_/article/details/
2、String、StringBuffer、StringBuilder的区别
String 由 char[] 数组构成,使用了 final 修饰,对 String 进行改变时每次都会新生成一个 String 对象,然后把指针指向新的引用对象。
StringBuffer线程安全;
StringBuilder线程不安全。
操作少量字符数据用 String;单线程操作大量数据用 StringBuilder;多线程操作大量数据用 StringBuffer。
(2) synchronized在发生异常时会自动释放锁,lock需要手动释放锁
FutureTask存在的问题
无法手动完成:当调用远程服务时,如果发现远程服务出现问题,你需要将最近一次正常结果返回;这时使用Future就无法满足该需求。
无法添加回调方法:当调用远程服务结束后需要调用其它方法时,如果使用Future,则需要不断循环调用isDone方法判断是否完成;然后调用get获得结果,接着调用其它方法。
无法将多任务合并获得结果:当需要并行调用多个远程服务时,在获得返回结果时需要不断循环调用各future的isDone方法。
没有异常处理:Future API没有提供异常处理方法。
6、“::”是什么?为什么要使用它?
“::”是Java 8 引入的新特性之一,常常被称作为方法引用,提供了一种不执行方法的方法。使用“::”可以进一步简化一些使用了lambda表达式的代码,让代码更加简洁。
[Java 8新特性:https://www.cnblogs.com/wmyskxz/p/13527583.html]
(https://www.cnblogs.com/wmyskxz/p/13527583.html)
7、类加载器和双亲委派
1、bootstrapclassloader
2、extentionclassloader
3、applicationclassloader
8、Java匿名内部类详解
定义匿名内部类的两个含义
1.临时定义某一指定类型的子类
2.定义后即刻创建刚刚定义的这个子类的对象
第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。从客户端的视角来看,我接到了服务端发送过来的响应数据包,说明服务端接收到了我在第一次握手时发送的网络包,并且成功发送了响应数据包,这就说明,服务端的接收、发送能力正常。而另一方面,我收到了服务端的响应数据包,说明我第一次发送的网络包成功到达服务端,这样,我自己的发送和接收能力也是正常的。
第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力,服务端的发送、接收能力是正常的。第一、二次握手后,服务端并不知道客户端的接收能力以及自己的发送能力是否正常。
而在第三次握手时,服务端收到了客户端对第二次握手作的回应。从服务端的角度,我在第二次握手时的响应数据发送出去了,客户端接收到了。所以,我的发送能力是正常的。而客户端的接收能力也是正常的。
经历了上面的三次握手过程,客户端和服务端都确认了自己的接收、发送能力是正常的。之后就可以正常通信了。
为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文,为什么需要四次挥手。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送,故需要四次挥手。
10、list与set方法的区别有:
1、list可以插入多个null元素,而set只允许插入一个null元素;
2、list容器是有序的,而set容器是无序的;
3、list方法可以允许重复的对象,而set方法不允许重复对象等等。
filebeat、logstash、es、kibana
spring项目中全局异常处理的方式
1、实现@aspect注解
2、通过@controlleradvice+@ExceptionHandler
3、通过拦截器
mybatis 什么是一级缓存和二级缓存。 一级缓存和二级缓存默认开闭状态。
说下mybatis延迟加载的概念
数据库
mysql有哪些存储引擎
InnoDB,MyISAM,Memory,Merge
innerDB与myisam的区别
一、InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。
二、InnoDB适合频繁修改以及涉及到安全性较高的应用,MyISAM适合查询以及插入为主的应用
三、InnoDB支持外键,MyISAM不支持
四、MyISAM是默认引擎,InnoDB需要指定
八、清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表
九、InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like ‘%lee%’
索引的原理
为什么使用b+tree,不使用红黑树或者平衡二叉树
https://zhuanlan.zhihu.com/p/
mysql的四种隔离级别
读取未提交内容
读取提交内容
可重读
可串行化
https://blog.csdn.net/weisong/article/details/
https://blog.csdn.net/_/article/details/
事务具有四个特征
原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability
数据结构
hashmap list 原理,线程安全还是非线程安全
https://blog.csdn.net/weixin_/article/details/
有哪些线程安全的map
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
讯享网实现Mybatis的Interceptor接口并复写intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。

它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。
java面试基础题目是啥意思
mybatis的一级缓存和二级缓存
MyBatis 的一级缓存是基于数据库会话(SqlSession 对象)的,默认开启。二级缓存是基于全局(nameSpace)的,开启需要配置。
二级缓存的特点和使用场景:二级缓存作用于全局,对于一些相当消耗性能的,并且对于时效性不敏感的查询可以使用二级缓存。注意,如果开启了二级缓存,查询的顺序是二级缓存 → 一级缓存 → 数据库。
在全局设置中开启二级缓存
…
...
在 xxxMapper.xml 中开启 标签
jvm
jvm内存结构(https://blog.csdn.net/_/article/details/)
1、程序计数器(PC寄存器)(线程私有)
2、java栈(线程私有)
3、本地方法栈(线程私有)
4、堆(线程共享)
5、方法区(线程共享)
了解
GC回收算法(https://blog.csdn.net/u0/article/details/)
1.标记清除算法
2.复制算法
3.标记整理算法
4.分代收集算法
分代收集法是目前大部分JVM所采用的方法
新生代都采取复制算
老年代采用标记整理算法
如何确定垃圾
1.引用计数法
2.可达性分析
JVM优化思路
gc目标:
GC的时间足够的小
GC的次数足够的少
发生Full GC的周期足够的长
讯享网
https://www.cnblogs.com/csniper/p/5592593.html
熟悉哪几种垃圾回收器,线上环境使用哪种垃圾回收器,如果有调整,谈谈选型思路
jvm内存溢出排查
jvm对象分配机制
类加载检查
分配内存(指针碰撞,空闲列表)
初始化
设置对象头
执行init方法
https://www.cnblogs.com/riches/p/14619766.html
双亲委派(https://blog.csdn.net/codeyanbao/article/details/)
双亲委派机制的作用
1、防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。
2、保证核心.class不能被篡改。通过委托方式,不会去篡改核心.clas,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。
怎么打破双亲委派
自定义类加载器,重写loadClass方法
使用线程上下文类加载器-
框架
讲讲对aop的理解
动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程
哪些场景会使用aop
1、记录日志
2、monitor(请求次数,响应时间)
3、异常处理
4、认证鉴权
5、Caching 缓存
6、事物
springbean加载过程,aop发生在哪个步骤
spring 循环依赖怎么解决,为什么是三级缓存,二级行不行(https://blog.csdn.net/weixin_/article/details/)
https://baijiahao.baidu.com/s?id=&wfr=spider&for=pc
https://blog.csdn.net/weixin_/article/details/
Spring是通过三级缓存来实现的
springboot自动装配的原理(https://zhuanlan.zhihu.com/p/)
https://blog.csdn.net/weixin_/article/details/
https://www.cnblogs.com/15078480385zyc/p/16154533.html
自定义starter
https://www.jianshu.com/p/b388d5e6e07c
https://segmentfault.com/a/56653
并发
ThreadLocal原理,有哪些应用场景
线程池有没有使用,是怎么创建的
为什么很多公司不允许使用Executors去创建线程池
ThreadPoolExecutor核心参数,各自的作用
线程池运行流程
volatile关键字的作用
分布式-中间件
分布式锁(https://www.cnblogs.com/moxiaotao/p/10829799.html)
Redis实现分布式锁主要利用Redis的setnx命令
分布式任务调度方案
java分布式任务调度xxl-job
https://www.cnblogs.com/wuyongyin/p/14242162.html
用 quartz 提供的数据库 实现方式
redis
设计模式,熟悉哪几种设计模式
1、创建型模式:用来描述 “如何创建对象”,它的主要特点是 “将对象的创建和使用分离”。包括单例、原型、工厂方法、抽象工厂和建造者 5 种模式。
2、结构型模式:用来描述如何将类或对象按照某种布局组成更大的结构。包括代理、适配器、桥接、装饰、外观、享元和组合 7 种模式。
3、行为型模式:用来识别对象之间的常用交流模式以及如何分配职责。包括模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录和解释器 11 种模式。
在项目组原因哪些设计模式来优化或者重构代码
场景设计
实现秒杀系统,从前端到后端有哪些设计思路
https://www.jianshu.com/p/ed76fbfa9440
总体思路:使用集群,做容错,做缓存,做限流。
1、前端
1、尽量使用静态页面,cdn缓存
2、页面按钮点击置灰
3、
2、后端
控制层:1、根据ip,用户id做限流,消息队列做流量削峰、2、负载均衡加上服务器集群
业务层 :1、查多写少,做缓存,2、批量处理
接口瓶颈做容错处理。
用进程锁解决超卖
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/1625.html