java开发工程师面试题小汇总(一)

一、.JDBC工作流程

第一步:Class.forName()加载数据库连接驱动;

第二步:DriverManager.getConnection()获取数据连接对象;

第三步:根据SQL获取sql会话对象,有2种方式 Statement、PreparedStatement ;

第四步:执行SQL处理结果集,执行SQL前如果有参数值就设置参数值setXXX();

第五步:关闭结果集、关闭会话、关闭连接。

二、ArrayList和LinkedList区别和使用场景

区别:

  1. ArrayList的实现是基于数组,LinkedList的实现是基于双向链表;
  2. 对于随机访问ArrayList要优于LinkedList,ArrayList可以根据下标以O(1)时间复杂度对元素进行随机访问,而LinkedList的每一个元素都依靠地址指针和它后一个元素连接在一起,查找某个元素的时间复杂度是O(N);
  3. 对于插入和删除操作,LinkedList要优于ArrayList,因为当元素被添加到LinkedList任意位置的时候,不需要像ArrayList那样重新计算大小或者是更新索引;
  4. 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的实现原理

SpringAOP实现原理其实很简单,就是通过动态代理实现的。如果我们为Spring的某个bean配置了切面,那么Spring在创建这个bean的时候,实际上创建的是这个bean的一个代理对象,我们后续对bean中方法的调用,实际上调用的是代理类重写的代理方法。而SpringAOP使用了两种动态代理,分别是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
  • insert, update 和 delete
  • sql
  • resultMap
  • if标签
  • choose、when、otherwise标签
  • trim、where、set标签
  • foreach标签
  • bind 模糊查询
  • <select id="selectUserInfo" resultType="com.java265.po.UserInfo">

    <bind name="pattern" value="'%'+_parameter+'%'" />

    SELECT id,name,notes

    FROM UserInfo

    WHERE name like #{pattern}

    </select>

  • mapper
  • collection和association 一对多和多对一
  • springmvc:
  • 注解名称 注解说明
  • @RequestMapping("/user") 做浏览的访问路径和当前方法的映射
  • @RequestHeader 获取到请求头的信息
  • @RequestBody 配置到方法参数上,表明将json字符串转化为java对象
  • @ResponseBody 配置到方法返回值,表明为json字符串将对象转化
  • mybatis:
  • 配置一对多查询和多对多查询的注解方式映射关系:
  • 注解名称 注解说明
  • @Insert 实现新增
  • @Update 实现更新
  • @Delete 实现删除
  • @Select 实现查询
  • @Result 实现结果集封装
  • @Results 可以与@Result 一起使用,封装多个结果集
  • 十一、原生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渲染视图并返回

    #我的求职思考#
    全部评论
    稳的,收藏了
    点赞 回复 分享
    发布于 2023-02-11 11:06 山东
    感谢大哥的分享
    点赞 回复 分享
    发布于 2023-02-11 11:09 上海

    相关推荐

    我是小红是我:学校换成中南
    点赞 评论 收藏
    分享
    6 46 评论
    分享
    牛客网
    牛客企业服务