毕业之前回家处理一些事情,结果没有赶上毕业典礼,很是遗憾。还因此耽误了一个月的时间,导致八月份才能出来找工作,每次被面试官问道这一个月干啥去了都得解释一遍。。。
二十多天的时间,面试了有十几家公司。感觉当下的工作很难找啊,也是自己水平不够。刚开始面试完全没有什么准备,也不知道该准备些什么,就从网上找的面试题,同学给的面试题中看题。后来面试了一些公司后,才整理出了一套经常问到的题目,感觉也和网上差不多,下面直接上题目。
1.SQL优化的方法
* 创建索引提高查询效率
* 尽量不使用子查询
* 使用where代替having
* 多表查询使用别名标注列
* 用exists代替in not exists代替not in
* sql语句尽量大写
* 索引列上尽量不使用not
* 使用union替换or
* 用in替换or
* 左右模糊查询改为右侧模糊查询
2.存储过程、触发器以及函数的创建及使用
这个可以去看书,讲的也比较详细
3.索引什么时候失效
* 组合索引未使用最左前缀,例如组合索引(A,B),where B = b不会使用索引
* like查询以%开头
* 如果条件中有or,存在一个列没有索引,那么查询不会使用索引
* 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不适用索引
* 如果mysql估计使用全表扫描要比使用索引快,则不适用索引
* 搜索一个索引而在另一个索引上做order by,where A = a order by B,只是用A上的索引,因为查询只使用一个索引
* 使用<>、not in、not exist、!=
4.mysql的工作原理
参考这篇博文,写的挺清楚的:mysql工作原理
5.GET和POST的区别
* get一般用来请求获取服务器的资源
post一般用来向服务器发送数据
* get使用url请求传递数据,数据以 key=value的形式追加在url后,用户可以看到
post传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的
* get传输的数据大小受url长度的限制
post可以可以传输大量数据
* get是不安全的,因为它对用户是可见的
post较get安全性较高
* get和post的乱码处理方式不同,post可以正确传递中文字符,get则必须手动处理传递的中文参数
6.SQL语句的连接查询
有的笔试题可能会写到一些复杂的SQL语句,这个之前做好练习,熟悉一下就好了。
7.Linux常用命令
这个问题一般首先会问你熟悉Linux操作系统吗,然后才会问你常用的命令有哪些,说一下自己常用的就好了。
8.springmvc的工作原理(就是从发起请求到得到响应的这一过程)
下面是比较偏理论的一个过程,如果面试官问到一个实际的方法是怎么访问的,你也可以说一下方法的访问执行过程。
- 客户端向服务器发送请求被前端控制器DispatcherServlet捕获;
- 前端控制器解析url请求HandlerMapping查找对应的Handler;
- HandlerMapping 返回一个HandlerExecutionChain给DispatcherServlet;
- DispatcherServlet根据Handler选择一个合适的适配器处理;
- 处理器适配器执行对应的Handler并返回ModelAndView对象给DispatcherServlet;
- DispatcherServlet请求视图解析器解析ModelAndView,将逻辑视图转换为真正的视图View。
- DispatcherServlet通过model解析出ModelAndView中的参数,最终展现出完整的view并响应给客户端。
9.有没有看过框架的源码,挑一个说一下
这里我只粗略的看过mybatis的源代码,所以问到这个问题我都会说一下mybatis从读配置文件到获取结果的执行过程的源码。
10.spring IOC & AOP 的理解
这个是经常被问到的问题,每个人都有不同的理解。如果觉得自己准备的不充分,那么可以看看这方面的书籍。
11.spring常用的注解
问到的公司比较少,都是些很小的公司,估计比较注重能不能进行开发吧。这个框架用的熟了张口就来。
重点会问到三个注解的区别:
@Autowired :默认按照类型注入,该类型如果有多个bean,那么按照id注入。
@Resource :它有一个属性 name,将指定id的bean注入到属性中
@Qualifier:和Autowired一起使用 ,在自动按照类型注入的基础上按照id注入
12.redis
新技术现在还是问的比较多的,建议学习并使用一下,不需要多熟练,但一定要用过。在学校的自学的时候跟的是同学报的一个培训班的大纲,可以说是非常老旧了(还在学习struts)。但这是唯一的现实参考,导致很多流行的技术没有学过。现在的想法就是,打好基础,学新技术。
我只是说了解redis,面试官的问题也很简单,redis有哪些数据类型,redis使用的场景
13.事务的传播级别
这个是问到spring的声明式事务时带出来的一个问题,只被问了一次。
PROPAGATION_REQUIRED--支持当前事务,假设当前没有事务。就新建一个事务。
这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,假设当前没有事务,就以非事务方式运行。
PROPAGATION_MANDATORY--支持当前事务,假设当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,假设当前存在事务。把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式运行操作。假设当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式运行,假设当前存在事务,则抛出异常
14.执行计划 & 定时任务
这个之前根本不了解,也是只问到了一次,有兴趣的同学可以了解一下。
15.JVM的内存模型是怎么样的(摘自其他博客)
jvm运行时内存分为两部分:线程共享内存和线程私有内存
线程共享内存包括:堆、方法区(包含 运行时常量池)
线程非共享内存包括:java栈,本地方法栈,PC程序寄存器
每个线程,都有一份独有的线程非共享内存。
pc程序寄存器,记录某个线程当前执行到哪条字节码
本地方法栈类似于java栈,但是是为了native方法准备的
java栈,很重要。每个线程都有一个java栈,它是为java方法准备的。栈里面存储着一个个 栈帧,每一个栈帧可看做一个方法的调用
栈帧包括:局部变量表,操作数栈,方法返回地址,其他信息 。其中操作数栈,才是和cpu中的ALU联系在一起的。是CPU唯一指定的数据来源。 执行一条指令,其中涉及到的操作,就是在 (局部变量表和操作数栈中进行的)
~~~~~~~~~~~~~
方法区,不是执行方法的。执行方法的内存,是在java栈中。
方法区是涉及到类加载的时候,加载进来的类的信息,常量,字段,方法代码等的信息
而运行时常量池是方法区的一部分。其中存储的是,字面常量,符号引用等?、、
符号引用:是字符串,其中有丰富的信息,通过搜索类的方法表,可以用来定位到方法。
符号引用只需要第一次用后,就会被替换成 直接引用了。
当加载的类很多的时候,方法去也会溢出。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
线程私有内存:java栈,本地方法栈,这些都和线程有关,和线程的生命周期相同,一旦线程结束,相应的内存也将释放,所以这部分内存不需要关心回收
java堆,对象分配到内存中的区域。我们的垃圾回收主要是针对 堆内存。不过,方法区的内存是永久区,一般也不需要考虑回收
16.java synchronized关键字的原理
首先问到了多线程执行的过程和为什么要加锁,接着直接就问到了这个问题,只能尴尬的说没了解过。等我弄清楚了再回来补充。
17.HashMap & HashTable 的区别(摘抄)
1.继承的父类不同,HashTable 继承自 Dictionary,HashMap继承自AbstractMap
2.线程安全性不同,HashTable每个方法都加了synchronized,线程安全;HashMap则是线程不安全的,需要手动同步
3.HashTable提供contains方法(功能和containsValue相同),HashMap则没有该方法
4.HashTable 中 key 和 value都不允许null;HashMap允许有且仅有一个null作为键,可以有一个或多个键对应的值为null。因此,我们在判断键是否存在时不能使用get()方法,而是使用containsKey()方法
5.两个遍历方式的内部实现不同,HashTable 还使用 Enumeration方式
6.内部实现使用的数组初始化和扩容方式不同。 HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。
18.List Set Map的区别
list是一个有序列表,允许重复元素,允许 null
Set是一个无序列表,不允许重复元素,元素的位置是由hashCode决定的,最多包含一个null
list 和 set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合
map存储结构是没有顺序的,键不能重复,值可以重复,hashmap可以有一个null键
19.某国企的面试题
面试了很多家公司,并没有遇到特别深,特别底层的东西。没有网上那些大牛的面试经历。这是一个例外,也让我感受到了大公司对应届生的一些要求,那就是基础一定要好,大学的核心课程一定要过关(可不仅仅是通过期末考试这么简单)。
1.tcp的三次握手和四次挥手
2.写一道简单的算法题(我的题目是二分查找,博客里有)
3.什么是b树,什么是b+树,两者有什么区别?
4.说一下java的垃圾回收机制以及使用的算法
大概就这些,被虐的体无完肤。看来想要进好的公司,还是得做好内功的修炼。
20.ajax原理
熟悉原生js发送异步请求的过程即可。
21.jdbc过程
熟悉原生jdbc操作数据库的过程即可。
总结
1.现在很多公司招人都比较 注重新技术(也不算新,比较流行),像springboot,springcloud,dubbo,zookeeper,shiro,solr,redis,mq等等,如果你会用很好,如果你了解原理,这是最好的。
2.还是像上面说的那样,大厂招人比较注重基础,基础可不仅仅是代码写多就行,必须得了解一定的底层原理。同时,对于应届生,会更注重大学课程的考察。
3.实习经验很重要。因为缺乏实际项目的经验,并且手上也没有什么好的项目,这在面试的时候也是一个很大的绊脚石。如果能进行实习,一定要早早地实习,很多公司都有很多实习岗位是针对大三的学生的,这是一个机会。
4.放平心态,不要怀疑自己。从面试到找到合适的工作用了20多天的时间,期间有过浮躁,不自信,焦虑的心态。可能普通一点的人面试找工作就是这么个过程,需要很长一段时间。期间也请教过一些前辈(各个行业),软件开发的人员缺口并没有前几年那么大了,并且现在的企业招人要求也高了(至少以我现在的技术栈还差些),各个行业的行情都不是特别景气。当然,对于优秀的人说,这些都是无关紧要的。不要着急,在面试的过程中慢慢提升自己,改正不足,让自己变得更优秀,合适的工作就会来到你的眼前。
以上是一个普普通通应届毕业生的面试总结,如果有什么问题或有什么缺失,大家可以指出来。