【面试】JAVA面试基础知识总结

1、==和equals的区别

== 如果比较基本类型,比较的是值
== 如果比较引用类型,比较的是内存地址
equlas是Object类的方法,本质上与==一样,但是有些类重写了equals方法,比如String的equals被重写后,比较的是内存地址,另外重写了equlas后,也必须重写hashcode()方法

详情参考:https://blog.csdn.net/qq_27706119/article/details/119579521


2、String、StringBuffer、StringBuilder的区别

String 由 char[] 数组构成,使用了 final 修饰,对 String 进行改变时每次都会新生成一个 String 对象,然后把指针指向新的引用对象。
StringBuffer线程安全;
StringBuilder线程不安全。
操作少量字符数据用 String;单线程操作大量数据用 StringBuilder;多线程操作大量数据用 StringBuffer。


3、Synchrpnized和lock的区别
(1)synchronized是关键字,lock是一个类

(2) synchronized在发生异常时会自动释放锁,lock需要手动释放锁

(3)synchronized是可重入锁、非公平锁、不可中断锁,lock是可重入锁,可中断锁,可以是公平锁
synchronized不可中断的说法:只有获取到锁之后才能中断,等待锁时不可中断。


4、completedfuture和futuretask
https://blog.csdn.net/weixin_36340771/article/details/123311995

FutureTask存在的问题
无法手动完成:当调用远程服务时,如果发现远程服务出现问题,你需要将最近一次正常结果返回;这时使用Future就无法满足该需求。
无法添加回调方法:当调用远程服务结束后需要调用其它方法时,如果使用Future,则需要不断循环调用isDone方法判断是否完成;然后调用get获得结果,接着调用其它方法。
无法将多任务合并获得结果:当需要并行调用多个远程服务时,在获得返回结果时需要不断循环调用各future的isDone方法。
没有异常处理:Future API没有提供异常处理方法。


5、threadlocal
https://blog.csdn.net/u010445301/article/details/111322569


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.定义后即刻创建刚刚定义的这个子类的对象


9、TCP连接为什么要三次握手
https://baijiahao.baidu.com/s?id=1695910428789927548&wfr=spider&for=pc

第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。

第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。从客户端的视角来看,我接到了服务端发送过来的响应数据包,说明服务端接收到了我在第一次握手时发送的网络包,并且成功发送了响应数据包,这就说明,服务端的接收、发送能力正常。而另一方面,我收到了服务端的响应数据包,说明我第一次发送的网络包成功到达服务端,这样,我自己的发送和接收能力也是正常的。

第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力,服务端的发送、接收能力是正常的。第一、二次握手后,服务端并不知道客户端的接收能力以及自己的发送能力是否正常。
而在第三次握手时,服务端收到了客户端对第二次握手作的回应。从服务端的角度,我在第二次握手时的响应数据发送出去了,客户端接收到了。所以,我的发送能力是正常的。而客户端的接收能力也是正常的。
经历了上面的三次握手过程,客户端和服务端都确认了自己的接收、发送能力是正常的。之后就可以正常通信了。

为当服务端收到客户端的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是如何防止SQL注入的?

mybatis 什么是一级缓存和二级缓存。 一级缓存和二级缓存默认开闭状态。

Mybatis的插件运行原理,如何实现mybatis插件。
https://blog.csdn.net/agonie201218/article/details/124951885

说下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/113917726

mysql的四种隔离级别
读取未提交内容
读取提交内容
可重读
可串行化
https://blog.csdn.net/weisong530624687/article/details/90075063
https://blog.csdn.net/qq_39408664/article/details/119037440
事务具有四个特征
原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability

数据结构
hashmap list 原理,线程安全还是非线程安全
https://blog.csdn.net/weixin_45119323/article/details/108659506

有哪些线程安全的map

Mybatis是如何进行分页的?分页插件的原理是什么?
  答:Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10

简述Mybatis的插件运行原理,以及如何编写一个插件。
  答:Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。

实现Mybatis的Interceptor接口并复写intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。

8、Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
答:Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。

它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

mybatis的一级缓存和二级缓存
MyBatis 的一级缓存是基于数据库会话(SqlSession 对象)的,默认开启。二级缓存是基于全局(nameSpace)的,开启需要配置。
二级缓存的特点和使用场景:二级缓存作用于全局,对于一些相当消耗性能的,并且对于时效性不敏感的查询可以使用二级缓存。注意,如果开启了二级缓存,查询的顺序是二级缓存 → 一级缓存 → 数据库。
在全局设置中开启二级缓存

...

在 xxxMapper.xml 中开启 标签

