avatar

Java面试题13

1.拦截器和过滤器的区别

区别 过滤器 拦截器
使用范围 servlet规范中的一部分,任何Java Web工程都可以使用 只能在SpringMVC框架的工程中使用
拦截范围 在 url-pattern中配置了/*后,可以对所有要访问的资源拦截 只拦截访问的控制器方法,不会拦截访问的jsp,html,css,image或js
# 2.什么是SpringMVC?
1
一种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架
# 3.Spring的优势有哪些?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Spring的优势
1.方便解耦,简化开发
通过Spring提供的IOC容器,可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的过度耦合,也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用
2.AOP 编程的支持
通过Spring的AOP功能,方便进行切面编程,许多不容易用传统OOP实现的功能可以通过AOP轻松实现
3.声明式事务的支持
从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务管理,提高开发效率和质量
4.方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作
5.方便集成各种优秀框架
Spring对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的支持
6.降低JavaEE API的使用难度
JavaEE API(JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些API的使用难度大为降低
7.源码开放
# 4.Bean实例化的三种方式是哪些?
1
2
3
1.无参构造方法实例化
2.工厂静态方法实例化
3.工厂实例方法实例化
# 5.AOP的作用及优势
1
2
作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强
优势:减少重复代码,提高开发效率,并且便于维护
# 6.AOP的底层是怎么实现的?
1
通过Spring提供的的动态代理技术实现的.在运行期间,Spring通过动态代理技术动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能的增强
# 7.散列表中解决冲突的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1.开放定址法: 一旦发生冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入
Hi = (H(key) + di) MOD m, i=1,2,…, k(k<=m-1),其中H(key)为散列函数,m为散列表长,di为增量序列;di可有下列三种取法:
1.di=1,2,3,…, m-1,称为线性探测再散列;
缺点: 造成大量元素在相邻的散列地址上"聚集",大大降低查找效率
2.di=1^2, -(1^2), 2^2, -(2^2), 3^2, …, ±(k^2),(k<=m/2),称为二次探测再散列;
优点: 避免出现"堆积"问题。
缺点: 不能探测到散列表上的所有单元,但至少能探测到一半单元
3.di=伪随机数序列,称为伪随机探测再散列。
缺点: 用同样的随机种子,将得到相同的数列。
缺点:
1.存储记录的数目不能超过桶数组的长度,如果超过就需要扩容,而扩容会导致某次操作的时间成本飙升,这在实时或者交互式应用中可能会是一个严重的缺陷
2.使用探测序列,有可能其计算的时间成本过高,导致哈希表的处理性能降低
3.由于记录是存放在桶数组中的,而桶数组必然存在空槽,所以当记录本身尺寸(size)很大并且记录总数规模很大时,空槽占用的空间会导致明显的内存浪费
4.删除记录时,比较麻烦;比如需要删除记录a,记录b是在a之后插入桶数组的,但是和记录a有冲突,是通过探测序列再次跳转找到的地址,所以如果直接删除a,a的位置变为空槽,而空槽是查询记录失败的终止条件,这样会导致记录b在a的位置重新插入数据前不可见,所以不能直接删除a,而是设置删除标记.这就需要额外的空间和操作
2.再散列函数法: 在同义词产生地址冲突时就换用另一个散列函数计算散列地址,直到碰撞不再发生
优点: 不易产生"聚集"
缺点: 增加了计算时间
3.链地址法: 将所有关键字为同义词的记录存储在一个单链表中,称这种表为同义词子表,在散列表中只存储所有同义词子表的头指针
优点:
1.对于记录总数频繁可变的情况,处理的比较好(也就是避免了动态调整的开销)
2.由于记录存储在结点中,而结点是动态分配,不会造成内存的浪费,所以尤其适合那种记录本身尺寸(size)很大的情况,因为此时指针的开销可以忽略不计了
3.删除记录时,比较方便,直接通过指针操作即可
缺点:
1.存储的记录是随机分布在内存中的,在查询记录时,相比结构紧凑的数据类型(比如数组),哈希表的跳转访问会带来额外的时间开销
2.如果所有的key-value对是可以提前预知,并之后不会发生变化时(即不允许插入和删除),可以人为创建一个不会产生冲突的完美哈希函数(perfect hash function),此时封闭散列的性能将远高于开放散列
使用:
HashMap使用了链地址法解决hash值相同的冲突
4.公共溢出区法: 为所有冲突的关键字记录建立一个公共的溢出区来存放;在查找时,对给定关键字通过散列函数计算出散列地址后,先与基本表的相应位置进行比对,如果相等,则查找成功;如果不相等,则到溢出表进行顺序查找.如果相对于基本表而言,在有冲突的数据很少的情况下,公共溢出区的结构对查找性能来说是非常高的
# 8.数据结构中的散列表高速索引的机制
1
长度为n的线性表,存在无序数据,平均查找时间为n/2,引入hash函数(散列函数),关联数据和存储位置,存取数据前,先使用hash函数计算hash值
# 9.链地址相对于开放定址法的优缺点
1
2
3
4
5
6
7
8
9
优点:
1.拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短
2.由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况
3.开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间.而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间
4.在用拉链法构造的散列表中,删除结点的操作易于实现;只要简单地删去链表上相应的结点即可.而对开放地址法构造的散列表,删除结点不能简单地将被删结点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径.这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条件.因此在用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点
缺点:
1.指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间,而若将节省的指针空间用来扩大散列表的规模,可使装填因子变小,这又减少了开放定址法中的冲突,从而提高平均查找速度
总结:
元素少,用开放定址法,冲突少,速度快;元素多,用链地址
# 10.什么是fail-fast机制
1
即快速失败机制,是java集合(Collection)中的一种错误检测机制.当在迭代集合的过程中该集合在结构上发生改变的时候,就有可能会发生fail-fast,即抛出 ConcurrentModificationException异常.fail-fast机制并不保证在不同步的修改下一定会抛出异常,它只是尽最大努力去抛出,所以这种机制一般仅用于检测bug
文章作者: 123
文章链接: https://gao5805123.github.io/123/2021/05/13/Java%E9%9D%A2%E8%AF%95%E9%A2%9813/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 123
打赏
  • 微信
    微信
  • 支付宝
    支付宝