笔者在今年上半年辞职了, 陆陆续续面试了一些互联网公司, 一起来看看这些公司都问的些什么面试题吧!
一, Spring MVC 和 Spring boot 有啥区别
1.Spring MVC 和 Spring Boot 都是 Spring 的一部分, 且两者都是由 IoC 提供了依赖注入的容器, 由 AOP 解决面相切面编程 (IoC 和 AOP 后续会讲到), 然后在此二者基础上衍生的高级功能. SpringMVC 的配置比 Springboot 的配置要复杂得多, 各种 xml 和 properties 配置文件, 处理起来比较繁琐; Springboot 他遵循约定优于配置, 啥意思呢, 就是全都是用默认的配置, 这样极大地降低了 Sring 使用的门槛.
2.Springboot 的涉及面比 SpringMVC 要广, Springboot 不仅可以集成 Spring MVC, 还可以集成 JPA Security 等, 如下图所示:
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 目录结构]
[JDK-->JRE 目录结构]
下面我们由下图来描述一下三者关系:
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, 不同
例:
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 是没有区别的.
但是当两个变量的数据类型不同时, 就需要考虑一下数据类型自动转换的问题了.
也就是涉及到精度了.
自身多年的面试体会: 项目中尽量多思考, 迎难而上, 如碰到复杂的性能, 内存泄露等问题的问题, 往往是提升自己的机会, 千万要仔细研究解决, 可以参考其他解决类似问题的文章和实践经验, 对技术深度的提升是很大的, 关键时候可以让你的面试官突然觉得面耳目一新.
很多技术人员的项目和技术相对单一, 长久以往, 容易造成技术思路和视野的狭窄, 接触不到行业最新思路和动态或者当前疑难问题的最佳解决方案.
欢迎做 Java 的工程师朋友们私信我 [面试] 免费获取免费的 Java 架构学习资料 (里面有高可用, 高并发, 高性能及分布式, Jvm 性能调优, Spring 源码, MyBatis,Netty,Redis,Kafka,MySQL,Zookeeper,Tomcat,Docker,Dubbo,Nginx 等多个知识点的架构资料)
来源: http://www.bubuko.com/infodetail-3122089.html