个人简介:
📦个人主页:赵四司机
🏆学习方向:JAVA后端开发
📣种一棵树最好的时间是十年前,其次是现在!
🔔博主推荐网站:牛客网 刷题|面试|找工作神器
💖喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。
前言
由于很快到了金九银十的秋招季节,博主最近也在找一些面经资源,但是发现很多都不全,后来我发现了牛客网这个网站,发现里面不仅可以看面经,还能刷题模拟面试,要是你要找各种招聘信息也可以在上面找到,我愿称之为程序员必备网站,下面把它推荐给你们!
链接地址:牛客网
文章目录
- 1.进程和线程区别
- 2.JVM内存模型
- 3.String对象创建过程
- 4.局部变量与成员变量
- 5.SpringMVC事务传播属性
- 6.SpringMVC解决post/get请求中文乱码
- 7.SpringMVC工作流程
- 8.Mybatis中实体属性名和数据库字段名不一致时的解决方法
- 9.Git常用命令
- 10.Redis持久化
-
- RDB:
- AOF:
1.进程和线程区别
- 进程有自己的独立地址空间,而线程有自己的堆栈和局部变量,线程没有独立地址空间;
- 进程上下文切换开销要比线程大;
- 进程并发性较高,线程并发性较低;
- 每个进程都有自己的独立入口地址,而线程没有;
- 进程有自己的内存空间,而线程只分配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”:
- 首先在常量池检查是否存在"aaa"字符串
- 若存在直接让s1引用指向该对象(创建0个对象的情况)
- 若不存在则在字符串常量池中创建"aaa",并让s1引用指向该对象(创建一个对象的情况)。
-
String s2 = new String(“bbb”):
- 首先在堆中创建一个"bbb"对象(不管堆中是否存在该内容),然后让s2引用指向该对象
- 在字符串常量池中检查是否存在"bbb"内容的对象
- 若存在则直接将堆中创建的对象对常量池中的对象进行直接引用(创建1个对象的情况)
- 若不存在则在字符串常量池中创建"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工作流程
- 用户向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。
- DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,该请求该由哪个Controller来处理(并未调用Controller,只是得知)
- DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controller
- HandlerAdapter处理器适配器去执行Controller并得到ModelAndView(数据和视图),并层层返回给DispatcherServlet
- DispatcherServlet将ModelAndView交给ViewReslover视图解析器解析,然后返回真正的视图。
- DispatcherServlet将模型数据填充到视图中
- DispatcherServlet将结果响应给用户
8.Mybatis中实体属性名和数据库字段名不一致时的解决方法
-
写SQL语句时候起别名
-
在Mybatis的全局配置文件中开启驼峰命名规则
-
在Mapper映射文件中使用resultMap来自定义映射规则。
9.Git常用命令
10.Redis持久化
RDB:
AOF:
温馨提示:上面只是我总结的面经知识,如果你想要更全面的可以到网站自行查看喔。
友情链接:牛客网