java初级开发工程师面试题(2019.8)

毕业之前回家处理一些事情,结果没有赶上毕业典礼,很是遗憾。还因此耽误了一个月的时间,导致八月份才能出来找工作,每次被面试官问道这一个月干啥去了都得解释一遍。。。

二十多天的时间,面试了有十几家公司。感觉当下的工作很难找啊,也是自己水平不够。刚开始面试完全没有什么准备,也不知道该准备些什么,就从网上找的面试题,同学给的面试题中看题。后来面试了一些公司后,才整理出了一套经常问到的题目,感觉也和网上差不多,下面直接上题目。

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的工作原理(就是从发起请求到得到响应的这一过程)

下面是比较偏理论的一个过程,如果面试官问到一个实际的方法是怎么访问的,你也可以说一下方法的访问执行过程。

  1. 客户端向服务器发送请求被前端控制器DispatcherServlet捕获;
  2. 前端控制器解析url请求HandlerMapping查找对应的Handler;
  3. HandlerMapping 返回一个HandlerExecutionChain给DispatcherServlet;
  4. DispatcherServlet根据Handler选择一个合适的适配器处理;
  5. 处理器适配器执行对应的Handler并返回ModelAndView对象给DispatcherServlet;
  6. DispatcherServlet请求视图解析器解析ModelAndView,将逻辑视图转换为真正的视图View。
  7. 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,而HashMap16Hashtable不要求底层数组的容量一定要为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多天的时间,期间有过浮躁,不自信,焦虑的心态。可能普通一点的人面试找工作就是这么个过程,需要很长一段时间。期间也请教过一些前辈(各个行业),软件开发的人员缺口并没有前几年那么大了,并且现在的企业招人要求也高了(至少以我现在的技术栈还差些),各个行业的行情都不是特别景气。当然,对于优秀的人说,这些都是无关紧要的。不要着急,在面试的过程中慢慢提升自己,改正不足,让自己变得更优秀,合适的工作就会来到你的眼前。

以上是一个普普通通应届毕业生的面试总结,如果有什么问题或有什么缺失,大家可以指出来。

版权声明:程序员胖胖胖虎阿 发表于 2022年9月8日 上午6:16。
转载请注明:java初级开发工程师面试题(2019.8) | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...