java面试题3
程序员文章站
2022-05-06 17:52:32
...
文章目录
- 1、强引用、软引用、弱引用、虚引用与GC的关系?
- 2、String类为什么是final的?
- 3、HashMap底层结构是怎样的?线程是否安全?如果线程不安全,怎么使用保证线程安全?
- 4、Volatile的含义?
- 5、java创建线程后,直接调用start()方法和run()的区别?
- 6、数据库优化方案?
- 7、ArrayList与Vector的比较区别是什么?
- 8、BIO、NIO和AIO的区别?
- 9、当数据表中A、B字段做了组合索引,那么单独使用A或单独使用B会有索引效果吗?(使用like查询如何有索引效果)?
- 10、一条sql执行时间过长,你如何优化,从哪些方面?
- 11、Spring实现AOP方式?
- 12、redis是如何持久化配置?
- 13、项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果?
1、强引用、软引用、弱引用、虚引用与GC的关系?
https://blog.csdn.net/a568418299/article/details/78914637
2、String类为什么是final的?
1.为了实现字符串池
2.为了线程安全
3.为了实现String可以创建HashCode不可变性 首
先你要理解final的用途,在分析String为什么要用final修饰,final可以修饰类,方法和变量,并且被修饰的类或方法,被final修饰的类不能被继承,即它不能拥有自己的子类,被final修饰的方法不能被重写, final修饰的变量,无论是类属性、对象属性、形参还是局部变量,都需要进行初始化操作。在了解final的用途后,在看String为什么要被final修饰:主要是为了”安全性“和”效率“的缘故。
3、HashMap底层结构是怎样的?线程是否安全?如果线程不安全,怎么使用保证线程安全?
4、Volatile的含义?
用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。volatile很容易被误用,用来进行原子性操作。
5、java创建线程后,直接调用start()方法和run()的区别?
run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用;
start()方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程;
6、数据库优化方案?
具体优化手段:
A:尽量少用(或者不用)sqlserver 自带的函数
select id from t where substring(name,1,3) = ’abc’
select id from t where datediff(day,createdate,’2005-11-30′) = 0
可以这样查询:
select id from t where name like ‘abc%’
select id from t where createdate >= ‘2005-11-30’ and createdate < ‘2005-12-1’
B:连续数值条件,用BETWEEN不用IN:SELECT id FROM t WHERE num BETWEEN 1 AND 5
C:Update 语句,如果只更改1、2个字段,不要Update全部字段,否则频繁调用会引起明显的性能消耗
D:尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型
E:不建议使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。尽量避免向客户 端返回大数据量,若数据量过大,应该考虑相应需求是否合理
F:表与表之间通过一个冗余字段来关联,要比直接使用JOIN有更好的性能
G:select count(*) from table;这样不带任何条件的count会引起全表扫描
连接池调优
我们的应用为了实现数据库连接的高效获取、对数据库连接的限流等目的,通常会采用连接池类的方案,即每一个应用节点都管理了一个到各个数据库的连接池。随着业务访问量或者数据量的增长,原有的连接池参数可能不能很好地满足需求,这个时候就需要结合当前使用连接池的原理、具体的连接池监控数据和当前的业务量作一个综合的判断,通过反复的几次调试得到最终的调优参数。
https://blog.csdn.net/u013628152/article/details/82184809
7、ArrayList与Vector的比较区别是什么?
• 线程安全:Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而 ArrayList 是非线程安全的。
• 性能:ArrayList 在性能方面要优于 Vector。
• 扩容:ArrayList 和 Vector 都会根据实际的需要动态的调整容量,只不过在 Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%。
8、BIO、NIO和AIO的区别?
• BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
• NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
• AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
https://blog.csdn.net/meism5/article/details/89469101
9、当数据表中A、B字段做了组合索引,那么单独使用A或单独使用B会有索引效果吗?(使用like查询如何有索引效果)?
10、一条sql执行时间过长,你如何优化,从哪些方面?
1、查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化)
2、涉及链表的查询,是否能进行分表查询,单表查询之后的结果进行字段整合
3、如果以上两种都不能操作,非要链表查询,那么考虑对相对应的查询条件做索引。加快查询速度
4、针对数量大的表进行历史表分离(如交易流水表)
5、数据库主从分离,读写分离,降低读写针对同一表同时的压力,至于主从同步,mysql有自带的binlog实现 主从同步
6、explain分析sql语句,查看执行计划,分析索引是否用上,分析扫描行数等等
7、查看mysql执行日志,看看是否有其他方面的问题
11、Spring实现AOP方式?
12、redis是如何持久化配置?
13、项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果?
用缓存,主要有两个用途:高性能、高并发。
缓存是走内存的,内存天然就支撑高并发。
常见的缓存问题有以下几个:
缓存与数据库双写不一致
缓存雪崩、缓存穿透
缓存并发竞争
上一篇: java泛型常问面试题总结
下一篇: Java | 面试题(3)