【面试总结】分享本人作为一个javaweb方向的后端工程师面试问题

一、Spring MVC和Spring boot有啥区别

1.Spring MVC和Spring Boot都是Spring的一部分,且两者都是由IOC提供了依赖注入的容器,由AOP解决面相切面编程(IOC和AOP后续会讲到),然后在此二者基础上衍生的高级功能。SpringMVC的配置比Springboot的配置要复杂得多,各种xml和properties配置文件,处理起来比较繁琐;Springboot他遵循约定优于配置,啥意思呢,就是全都是用默认的配置,这样极大地降低了Spring使用的门槛。

2.Springboot的涉及面比SpringMVC要广,Springboot不仅可以集成Spring MVC,还可以集成JPA Security等,如下图所示:【面试总结】分享本人作为一个javaweb方向的后端工程师面试问题_第1张图片

3.SpringMVC和Sringboot都属于Spring,SpringMVC是基于Spring的一个MVC框架,Springboot是基于Spring的一套快速开发整合包。

总结:Spring 最初利用“工厂模式”( DI )和“代理模式”( AOP )解耦应用组件。大家觉得挺好用,于是按照这种模式搞了一个 MVC 框架(一些用 Spring 解耦的组件),用开发 web 应用( SpringMVC )。然后有发现每次开发都要搞很多依赖,写很多样板代码很麻烦,于是搞了一些懒人整合包( starter ),这套就是 Spring Boot 。

二、session和cookie的区别

1.session是存在服务器端的,cookie是存在浏览器端。

2.cookie相对于session是不安全的。因为cookie是存在浏览器端,别人可以通过分析本地的cookie进行cookie欺骗,如果考虑安全问题,应该使用session。

3.session会在一定时间内存储在服务器上。如果用户量较大,会影响服务器性能,考虑到服务器性能因素,可以使用cookie。

4.一般单个cookie不能超过4k。很多浏览器设置最多保存20个cookie,而session是无限量的。

三、在HashMap中是如何比较“key”的值的

在HashMap比较两个key值时,首先使用equals进行比较两个key的值,如果不同则认为是两个不同的key;如果相同,再比较两个key的hashcode,如果不同,则认为是两个不同的key;如果相同则认为是两个相同的key,此时的value2会覆盖value1的值。

四、JDK、JRE、JVM的联系与区别

JDK,java development kit,java开发工具包;

JRE,java runtime enviroment,java运行环境;

JVM,java virtual machine,java虚拟机;

在JDK安装目录下有一个jre目录,jre目录下面有bin和lib两个文件夹,我们可以认为bin里面就是jvm,lib就是jvm运行所需的类库,jvm和lib结合起来就是jre。

【JDK目录结构】

【面试总结】分享本人作为一个javaweb方向的后端工程师面试问题_第2张图片

【JDK-->JRE目录结构】

【面试总结】分享本人作为一个javaweb方向的后端工程师面试问题_第3张图片

下面我们由下图来描述一下三者关系:

【面试总结】分享本人作为一个javaweb方向的后端工程师面试问题_第4张图片

1.JDK提供开发工具包,编译都是在JDK中进行的(由.java编译为.class),但运行不是在JDK中进行;

2.JRE由JVM和类库组成,

3.JVM借助jre提供的类库,运行.Java程序,java做到跨平台的特性,就是由于不同的平台拥有不同的JVM或JDK,才得以实现。

五、如果main方法被声明为private会怎样?

我们想一下,如果如果类中没有main方法,会怎么样?当然是没啥问题!

如果将修饰符改为private,其实也没啥问题。

如果将修饰符改为private,就相当于我们自己定义了一个方法,名字叫main,当我们运行这个类的时候,会提示我们“找不到main方法,请将main方法定义为public static void main(String[] args)”,因为这里只有我们自定义的一个private main方法,而没有系统默认的public main方法

如果这时我们再写一个public static void main(String[] args),这时候也会报错,因为已经存在了一个private static void main(String[] args),同一个类中不能存在方法名和参数相同的两个方法,因为重载的定义为“方法名相同,参数不同的两个方法叫重载”,所以和修饰符无关。

六、&和&&有啥区别

1.&是位运算符,按二进制进行运算

比如5 & 4就是将5和4分别转换为二进制5(00000101)和二进制4(00000100)进行“与”运算。我们顺便提一下&(与)、“~”(非)、“|”(或)、“^”(异或)四种运算符规则:

【均需要转换成二进制】

运算符 运算方式
&(与) 两个数转换为二进制,然后从高位开始比较,如果所比较的两个数都是1则为1,否则为0
|(或) 两个数转换为二进制,然后从高位开始比较,如果所比较的两个数有一个是1则为1,否则为0
~(非) 如果该为为0,结果是1;如果该为是1,结果为0
^(异或) 两个数转换为二进制,然后从高位开始比较,两个数相同为0,不同

例:【面试总结】分享本人作为一个javaweb方向的后端工程师面试问题_第5张图片

2.&&是逻辑运算符,比较两个Boolean表达式。

&&运算符对两个Boolean表达式进行比较,当比较的两个均为true时,结果才是true,有一个false,结果就是false。

并且&&运算符具有短路功能,如果比较的前者为false,&&后面将不会运行,如果为true,将会继续运行&&后面的代码;

||运算符同样具有短路功能。

七、char类型的变量能不能存储一个中文?为什么

答案是可以的,但是两个中文不行。因为char占两个字节,一个中文也占两个字节,所以是可以存储的。

八、a=a+b和a+=b的区别

a=a+b是先进行“+”运算,然后进行赋值运算,如果当a(short)与b(int)的类型不同时,会报错,若进行强转,可能会导致精度丢失。

a+=b中,“+=”是一个运算符,而不是两个,所以在运算时 会进行自动类型转换。

总结一下,在两个变量的数据类型一样时:a+=b 和a=a+b 是没有区别的。

但是当两个变量的数据类型不同时,就需要考虑一下数据类型自动转换的问题了。

也就是涉及到精度了。

这里顺便提一下,如何解决浮点型精度丢失的问题。

使用BigDecimal即可,具体使用方法可参考这个链接https://www.cnblogs.com/chenssy/archive/2012/09/09/2677279.html

你可能感兴趣的:(面试总结)