【牛客网——面试系列】Java面试知识篇(一)

2年前 (2022) 程序员胖胖胖虎阿
197 0 0

【牛客网——面试系列】Java面试知识篇(一)
个人简介:

📦个人主页:赵四司机
🏆学习方向:JAVA后端开发
📣种一棵树最好的时间是十年前,其次是现在!
🔔博主推荐网站:牛客网 刷题|面试|找工作神器
💖喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。

前言

由于很快到了金九银十的秋招季节,博主最近也在找一些面经资源,但是发现很多都不全,后来我发现了牛客网这个网站,发现里面不仅可以看面经,还能刷题模拟面试,要是你要找各种招聘信息也可以在上面找到,我愿称之为程序员必备网站,下面把它推荐给你们!
链接地址:牛客网

【牛客网——面试系列】Java面试知识篇(一)

文章目录

  • 1.进程和线程区别
  • 2.JVM内存模型
  • 3.String对象创建过程
  • 4.局部变量与成员变量
  • 5.SpringMVC事务传播属性
  • 6.SpringMVC解决post/get请求中文乱码
  • 7.SpringMVC工作流程
  • 8.Mybatis中实体属性名和数据库字段名不一致时的解决方法
  • 9.Git常用命令
  • 10.Redis持久化
    • RDB:
    • AOF:

1.进程和线程区别

  1. 进程有自己的独立地址空间,而线程有自己的堆栈和局部变量,线程没有独立地址空间;
  2. 进程上下文切换开销要比线程大;
  3. 进程并发性较高,线程并发性较低;
  4. 每个进程都有自己的独立入口地址,而线程没有;
  5. 进程有自己的内存空间,而线程只分配CPU,线程只能共享进程之间的资源;

2.JVM内存模型

  • :JVM管理的最大一块内存空间,存放对象实例,它是所有线程所共享的一块区域。在虚拟机启动的时候创建,该区域的唯一目的就是为了存放对象实例,几乎所有通过new创建的实例对象都会被分配在该区域。

  • (虚拟机栈):也可以称为虚拟机线程栈,存放对象引用,它是JVM中每个线程所私有的一块空间,每个线程都会有这么一块空间。它的生命周期是与线程的生命周期是绑定的。虚拟机栈描述了Java中方法执行时的内存模型,即每个方法被执行的时候,线程都会在自己的线程栈中同步创建一个栈帧(Stack Frame),用于存放局部变量表、操作数栈、动态连接和方法出口等信息,每个方法从调用到完成的过程,就对应着一个栈帧在线程栈中从入栈到出栈的过程。

  • 本地方法栈:本地方法栈与虚拟机栈的作用是相似,不同的是虚拟机栈为JVM执行的Java方法服务,而本地方法栈为JVM调用的本地方法服务。HotSpot虚拟机直接把本地方法栈和虚拟机栈合二为一。

  • 程序计数器:只需要占用一小块的内存空间,每个线程都会有自己独立的程序计数器,主要功能就是记录当前线程执行到哪一行指令了,可以看作是当前线程所执行的字节码行号指示器。

  • 方法区(元空间):在JDK 8之前,方法区也称之为永久代(在虚拟机设置的内存中),这部分区域与堆一样,是所有线程所共享的,它主要用于存放被虚拟机加载的类型信息、常量、静态变量以及即时编译器编译后的代码缓存等数据。对于一个Class文件,除了版本、字段、方法、接口等描述信息外,还有常量池表,在上一篇文章《JVM类加载机制》中提到过,主要用于编译器生成的各种字面量和符号引用,而这部分内容在Class文件加载后是存放在方法区的运行时常量池中。这个运行时常量池自然还包括了字符串常量池,但需要注意的是,在JDK 7以后的版本中,字符串常量池和静态变量等被移至到了Java堆区,而到了JDK 8,抛弃了之前永久代的概念,通过在本地内存中实现了元空间(Meta-space)来代替永久代,并把JDK 7中永久代剩余内容(主要是类型信息)全部移至到了元空间。
    【牛客网——面试系列】Java面试知识篇(一)
    【牛客网——面试系列】Java面试知识篇(一)
    【牛客网——面试系列】Java面试知识篇(一)

