java开发工程师面试题小汇总(一)
一、.JDBC工作流程
第一步:Class.forName()加载数据库连接驱动;
第二步:DriverManager.getConnection()获取数据连接对象;
第三步:根据SQL获取sql会话对象,有2种方式 Statement、PreparedStatement ;
第四步:执行SQL处理结果集,执行SQL前如果有参数值就设置参数值setXXX();
第五步:关闭结果集、关闭会话、关闭连接。
二、ArrayList和LinkedList区别和使用场景
区别:
- ArrayList的实现是基于数组,LinkedList的实现是基于双向链表;
- 对于随机访问ArrayList要优于LinkedList,ArrayList可以根据下标以O(1)时间复杂度对元素进行随机访问,而LinkedList的每一个元素都依靠地址指针和它后一个元素连接在一起,查找某个元素的时间复杂度是O(N);
- 对于插入和删除操作,LinkedList要优于ArrayList,因为当元素被添加到LinkedList任意位置的时候,不需要像ArrayList那样重新计算大小或者是更新索引;
- LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。
使用场景:
1.如果应用程序对数据有较多的随机访问,ArrayList对象要优于LinkedList对象;
2.如果应用程序有更多的插入或者删除操作,较少的随机访问,LinkedList对象要优于ArrayList对象;
3.不过ArrayList的插入,删除操作也不一定比LinkedList慢,如果在List靠近末尾的地方插入,那么ArrayList只需要移动较少的数据,而LinkedList则需要一直查找到列表尾部,反而耗费较多时间,这时ArrayList就比LinkedList要快。
三、数据库事务4大特性:
○ 原子性(Atomicity)
■ 事务就像“原子”一样,不可被分割,组成事务的DML操作语句要么全成功,要么全失败,不可能出现部分成功部分失败的情况。
○ 一致性(Consistency)
■ 一旦事务完成,不管是成功的,还是失败的,整个系统处于数据一致的状态。
○ 隔离性(Isolation)
■ 一个事务的执行不会被另一个事务所干扰。比如两个人同时从一个账户从取钱,通过事务的隔离性确保账户余额的正确性。
○ 持久性(Durability)
■ 也称为永久性,指事务一旦提交,对数据的改变就是永久的,不可以再被回滚。
四、servlet的生命周期
(1)加载和实例化
当Servlet容器启动或客户端发送一个请求时,Servlet容器会查找内存中是否存在该Servlet实例,若存在,则直接读取该实例响应请求;如果不存在,就创建一个Servlet实例。
(2) 初始化
实例化后,Servlet容器将调用Servlet的init()方法进行初始化(一些准备工作或资源预加载工作)。只执行一次
(3)服务
初始化后,Servlet处于能响应请求的就绪状态。当接收到客户端请求时,调用service()的方法处理客户端请求,HttpServlet的service()方法会根据不同的请求 转调不同的doXxx()方法。
(4)销毁
当Servlet容器关闭时,Servlet实例也随时销毁。其间,Servlet容器会调用Servlet 的destroy()方法去判断该Servlet是否应当被释放(或回收资源)。只执行一次
五、使用迭代器遍历map集合
// iterator原理是什么 通过iterator遍历map
Iterator<Map.Entry<Integer,Integer>> iter = map.entrySet().iterator();
while(iter.hasNext()){
Map.Entry entry = iter.next();
System.out.println(entry.getKey()+" : "+entry.getValue());
iter.remove();
}
六、创建线程的四种方式
分别是继承Thread类、实现Runnable接口、实现Callable接口、创建线程池对象。
run()和start()的区别:run()方法被称为线程执行体,它的方法体代表了线程需要完成的任务,而start()方法用来启动线程。
七、Spring AOP
AOP有两种实现方式:静态代理和动态代理。
静态代理
静态代理:代理类在编译阶段生成,在编译阶段将通知织入Java字节码中,也称编译时增强。AspectJ使用的是静态代理。
缺点:代理对象需要与目标对象实现一样的接口,并且实现接口的方法,会有冗余代码。同时,一旦接口增加方法,目标对象与代理对象都要维护。
动态代理
动态代理:代理类在程序运行时创建,AOP框架不会去修改字节码,而是在内存中临时生成一个代理对象,在运行期间对业务方法进行增强,不会生成新类。
Spring AOP的实现原理
Spring
的AOP
实现原理其实很简单,就是通过动态代理实现的。如果我们为Spring
的某个bean
配置了切面,那么Spring
在创建这个bean
的时候,实际上创建的是这个bean
的一个代理对象,我们后续对bean
中方法的调用,实际上调用的是代理类重写的代理方法。而Spring
的AOP
使用了两种动态代理,分别是JDK的动态代理,以及CGLib的动态代理。
JDK动态代理和CGLIB动态代理的区别?
Spring AOP中的动态代理主要有两种方式:JDK动态代理和CGLIB动态代理。
JDK动态代理
如果目标类实现了接口,Spring AOP会选择使用JDK动态代理目标类。代理类根据目标类实现的接口动态生成,不需要自己编写,生成的动态代理类和目标类都实现相同的接口。JDK动态代理的核心是InvocationHandler
接口和Proxy
类。
缺点:目标类必须有实现的接口。如果某个类没有实现接口,那么这个类就不能用JDK动态代理。
CGLIB动态代理
通过继承实现。如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library)可以在运行时动态生成类的字节码,动态创建目标类的子类对象,在子类对象中增强目标类。
CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final
,那么它是无法使用CGLIB做动态代理的。
优点:目标类不需要实现特定的接口,更加灵活。
八、Springboot三大核心注解:
1.SpringbootConfiguration:实现配置文件
2.enableautoConfiguration:打开、关闭自动配置
3.componentScan:Spring组件扫描
九、Cookie、Session、LocalStroage、SessionStroage区别
session与cookie有什么区别
- 作用范围不同,cookie保存在客户端,session保存在服务端
- 有效期不同,cookie可设置保存时长,session一般失效时间较短,客户端关闭或者session超时都会失效
localStorage、sessionStorage有什么区别
localStorage生命周期是永久,这意味着除非用户显示在浏览器提供的UI上清除localStorage信息 否则这些信息将永远存在,存储在硬盘中。localStorage和sessionStorage都是用来存储客户端临时信息的对象。
sessionStorage生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也就被清空了。
十、Mybetis常用标签
<select id="selectUserInfo" resultType="com.java265.po.UserInfo">
<bind name="pattern" value="'%'+_parameter+'%'" />
SELECT id,name,notes
FROM UserInfo
WHERE name like #{pattern}
</select>
十一、原生ajax
主要作用:
1.发送同步、异步请求
2.进行网页局部刷新
3.来自于服务器的数据
4.前后端分离
5.表单元素动态认证
流程:
.XMLHttpRequest对象:负责实现ajax技术的对象
(1)创建xhr对象
let xhr=new XMLHttpRequest()
(2)设置请求方法和地址
xhr.open('请求方法','请求地址')
(3)发送请求
xhr.send()
(4)注册响应完成事件
xhr.οnlοad=function(){ xhr.responseText }
POST和GET请求区别:
- GET在浏览器回退时是无害的,而POST会再次提交请求。
- GET产生的URL地址可以被Bookmark,而POST不可以。
- GET请求会被浏览器主动cache,而POST不会,除非手动设置。
- GET请求只能进行url编码,而POST支持多种编码方式。
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- GET请求在URL中传送的参数是有长度限制的,而POST没有。
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET参数通过URL传递,POST放在Request body中。
十二、AJAX跨域实现
1.返回新的CorsFilter(全局跨域)
响应头添加Header允许访问
跨域资源共享(CORS)Cross-Origin Resource Sharing
这个跨域访问的解决方案的安全基础是基于"JavaScript无法控制该HTTP头"
它需要通过目标域返回的HTTP头来授权是否允许跨域访问。
response.setHeader("Access-Control-Allow-Origin", "http://localhost:8081");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.seHeader(‘Access-Control-Allow-Method:POST,GET’);//允许访问的方式
2.重写WebMvcConfigurer(全局跨域)
// 案例 一
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
//是否发送Cookie
.allowCredentials(true)
//放行哪些原始域
.allowedOrigins("*")
.allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
.allowedHeaders("*")
.exposedHeaders("*");
}
}
3.在控制器(类上)上使用注解 @CrossOrigin:,表示该类的所有方法允许跨域。
@RestController
@CrossOrigin(origins = "*")
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "hello world";
}
}
十三、Springboot自动装配
1.定义:启动时,自动加载相关依赖,配置相关参数,以最快捷,最简单的方式对第三方软件进行集成。
2.实现:靠EnableAutoConfigurations注解,首先会从spring.factories中寻找有没有AutoConfiguration类满足Conditional注解的生效条件,有的话,就是实例化该AutoConfiguration类,然后加载到spring容器就实现了spring的自动装配。
十四、SpringMVC工作流程
1、 用户向服务器发送请求,请求被 Spring 前端控制 Servelt DispatcherServlet 捕获(捕获)
2、 DispatcherServlet对请求 URL进行解析,得到请求资源标识符(URI)。然后根据该 URI,调用 HandlerMapping获得该Handler配置的所有相关的对象(包括 Handler对象以及 Handler对象对应的拦截器),最后以 HandlerExecutionChain对象的形式返回;(查找 handler)
3、 DispatcherServlet 根据获得的 Handler,选择一个合适的 HandlerAdapter。 提取Request 中的模型数据,填充 Handler 入参,开始执行 Handler(Controller), Handler执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象(执行 handler)
4、DispatcherServlet 根据返回的 ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的 ViewResolver) (选择 ViewResolver)
5、通过 ViewResolver 结合 Model 和 View,来渲染视图,DispatcherServlet 将渲染结果返回给客户端。(渲染返回)
快速记忆技巧:
核心控制器捕获请求、查找Handler、执行Handler、选择ViewResolver,通过ViewResolver渲染视图并返回
#我的求职思考#