• 【面试系列】Java面试知识篇(一)


    在这里插入图片描述
    个人简介:

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

    前言

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

    在这里插入图片描述

    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中永久代剩余内容(主要是类型信息)全部移至到了元空间。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    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个对象的情况)
        在这里插入图片描述
    • 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.局部变量与成员变量

    在这里插入图片描述

    在这里插入图片描述

    • 变量重名
      在这里插入图片描述

    5.SpringMVC事务传播属性

    在这里插入图片描述

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

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

    7.SpringMVC工作流程

    在这里插入图片描述

    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的全局配置文件中开启驼峰命名规则
      在这里插入图片描述

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

    9.Git常用命令

    在这里插入图片描述

    10.Redis持久化

    RDB:

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    AOF:

    在这里插入图片描述
    在这里插入图片描述

    温馨提示:上面只是我总结的面经知识,如果你想要更全面的可以到网站自行查看喔。
    友情链接:牛客网
    在这里插入图片描述

  • 相关阅读:
    一致性 Hash 算法
    用 Pyinstaller 模块将 Python 程序打包成 exe 文件(全网最全面最详细)
    Selenium 操作指南:鼠标点击和键盘输入高级技巧
    指针和数组试题解析(5)二维数组部分
    【Lychee图床】本地电脑搭建私人图床,公网远程访问
    鸿蒙自定义侧滑菜单布局(DrawerLayout)
    2023中秋活动征文获奖名单已公布
    HTML+CSS+JS网页设计期末课程大作业(家居网)
    功率谱密度PSD(笔记)
    数据结构学习系列之顺序表的两种删除方式
  • 原文地址:https://blog.csdn.net/weixin_45750572/article/details/126450812