Java教程

Java面试题二

本文主要是介绍Java面试题二,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1、Redis如果缓存空间满了怎么处理?

        答:Redis中有对应的淘汰机制,用于处理缓存空间不够的情况,我们只需要进行合理的配置就可以了。

一般我们在将数据缓存到redis中的时候就可以设置缓存的过期时间,以免缓存中的数据一直增长。但是我们还是要考虑特殊情况,就是当缓存已经满了的时候,但是我们设置的过期时间还未到,这时如不对缓存空间进行处理,就会发生内存溢出的情况。redis中专门有用于这种情况的淘汰机制。

        1、lru 淘汰被最早访问的数据--以链表的形式,最早访问的数据放在链表头,最新访问的数据放在链表尾部,当内存不够的时候,优先删除链表头部的数据。

        2、lfu 淘汰访问评率最低的数据--如何确保访问量不受新老数据的影响?--redis为每一个新数据设置了一个时间戳和计数器,只有当计数器到达一定的值,或者过了一定时间,这个新数据才会和其他老数据进行比较。并且计数器的是是随着时间推移,如果没有访问的话计数器会逐渐衰减。

        3、随机淘汰--随机抽取一部分数据删除,一般不用

2、servlet的生命周期?

        答:初始化:加载servlet类,并调用init()

               使用阶段:调用service()方法,

                结束阶段:调用destory()方法,此时servlet将等待jvm的垃圾回收

3、类在jvm中的生命周期?

        答:加载:jvm加载字节码文件

                连接:分为三个步骤

                        验证:检验字节码文件加载的类是否符合jvm对类的规范。

                        准备:为静态变量,静态方法在方法区中划分静态区,并给静态变量赋初始值,整型为0,字符型为null,布尔型为false

                        解析:将符号引用转化为直接引用,就是将地址值赋值为对应的引用对象

        初始化:将类中的变量进行初始化赋值,此时的赋值是将类中定义的量赋值给变量

                使用:定义对象,进行使用

                卸载:在该类没有任何引用后jvm对其进行垃圾回收

4、如何对搜索进行优化?

        答:默认此时的搜索是通过遍历来得到数据结果的

                1、可以参考elasticSearch中对数据进行的操作,建立一个类,采用倒排索引的方法将所有数据存放到其中,在进行搜的时候通过这个类来查询。

                2、也可以吧数据做成二叉树的形式,查询的时候,重二叉树中找数据也会快一点

5、hashmap和hashtable的区别?

        答:1、hashMap是线程不安全的,hashtable是线程安全的

                2、hashmap中key,value可以为null,hashtable中不行

                3、hashmap和hashtable继承的父类是不同的,且hashtable继承的父类以及是淘汰的

6、线程的生命周期?

        答:新生--就绪--运行--(阻塞)--死亡

7、线程的状态有那些,以及是如何达到这个状态的?

        答:就绪:调用start()方法时,线程就进入线程池等待cpu的调用

               运行:cpu给对应线程分配时间片

                阻塞:阻塞也可以说是等待状态

                                有限期等待状态:sleep(timeout)  wait(timeout) join(timeout)

                                 无限期等待:wait()  join()

                                        wait()如果不定义时间,会一直处于等待状态,直到有另一个线程通过notify()/notifyAll()方法将其唤醒。

                                        join()如果不设置过期时间,就会一直执行wait(0)的方法,直到该线程死亡。

                死亡:线程结束会自动死亡

8、wait()和sleep()方法的区别:

        答:wait()是Object的方法。sleep()是Thread类的方法

        调用wait()方法时,线程会释放cpu资源,直到被notify方法唤醒,sleep()方法在调用的时候不会释放资源,要等到睡眠时间结束继续执行

9、线程池的特点?

        答:我们一般用ThreadPoolExcuter来创建线程池

               在线程使用不多的情况下,默认使用的是核心线程,任务量提高了,核心线程不够用了,就会逐渐拓展到最大线程数,如果任务量还在提高,线程已经满载运行了,等待队列也满了。此时就会触发拒绝策略,就是不继续接收任务。当任务量减小的时候,除核心线程外,其余的线程会在等待一段时间,后死亡。

10、如何处理数据库返回的结果集?

        答:这里解释的是springboot,mybatisplus的情况

               首先要创建一个和访问结果中的类型相同的类和一个对应的dao类,然后使访问数据库的类继承mybatisplus中的ServiceImpl类,并将ServiceImpl的泛型设置为<dao类,类名>。ServiceImpl中有通过id或者通过过滤器得到结果集的方法,得到的结果集就是之前建立的类的集合。

11、spring的核心模块有那些?

        答:iop容器模块

                aop模块

                数据库模块

                web引用模块

                测试模块

12、Redis缓存穿透,缓存击穿,缓存雪崩分别是什么意思以及解决思路

        答:缓存穿透:访问数据库中不存在的数据,正常情况下如果查询数据库没有的数据,返回null是不会吧结果放到缓存中,这就导致每次查询都会去访问一次数据库。

        解决办法:1、使用布隆过滤器  2、缓存返回的null数据

                缓存击穿:访问数据库中存在的一条数据,并且这个访问的并发量很大,缓存击穿就出现在redis中这个数据的key过期的时候,大量的并发同时访问数据库,造成服务器的崩溃。

        解决办法:采用互斥锁,即当value值为空的时候不是我们去访问数据库,而是通过redis自带的setnex  (set if not exit)来加载对应的key,value。当返回结果为true时,表示数据库中对应的数据已经缓存到redis上了,大并发的数据此时就访问的就是redis中的数据了

                缓存雪崩:不同数据访问,并发量很大,如果redis中key在同一时刻过期,也会造成大量数据直接访问数据库,

        解决办法:1、分散缓存过期的时间 2、可以设置热点数据永不过期

提前说明一下,这是我面试的问题都是我在网上找的答案,结合自己的话说了一下理解,不一定是正确的,主要作为我个人的总结。

这篇关于Java面试题二的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!