3.String对象创建过程

  • String s1 = “aaa”:

    1. 首先在常量池检查是否存在"aaa"字符串
    2. 若存在直接让s1引用指向该对象(创建0个对象的情况)
    3. 若不存在则在字符串常量池中创建"aaa",并让s1引用指向该对象(创建一个对象的情况)。
  • String s2 = new String(“bbb”):

    1. 首先在堆中创建一个"bbb"对象(不管堆中是否存在该内容),然后让s2引用指向该对象
    2. 在字符串常量池中检查是否存在"bbb"内容的对象
    3. 若存在则直接将堆中创建的对象对常量池中的对象进行直接引用(创建1个对象的情况)
    4. 若不存在则在字符串常量池中创建"bbb"对象,然后让堆中的对象对常量池中的对象进行直接引用(创建2个对象的情况)
      【牛客网——面试系列】Java面试知识篇(一)
  • String str = “abc”;
    String str1 = “ab” + “c”;
    System.out.println(str == str1); //true

    解析:这种情况的编译阶段就可以确定,程序执行str1 = “ab” + "c"时候,首先会在字符串常量池中寻找是否存在内容为"abc"的对象,由于str=“abc”,这时候字符串常量池中已经存在该对象,这时候str1引用就会直接指向该对象。

  • String st1 = “abc”;

    String str2 = “ab”;

    String str3 = str2 + “c”;

    System.out.println(str1 == str3); //false

    解析:这种情况由于涉及到变量,在编译期间不能确定,只能在运行时候确定,就会在堆中产生新的对象"abc",类似于new,其内部实现是先new一个StringBuilder,然后调用append方法,最后让str3引用toString返回的对象。

4.局部变量与成员变量

【牛客网——面试系列】Java面试知识篇(一)

【牛客网——面试系列】Java面试知识篇(一)

  • 变量重名
    【牛客网——面试系列】Java面试知识篇(一)

5.SpringMVC事务传播属性

【牛客网——面试系列】Java面试知识篇(一)

6.SpringMVC解决post/get请求中文乱码

  • post:在web.xml中配置CharacterEncodingFilter过滤器encoding为UTF-8,还可设置响应字符编码forceEncoding值为true。
  • get:修改Tomcat配置文件Connector URIEncoding=“UTF-8”。

7.SpringMVC工作流程

【牛客网——面试系列】Java面试知识篇(一)

  1. 用户向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。
  2. DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,该请求该由哪个Controller来处理(并未调用Controller,只是得知)
  3. DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controller
  4. HandlerAdapter处理器适配器去执行Controller并得到ModelAndView(数据和视图),并层层返回给DispatcherServlet
  5. DispatcherServlet将ModelAndView交给ViewReslover视图解析器解析,然后返回真正的视图。
  6. DispatcherServlet将模型数据填充到视图中
  7. DispatcherServlet将结果响应给用户

8.Mybatis中实体属性名和数据库字段名不一致时的解决方法

  1. 写SQL语句时候起别名

  2. 在Mybatis的全局配置文件中开启驼峰命名规则
    【牛客网——面试系列】Java面试知识篇(一)

  3. 在Mapper映射文件中使用resultMap来自定义映射规则。

9.Git常用命令

【牛客网——面试系列】Java面试知识篇(一)

10.Redis持久化

RDB:

【牛客网——面试系列】Java面试知识篇(一)
【牛客网——面试系列】Java面试知识篇(一)
【牛客网——面试系列】Java面试知识篇(一)

AOF:

【牛客网——面试系列】Java面试知识篇(一)
【牛客网——面试系列】Java面试知识篇(一)

温馨提示:上面只是我总结的面经知识,如果你想要更全面的可以到网站自行查看喔。
友情链接:牛客网
【牛客网——面试系列】Java面试知识篇(一)

相关文章

暂无评论

暂无评论...