网易考拉海购Java后台开发实习-面经(已拿offer)

写于2017-10-18,博文从我的网站迁移到掘金。面试

一面(23min)

  • 自我介绍redis

  • 项目中最自豪的部分
    算法

    也没什么太自豪的,就是在移动端开发的时候不存在cookie和session,而后用redis存了一下验证码感受还不错。编程

  • 讲一讲ArrayList和LinkedList
    ArrayList底层实现是数组,而且每次扩容扩容1.5倍,经常使用在查询较多的场景中。而LinkedList底层实现是链表经常使用在增删比较多的场景api

  • 你说你对锁有了解,说一说你最熟悉的两个锁
    当时太紧张就随口说了两个,乐观锁,悲观锁。乐观锁:每次执行事务的时候都是先执行在检查是否有其余是否在执行。而悲观锁如行锁,表锁,都是先锁定再执行事务。一般在并发量比较大的状况下用悲观锁,并发量小的状况下用乐观锁数组

  • 说一下synchronied和ReentrantLock的区别
    synchronied是JVM级别的,而ReentrantLock是api级别的,JVM会对synchronied作出相应的优化,锁消除:当JVM断定该资源不会被其余线程争夺的时候就会消除该锁,还有锁自旋,自适应锁(面试官速度很快,还没等我来得及解释ReentrantLock就跳下一个问题了,也许是这个超底层的回答比较满意吧)缓存

  • 讲一下ThreadLoacal吧
    ThreadLocal底层实现是一个Map结构的表,key是Thread.currentThread(),而Value则是咱们想要保存的对象安全

  • 它(ThreadLocal)有什么用,能够举一个例子吗?
    能够在每一个线程都拥有一个各自的副本,封装起来不被影响,做用的话,能够作一个相似卖票的系统,每一个售票厅(线程)只能出售100张票,不能多不能少服务器

  • 用过exchange()吗
    很差意思,只敲过一次例子,不太了解cookie

  • 说一说JVM内存模型吧
    我:栈区:每次方法的执行都会有一次栈帧的生成,而且其中有局部变量表。堆区:每次new出来的对象都保存在这儿。本地方法栈:经过C/C++调用系统接口的一些方法,方法区:类的信息 静态变量都在这儿,还有程序计数器

  • 说一说AOP吧

  • AOP就是面向切面编程,并解释了下列术语,joinpoint,pointcut,aspect,advice,并说了一下实现的原理,若实现了接口就是JDK动态代理不然就用CGLIB

  • 了解asm吗?
    我反应了半天才想起这是一个jar包,不过从没了解过就说不知道了

  • String str1=new String("abc"),String str2=new String("abc"); str1==str2返回什么 当时太紧张,注意力一直放在abc字符串上了忽略了这是new了一个对象,一直回答true,反问我好久我仍是没反应过来,有点没发挥好

  • 知道如何让线程同步吗?
    wait,notify,notifyAll,await,signal,siganlAll,countdownLatch,cyclicbarrer

  • 说一说countdownlatch,cyclicbarrer
    均可以等几个线程就绪后再执行后续操做,区别就是cyclicbarrer是能够复用的,而countdownlatch不能够

  • 举个例子?
    能够假设如下场景,等9个跑步选手(线程)同时在起跑线就绪了再开始起跑

  • 能够实习多久

  • 你的职业规划

  • 你有什么想问个人吗?

最后面试官简单评价了一下:看得出来你平时看了不少书,不过前面有一两个答错了,你开始很紧张,后来好了一些。

二面(14min)

  • 自我介绍
  • 讲一下hashmap吧
  • hashmap底层是一个key-value结构的entry数组+链表,在put的时候根据key的hashcode的值在hash一次,而后根据获得 的hash值再和hashmap的size取余操做定位到要插入的哈希桶,若是为null则插入,不然遍历哈希桶后面的链表若是有key相等的则覆盖,不然添加到尾部,而后检查是否达到treshold须要扩容,而且每次扩容都是扩大两倍
  • hashmap能够插入null值吗
    能够
  • 为何呢?你不是说根据key的hashcode插入吗
    很差意思,我只是知道能够,具体状况不太清楚
  • 你说你会MySQL调优SQL语句,那你通常是怎么作的呢?
    通常是先查看慢SQL日志,而后explain一下该查询语句,看是否索引失效或者是没建索引
  • 咱们都知道hashmap是线程不安全的,那么为何线程不安全呢?
    由于当两个线程同时对hasmap扩容的时候,会致使循环链表,使cpu达到100%,甚至宕机
  • 你说你对多线程有所了解,那你说一下线程池的实现原理吧 <br好的,在线程池内部一共有这么几个参数,corepoolsize:核心线程数,maxpoolsize: 最大线程数,workquee:一个放预备线程的阻塞队列,time:容许的空闲时间,handler:异常处理器。当向线程池加入一个线程的时候,若是运行的线程数小于corpoolsize,则直接执行此线程,若是等于了corepoolsize则提交给阻塞队列阻塞等待,若是阻塞队列已满,则执行器继续增长新的线程来执行任务,若是达到了maxpoolsize则执行handler的异常处理方法,有如下几种方法抛出异常,忽略,提交线程者运行,删除等待最久的线程**
  • 说一说垃圾回收的时候,如何断定一个对象是否须要回收?
    一共有两种算法,一种是引用计数算法,每被引用一次计数器就+1,当引用为0就回收,不过这种算法有一个弊端就是,当对象之间互相引用的时候就永远不会回收,因此用的最多的仍是GC ROOTS可达性分析,看对象是否被GC ROOTS引用,那么哪些能够做为GC ROOTS呢?有如下四种:1.栈里面的局部变量表,方法区的2.类静态属性引用的对象3.方法区中常量引用的对象,4.JNI本地变量栈中引用的对象
  • 说一说你的项目中登陆是怎么作的 大概就是redis作验证码缓存,MD5加密密码(有点长。。省略)
  • 说说cookie和session吧 session来自于cookie,session能够放在cookie里,而且cookie存在客户端,session存在服务器端(简单回答)
  • 你说你用过redis,那你知道redis能够作持久化吗?
    能够
  • 哪两种?
    RDB 和 AOF

总结

  1. 一面有点紧张,没发挥好,不过能从底层回答的都从底层回答了,问的浅,答得较深
  2. 二面运气不错,刚好问到了擅长的部分,问的是要比一面更难,不过还算是答的比较好
  3. 最后感谢程涛学长提供的内推机会,以及一直以来在Java学习上的帮助!
相关文章
相关标签/搜索