Java面试问题整理

今天毕业了,准备整理整理面试题。

Mybatis中mapper层和dao如何进行映射?

Mybatis将配置文件中的每一个< mapper>节点抽象成一个Mapper

HTTP状态码和HTTP状态码分类

状态码

状态码 含义
200 请求成功
301 资源被永久转义到其他URL
404 请求的资源不存在
500 内部服务器错误

状态码分类

分类 分类含义
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

Spring中bean的生命周期

Spring中的bean的声明周期有5种:singleton(单例)、prototype(多例)、request、session、globalsession。
在这里插入图片描述
在Spring中,那些组成程序的主体和由Spring IoC管理的对象称为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象。
Spring中的bean默认是单例模式。对于Web应用来说,Web容器对于每个用户请求都创建一个单独的Sevlet线程来处理请求。Spring的单例是基于BeanFactory也就是Spring容器的,单例Bean在此容器内只有一个。
当一个bean的作用域为Singleton,那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。(但我们可以指定Bean节点的lazy-init=”true”来延迟初始化bean,这时候,只有在第一次获取bean时才会初始化bean,即第一次请求该bean时才初始化)

网络上有很多资源,我就没有抄下来,按自己想法先写。

这里借鉴的博客有
https://blog.csdn.net/u012385190/article/details/81368748#二、BeanFactory的bean生命周期相关代码

  <bean id="person" class="demo02.bean.Person"
          p:address="上海市"
          p:age="25"
          init-method="myInit"
          destroy-method="myDestroy"
  />

按照上面的说法:
第一步:实例化创建bean
第二步:按照Spring上下文对实例化的Bean进行配置
第三步:实现BeanNameAware接口,调用setBeanName(String beanId)方法,传递的是Spring配置文件中bean的ID
第四步:实现BeanFactoryAware接口,调用它实现的setBeanFactory(),传递Spring工厂本身。
从这一步开始,到后面就不懂了

第n步:使用
最后一步:销毁

Mybatis的缓存

Mybatis的缓存分为一级缓存和二级缓存。
每当我们使用MyBatis开启一次和数据库的会话,MyBatis会创建出一个SqlSession对象表示一次数据库会话。
如下图所示,MyBatis会在一次会话的表示----一个SqlSession对象中创建一个本地缓存(local cache),对于每一次查询,都会尝试根据查询的条件去本地缓存中查找是否在缓存中,如果在缓存中,就直接从缓存中取出,然后返回给用户;否则,从数据库读取数据,将查询结果存入缓存并返回给用户。
在这里插入图片描述
SqlSession对象里面有Executor对象操作缓存,使用HashMap存储缓存。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。

二级缓存
二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
二级缓存要手动开启

Java集合类框架的基本接口有哪些?

总共有两大类接口:Collection和Map,一个是元素集合,一个是键值对集合;其中List和Set接口继承了Collection接口,List是有序集合,Set是无序集合;ArrayList和LinkedList实现了List接口;HashSet实现了Set接口,但是实际上是基于HashMap实现的;HashMap和HashTable实现了Map接口,并且HashTable是线程安全的,由此HashMap性能更好。

HashMap工作的原理

Java中HashMap使用HashCode( )和equal( )方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。在jdk1.8以前,实现方式是:数组+链表,jdk1.8会后添加了红黑色也就变成了:数组+链表+红黑树。当链表长度大于8时,自动转换为红黑树。

如果key为自定义的类,要使用HashMap必须重写Object里的hashCode( )和equal( )方法。当两个hashCode相同时,类不一定相等。如果两个equal相等,那hashCode也相等。

HashMap和HashTable有什么区别

两则都实现了Map接口。
HashMap允许简直都是null,HashTable不允许简直为null。
HashTable是线程安全的,性能差。
HashMap非线程安全,性能好。

数组(Array)和链表(ArrayList)区别

数组大小固定,链表大小可动态变化。
数组是顺序存储,链表通过指针存储,存储地址非连续的。
链表插入删除快,查询慢。数组相反。
数组只能包含基本类型和对象类型,ArrayList只能包含对象类型。

异常处理完用户,Exception对象会发生什么变化?

异常处理对象在异常处理完后,没有引用指向他,变成不可达对象。JVM在gc过程中进行标记,如果实现了finalize方法,会被安排到F-queue所在线程中,在下一次执行gc中,Exception如果要将执行完finalize方法,就会被回收。

finally代码块和finalize( )方法有什么区别?

无论是否发生异常,finally代码一定会执行,如果catch和finally中都有return,那么finally就会覆盖catch的return。finalize()方法是Object类的一个protected方法,它是在对象被垃圾回收之前由Java来调用。

数据库连接池

定义数据库连接池会设定这两个值:最大连接数、最小连接数。连接对象可分为可使用和在使用,当请求一个连接对象时,先去可使用请求,如果连接数未达到上限,直接分配,如果没有可使用对象,但是连接数未达到最大,直接去在使用那边创建一个连接使用,否则等待。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章