记录几个 Java 开发面试题
建立索引的依据
1、表的主键和外键必须有索引。
2、数据量超过300的表应该有索引。
3、经常和其他表进行连接的表,连接字段应该有索引。
4、经常出现在where语句中的字段,特别是大表的字段,应该建立索引。
5、经常需要进行范围搜索的字段建索引,因为索引已经排序,指定范围是连续的。
6、经常需要排序的字段建立索引,因为索引已经排序。
7、经常出现在order by、group by、distinct后面的字段,建立索引。
8、索引应该建在小字段上,对于大的文本字段和超长字段,不要建索引。
9、如果总是同时出现在where语句,可以考虑建复合索引,否则分解为多个单字段索引。
10、复合索引应该将应用程度高的字段放在前面。
11、索引并不是越多越好,建太多会影响写数据的性能。
引用:
https://blog.csdn.net/cherry_xiu/article/details/79456872
https://www.cnblogs.com/net-study/p/3397359.html
https://www.cnblogs.com/s-b-b/p/8334593.html
什么情况下索引会无效
1、如果条件中有or,即使有其中条件带索引也不会使用(必须所有条件字段都建了索引)。
2、对于复合索引,顺位前面的字段不在条件中,不会使用该索引。
3、like查询时使用%开头的不会使用索引。
4、使用了null值判断的话会导致索引失效。
5、使用了!=、<>、in、not、not exists符号时不会使用索引。
6、在where子句中的=左边使用表达式或者函数时不会使用使用索引。
7、列与列的对比不会使用索引。
8、在where子句的=两边数据类型不一致的情况下不会使用索引。
引用:
https://zhuanlan.zhihu.com/p/58269930
https://www.jianshu.com/p/f4fb6b68e180
spring事务失效的原因
1、数据库引擎不支持事务,比如mysql的MyISAM。
2、当前类没有被Spring管理。
3、方法不是public。
4、同一个类中的不同方法间的调用。
5、数据源没有配置事务管理器。
6、主动不支持事务,Propagation.NOT_SUPPORTED。
7、异常被catch而没被抛出。
8、异常类型不一致,rollbackFor = Exception.class。
引用:
https://www.cnblogs.com/javastack/p/12160464.html
怎样避免死锁
1、银行家算法。
2、避免多次锁定。
3、设置相同的加锁顺序。
4、使用定时锁。
5、使用算法进行死锁检测。
引用:
https://blog.csdn.net/weixin_42228338/article/details/97686461
https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/79653840
整型间==什么时候为true什么时候为false
1、两个通过new生成的Integer变量比较,永远为false。
2、Integer变量和int变量比较时,只要值相等,则true。
3、非new生成的Integer和new生成的Integer比较,结果为false。
4、两个非new生成的Integer比较,值区间在-128~127则为true,否则为false。
引用:
https://blog.csdn.net/zjfahs/article/details/90138277
https://baijiahao.baidu.com/s?id=1649795543571026301&wfr=spider&for=pc
redis有哪些应用场景
1、热点数据缓存(如:session、token)。
2、定时器(expire)。
3、计数器(incrby)。
4、排行榜(SortedSet)。
5、分布式锁与单线程机制。
6、简单队列(list push、list pop)。
7、发布/订阅(publish、subscribe)。
8、固定长度最新列表(lpush、ltrim)。
9、位操作(setbit、getbit、bitcount)。
引用:
https://www.cnblogs.com/wadhf/p/11799419.html
https://www.cnblogs.com/NiceCui/p/7794659.html
HTTP协议的构成
1、请求信息
1)请求行,包括:方法、路径、http版本
2)请求头,包括:Accept、Accept-Encoding、Connection、Host、User-Agent等信息。
3)请求消息主体,常见格式:application/x-www-form-urlencoded、multipart/form-data、application/json。
2、响应信息
1)响应行,包括:http版本、状态码、描述。
2)相应头,包括:Connection、Content-Type、Set-Cookie等信息。
3)响应消息主体,常见格式:application/x-www-form-urlencoded、multipart/form-data、application/json。
引用:
https://www.cnblogs.com/superfeeling/p/11561340.html
https://blog.csdn.net/weixin_33984032/article/details/88834948
HTTP协议的生命周期
1、三次握手
1)第一次握手:客户端主动发送SYN包到服务端,并进入SYN_SEND状态,等待服务端确认。
2)第二次握手:服务端收到SYN包并确认,发送SYN+ACK到客户端,服务端进入SYN_RECV状态。
3)第三次握手:客户端收到SYN+ACK包,发送ACK确认连接,发送完毕后客户端和服务端进入ESTABLISHED状态,完成三次握手。
2、客户端发送HTTP请求消息。
3、服务端返回HTTP响应消息。
4、四次挥手
1)第一次挥手:客户端发送给FIN包,告诉服务端需要关闭连接,并进入FIN_WAIT_1状态。
2)第二次挥手:服务端收到FIN包后,发送一个ACK告诉客户端已经收到关闭请求,但还没准备好。服务端进入CLOSE_WAIT状态,客户端收到这个包后,进入FIN_WAIT_2,等待服务端关闭连接。
3)第三次挥手:服务端准备好关闭之后,发送FIN包告诉客户端准备关闭了。发送完成后,服务端进入LAST_ACT状态,等待客户端确认。
4)第四次挥手:客户端收到关闭请求后,再发送ACK包给服务端,并进入TIME_WAIT状态,等待服务端可能请求重传的ACK包。服务端收到ACK包后,关闭连接,进入CLOSED状态。客户端在等待固定时间(两个最大生命周期)后,没有收到服务端的ACK包,认为服务端已经关闭,自己也关闭连接,进入CLOSED状态。
引用:
https://blog.csdn.net/grl18840839630/article/details/80851479