第一篇博客:京东集团java研发实习面经

注:今天在牛客网看了一位大牛的面经,也可以说是2018年的总结。深有感触,再看看我的博客简直是浪费了博客这个交流平台,所以也准备追寻大牛的脚步,分享和记录一些学习中学到的知识和心得。

大牛面经传送门:
https://www.nowcoder.com/discuss/137593?type=2&order=0&pos=6&page=5

正题:有幸参加了2018年秋季京东集团的java实习生招聘,并拿到了offer,特此记录:

因为走的是内推,所以直接到了部门面,没去的时候我就觉得,能在部门内能担任面试官的人一定是部门内的大牛,果不其然,面试官感觉会的东西特别多,思维也很发散,问的很多问题都是后台实际开发中遇到过的。 关于技术问题,主要有如下几个方面,当时回答的也不是特别好,答案仅供参考:

1 有什么良好的编程习惯和代码风格
答:在编写代码的时候使用注释和文档注释,接口会写对应测试类,命名时遵循命名方法,尽量做到见名知意,编程的时候会考虑程序的性能问题,比如在hashMap时会进行响应的赋初值,避免内存泄漏,不使用魔法值,使用代码规约插件等等

2 泛型可以被继承吗?举个例子
可以被继承

public class Test {
  public static void main(String[] args) {
    Demo<ArrayList> demo = new Demo<>();
    ArrayList arr = new ArrayList();
    arr.add(1);
    arr.add(2);
    arr.add(3);
    demo.test(arr);
  }
}

class Demo<T extends Collection> {
  public void test(T t){
    System.out.println(t.toString());
  }
}

3 JVM内存模型的理解
当时说了一下分区,这个网上说的都比我全,这里就不赘述了

4 用过那些数据结构,谈谈你的理解
用过ArrayList LinkedList HashSet HashMap TreeMap TreeSet LinkedHashMap
理解大概说了一下使用场景,比如LinkedHashMap 可以实现LRU的缓存策略,HashMap也可以做缓存,讲了一下结构,介绍了一下哈希一致性和红黑二叉树,每个集合都做了一些简单的介绍,讲了一下继承结构,也说了一下自己没用过但是知道的比如Queue Stack HashTable这种线程安全的集合,这部分介绍的比较多,因为准备的比较充分吧,知道面试官一般都喜欢问。

5 mysql数据库多个字段都存在索引时,查询操作时应注意哪些问题
这个当时说的时在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边,这样才能高效的去使用索引,还有就是比如一个字段被添加了索引 like %a 这样不会用到索引,in not in >= 等等 这些操作也不会用到索引,都会引发全盘扫描,对索引知之甚少。

6 是否自己写mapper/dao/pojo?有没有可以自动生成的方法
通用mapper generator MybatisPlus都可以生成,当时使用最多的是Mybatis的通用Mapper,是基于拦截器+反射的方式,但是后来generator比较常用,用了才知道,它是真的好用

7 mybatis拦截器的使用
这个没答上来,因为真的没用使用过

8 spring mvc中如何使用自定义的注解
这个非常遗憾也没答上来,说了一下自定义注解的方法,@interface 加上设置保留策略和作用位置

9 mysql事务的底层实现原理
这个也没答上来,但是给面试官讲了一下操作系统中的PV原语,感觉可能比较相似吧,尴尬啊。

10 mysql中innodb的索引结构
聚集索引,顺便介绍了一下B+tree

11 mysql中锁的应用
说了一下行级锁和表级锁

12 如何自定义数据库连接池
实现DataSource接口,然后使用一个数据结构来存储数据库链接,这里我使用的是ArrayList,获取链接的使用remove,关闭的时候,add

13 假设自定义的数据库连接池有10个空闲链接,此时共有12个链接请求,剩下2个链接如何处理,如果想实现等待,如何去设计。
接上一问,不等待的方法,可以设置一个判定,如果检测到没可用链接,就将存储数据库链接的数据结构大小翻倍,再创建链接,获取
等待的方法,可以使用一个队列,因为队列是一种FIFO的数据结构,这样直到有可用连接返回,再做出队操作,获取链接

14 是否进行过sql优化,具体说一下如何优化的
进行过,避免使用外键,设置自增主键避免page分页,避免使用外连接,涉及到sql的运算操作,将运算上移至Service,用java代码处理。可减轻数据库的压力,还可以进行分库分表操作等,使用redis缓存,MQ等减缓数据库压力。

15 常用的编译工具,经常使用的快捷键
之前是eclipse 问了一些快捷键,这个有点忘了

16 voltile和synchronize的区别
volatile是线程同步的轻量级实现,所以volatile的性能要比synchronize好;volatile只能用于修饰变量,synchronize可以用于修饰方法、代码块, synchronize注重的是线程同步,volatile注重的是可见性

17 CMS和G1了解么,CMS解决什么问题,说一下回收的过程。
了解,CMS可以有效的去避免STW现象,介绍了一下可达性分析,简单的说了一下标记-清楚,标记-复制,标记-整理这几种算法,这个网上说的肯定比我的全,就不赘述了。

18 SSM中前后端交互问题,json在其中的作用,它是如何在前后端进行传递的?
Json做的是前后端的数据交互,json是一种字符串格式,没用json对象这一概念,它可以由前端转换成js对象,可以传到其他语言开发的项目中进行数据处理。前端可以用ajax来异步提交请求,将数据传入controller,后端可以封装好json,供前端进行解析,封装的方式常见的由jackson fastjson 前者自动转换,后者是阿里的,不能进行自动转换,需要配置转换器,但是效率更高

19 不同项目中可能用到的jar包版本不同,在发生版本冲突的时候,如何去解决
Sping-boot可以做统一的jar包管理,再使用maven开发项目的时候,也可以用父工程来约定jar包版本,如果是已经运行的项目,可以进行改版,查看jar包兼容性做对应的修改(这个答得不太好,并不是面试官想要的答案)

20 如何把自己的jar包上传至maven
这个没用答上来,但是讲了一下maven在项目中如何使用,如何管理jar包等

21 javascript和前端的东西也问了一些
Js是基于对象,没有类的概念,但是有对象的概念,所以不叫面向对象,叫基于对象。

总结:面试过程中提问只占了一部分,还有一部分是自己介绍简历上的技术,后面也自己介绍了一些中间件的原理和使用,但是感觉在整个面试过程中面试官更重视的是基础。问问题之前问了一下在学校获得的奖项和发表论文的内容,感觉面试官思维特别严谨,因为我在学校主要做硬件,所以问了一些硬件相关的知识,可惜之前没有接触过,没能答上来,比较遗憾。公司效率也特别高,很快就收到了offer如愿以偿进入了公司,祝大家都能找到心仪的工作

猜你喜欢

转载自blog.csdn.net/Kirito19970409/article/details/83552045