jvm
jvm内存结构(https://blog.csdn.net/qq_36704549/article/details/109390566)
1、程序计数器(PC寄存器)(线程私有)
2、java栈(线程私有)
3、本地方法栈(线程私有)
4、堆(线程共享)
5、方法区(线程共享)

了解
GC回收算法(https://blog.csdn.net/u014131617/article/details/92130287)
1.标记清除算法
2.复制算法
3.标记整理算法
4.分代收集算法
分代收集法是目前大部分JVM所采用的方法
新生代都采取复制算
老年代采用标记整理算法

如何确定垃圾
1.引用计数法
2.可达性分析

JVM优化思路
gc目标:
GC的时间足够的小
GC的次数足够的少
发生Full GC的周期足够的长

gc原则:	

https://www.cnblogs.com/csniper/p/5592593.html

熟悉哪几种垃圾回收器,线上环境使用哪种垃圾回收器,如果有调整,谈谈选型思路

jvm内存溢出排查

年轻代和老年代的划分,为什么要设置两个Survivor区
https://www.cnblogs.com/snowwhite/p/9532311.html

jvm对象分配机制
类加载检查
分配内存(指针碰撞,空闲列表)
初始化
设置对象头
执行init方法
https://www.cnblogs.com/riches/p/14619766.html

双亲委派(https://blog.csdn.net/codeyanbao/article/details/82875064)
双亲委派机制的作用
1、防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。
2、保证核心.class不能被篡改。通过委托方式,不会去篡改核心.clas,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。

缺陷:
BootstrapClassloader无法委派AppClassLoader来加载类

怎么打破双亲委派
自定义类加载器,重写loadClass方法
使用线程上下文类加载器-

框架
讲讲对aop的理解
动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程
哪些场景会使用aop
1、记录日志
2、monitor(请求次数,响应时间)
3、异常处理
4、认证鉴权
5、Caching 缓存
6、事物

springbean加载过程,aop发生在哪个步骤

spring 循环依赖怎么解决,为什么是三级缓存,二级行不行(https://blog.csdn.net/weixin_45727359/article/details/114696668)
https://baijiahao.baidu.com/s?id=1694034649427742142&wfr=spider&for=pc
https://blog.csdn.net/weixin_44129618/article/details/122839774
Spring是通过三级缓存来实现的

springboot自动装配的原理(https://zhuanlan.zhihu.com/p/95217578)
https://blog.csdn.net/weixin_30571837/article/details/114829995
https://www.cnblogs.com/15078480385zyc/p/16154533.html

自定义starter
https://www.jianshu.com/p/b388d5e6e07c
https://segmentfault.com/a/1190000041456653

并发
ThreadLocal原理,有哪些应用场景
线程池有没有使用,是怎么创建的
为什么很多公司不允许使用Executors去创建线程池
ThreadPoolExecutor核心参数,各自的作用
线程池运行流程
volatile关键字的作用

分布式-中间件
分布式锁(https://www.cnblogs.com/moxiaotao/p/10829799.html)
Redis实现分布式锁主要利用Redis的setnx命令

mq消息可靠性
消费幂等

分布式任务调度方案
java分布式任务调度xxl-job
https://www.cnblogs.com/wuyongyin/p/14242162.html
用 quartz 提供的数据库 实现方式

redis

设计模式,熟悉哪几种设计模式
1、创建型模式:用来描述 “如何创建对象”,它的主要特点是 “将对象的创建和使用分离”。包括单例、原型、工厂方法、抽象工厂和建造者 5 种模式。
2、结构型模式:用来描述如何将类或对象按照某种布局组成更大的结构。包括代理、适配器、桥接、装饰、外观、享元和组合 7 种模式。
3、行为型模式:用来识别对象之间的常用交流模式以及如何分配职责。包括模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录和解释器 11 种模式。

在项目组原因哪些设计模式来优化或者重构代码

版本管理
git分支管理

场景设计
实现秒杀系统,从前端到后端有哪些设计思路
https://www.jianshu.com/p/ed76fbfa9440

总体思路:使用集群,做容错,做缓存,做限流。

1、前端
1、尽量使用静态页面,cdn缓存
2、页面按钮点击置灰
3、

2、后端
控制层:1、根据ip,用户id做限流,消息队列做流量削峰、2、负载均衡加上服务器集群
业务层 :1、查多写少,做缓存,2、批量处理
接口瓶颈做容错处理。
用进程锁解决超卖

3、数据库
建立新表,分库分表,读写分离,

正常的分布式架构,是都要拆开的:
web服务器集群(nginx) + 应用服务器集群(tomcat) + 文件服务器集群 + 数据库服务器集群 + 消息队列集群 + 缓存集群等等

OD机试考题答案汇总:
https://wiki.amoscloud.com/zh/ProgramingPractice/NowCoder/Adecco/Index

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值