面试题

Jun 30, 2017


非技术

  1. 为什么离职
TODO

这个回答就见仁见智了,没有标准答案

业务

  1. 在项目开发中遇到的难点有哪些?都是怎么解决的?
TODO

同上

  1. 前后端分离的优缺点
TODO

数据结构基础知识

算法的复杂度

  1. 双层for循环累加一个二维数组的算法复杂度
TODO
  1. 一个递归算阶乘的算法复杂度
TODO
  1. 写一个程序,判断字符串是否对称,并给出复杂度
TODO

Java基础

  1. 技术体系
    Java技术体系的三个分支,SE、EE、ME,他们可以调用共同的类库JavaSE,就是Java的标准平台。
    • JavaSE:开发出来的,就是桌面程序,就是C/S架构的软件。
    • JavaEE:就是Java的企业平台,JavaEE开发的B/S架构的软件,简单理解就是网站,我们平时看到的各种网站,都可以用JavaEE开发。
    • JavaME:开发的就是手机程序,移动设备程序等!
      总结就是,SE开发软件,EE开发网站,ME开发移动设备软件。
  2. Map、List、Set接口都有哪些实现?
  3. HashMap中负载因子的作用
    负载因子越高越节省空间、越增加查询成本
  4. ConcurrentHashMap是如何实现的线程安全?
  5. concurrent pkg下都有哪些类
  6. StringBuffer 和 StringBuilder的区别
  7. 接口和抽象类的异同
  8. JDK1.8新特性
    1. Lambda表达式
    2. Stream函数式操作流元素集合
    3. 接口新增:默认方法与静态方法
    4. 方法引用,与Lambda表达式联合使用
    5. 引入重复注解
    6. 类型注解
    7. 最新的Date/Time API (JSR 310)
    8. 新增base64加解密API
    9. 数组并行(parallel)操作
    10. JVM的PermGen空间被移除:取代它的是Metaspace(JEP 122)元空间
  9. 设计模式
    a. 单例模式的使用场景
  10. Servlet的生命周期
    1. 实例化
      即调用构造器创建servlet对象,在如下两种情况下会进行对象实例化:
      1. 当请求到达容器时,容器查找该servlet对象是否存在,如果不存在,会创建实例
      2. 容器在启动时,或者新部署了某个应用时,会检查web.xml中servlet是否有 load-on-starup 配置。如果有,则会创建该servlet实例。load-on-starup参数值越小,优先级越高(最小值为0,优先级最高)。
    2. 初始化
      为servlet分配资源,调用init(ServletConfig config);方法
      config对象可以用来访问servlet的初始化参数
      初始化参数是使用init-param配置的参数
      init可以override
    3. 就绪/调用
      有请求到达容器,容器调用servlet对象的service()方法。
      HttpServlet的service()方法,会依据请求方式来调用doGet()或者doPost()方法。但是,这两个do方法默认情况下,会抛出异常,需要子类去override。
    4. 销毁
      容器依据自身的算法,将不再需要的servlet对象删除掉。
      在删除之前,会调用servlet对象的destroy()方法。
      destroy()方法用于释放资源。
      ps:在servlet的整个生命周期当中,init,destroy只会执行一次,而service方法会执行多次。
  11. Servlet是否线程安全的?其类内有两个类变量,name和age,会不会有线程问题?如何解决?
    Servlet是单实例多线程的,所以不是线程安全的。
    当Tomcat接收到Client的HTTP请求时,Tomcat从线程池中取出一个线程,之后找到该请求对应的Servlet对象并进行初始化,之后调用service()方法。要注意的是每一个Servlet对象再Tomcat容器中只有一个实例对象,即是单例模式。如果多个HTTP请求请求的是同一个Servlet,那么着两个HTTP请求对应的线程将并发调用Servlet的service()方法。此时如果Servlet1中定义了实例变量或静态变量,那么可能会发生线程安全问题。
    可以将变量移到方法内部,或者将变量的操作方法使用synchronized关键字修饰
  12. JSP的九大内置对象
    详情请见:JSP九大内置对象和四大作用域
  13. Session的生命周期
  14. Session如何实现的保持回话
  15. Session如何在浏览器端禁用cookie的情况下保持回话
  16. synchronized关键字可以使用的场景:类?方法?变量?代码块?
  17. 谈谈volatile关键字
  18. 泛型的使用场景及优势
  19. 对象中equals方法的作用
  20. 重定向与请求转发的区别
    转发:request.getRequestDispatcher(“new.jsp”).forward(request, response)
    重定向:response.sendRedirect(“new.jsp”)
    转发是服务器行为,重定向是客户端行为
    转发信息不会丢失,重定向信息会丢失
    转发URL没有变化,重定向URL会发生变化
    转发浏览器请求一次,重定向浏览器请求两次
  21. newCachedThreadPool线程池何时回收闲置的线程?若长时间没有任务,所有的线程会被回收吗?
  22. 线程的状态切换
  23. wait和sleep的区别?对待锁的区别?
  24. 拦截器与过滤器
    1. 相同点
      • 都是AOP编程思想的体现
      • 都能实现权限检查、日志记录等
    2. 不同点
      • 使用范围不同:Filter是Servlet规范规定的,只能用于Web程序中;而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。
      • 规范不同:Filter是Servlet规范中定义的,是Servlet容器支持的;而拦截器是在Spring容器内的,是Spring框架支持的。
      • 使用的资源不同:同其他的代码块一样,拦截器也是一个Spring组件,归Spring管理,配置在Spring文件中,因此能使用Spring中的任何资源、对象,例如Service对象、数据源、事务管理等,通过IoC注入到拦截器即可;而Filter不能。
      • 深度不同:Filter只在Servlet前后起作用;而拦截器能够深入到方法前后、异常抛出前后灯,因此拦截器的使用具有更大的弹性。
    3. 结论
      在Spring架构的程序中,要优先使用拦截器。

框架知识

  1. SSM框架中,各个框架的作用是什么?
    Spring MVC作为控制器,作用跟Struts类似,接收外部请求,解析参数传给服务层
    Spring 容器属于协调上下文,管理对象间的依赖,提供事务机制,控制反转和依赖注入,创建对象交由容器管理,达到了解耦的作用
    mybatis 属于orm持久层框架,主要用来操作数据库,将业务实体与数据表联合起来
  2. Spring默认是单例模式还是多例模式?各自的优缺点是什么?如何切换?
  3. Spring的AOP你是如何理解的?
  4. Spring如何通过AOP实现的全局事务管理
  5. Spring配置事务管理都用到了哪些标签
  6. IOC你是如何理解的?
  7. Spring的IOC是如何实现的?
  8. Spring创建bean时,必须有构造方法?若有多个构造方法,如何匹配具体某一个?
  9. bean标签下的constructor-arg标签和property标签的区别?
    constructor-arg:通过构造函数注入
    property:通过set方法注入
    详情请见:Spring依赖注入的方式
  10. ref属性和value属性的区别?value属性可以传递null么?
  11. BeanFactory和FactoryBean的区别
  12. @Resource注解和@Autowired注解有什么区别
  13. @Component注解的作用
  14. SpringMVC前台提交一个表单到数据库,中途都会经过哪些主要的类
  15. SpringMVC的拦截器使用的什么设计模式
  16. SpringMVC如何返回一个页面?
  17. MyBatis取值#和$的区别
  18. MyBatis有哪几种传参方式
  19. MyBatis如何实现的分页查询
  20. MyBatis如何实现的数据库字段和类属性的绑定

数据库

  1. MySQL数据库如何实现的事务?
  2. 常用的SQL优化
  3. 哪些操作会破坏索引
    1. 全值匹配
      explain select * from staffs where name = ‘july’;
      explain select * from staffs where name = ‘july’ and age = 25;
      explain select * from staffs where name = ‘july’ and age = 25 and pos = ‘dev’;
    2. 最佳左前缀法则: 如果索引了多列, 要遵守最左前缀法则, 指的是查询从索引的最左前缀开始并且不跳过索引中的列.
      where name = ‘july’ and pos = ‘dev’;
    3. 不在索引列上左任何操作(计算, 函数, 类型转换), 会导致索引失效而转向全表扫描
      explain select * from staffs where left(name,3) = ‘july’;
    4. 存储引擎不能使用索引中范围条件右边的列
      explain select * from staffs where name = ‘july’ and age > 23 and pos = ‘dev’;
    5. 尽量使用覆盖索引, 减少select *
      explain select * from staffs where name = ‘july’ and age = 23 and pos = ‘dev’;
    6. mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描
    7. is null和is not null也无法使用索引
    8. like以通配符开头(‘%abc’)mysql索引会失效变成全表扫描
    9. 字符串不加单引号索引失效
    10. 少用or, 用它来连接时索引会失效
  4. 在使用utf8编码下,varchar(4)可以存储几个汉字?占用多少字节?
    varchar(N), 这里的N是指字符数,并不是字节数
    utf8下一个汉字3字节,一个英文1字节
    所以答案是:4汉字,12字节
  5. 在一个有id,name,score三个字段的表tb中,有数据(1,’b’,5),(2,’a’,3),(3,’d’,4),(4,’c’,1),(5,’e’,2),执行sql:delete from tb order by score,问,删除的顺序是什么?
  6. 写一个sql查询第二高分数?
  7. MySQL的锁有哪几种
  8. 乐观锁和悲观锁的区别
  9. 主键和唯一键的区别
  10. MySQL的事务隔离级别有哪些?每个级别下有可能导致什么问题?

Linux

  1. 如何挂起一个任务
  2. unix socket和TCP哪个通信效率高?

HTML

  1. 可以实现行内合并单元格的是?
    rowspan的作用是指定单元格纵向跨越的行数。
    colspan是“column span(跨列)”的缩写。colspan属性用在td标签中,用来指定单元格横向跨越的列数
  2. 谈谈前端使用bootstrap的优缺点
  3. Velocity的使用场景是什么
  4. 一个表单提交响应速度很慢,如何防止重复提交?
  5. JS闭包
  6. JS变量的作用域?JS方法内的变量能否在外部访问?
  7. Jquery的选择器有哪些?
    jQuery选择器总结

Redis

  1. Redis支持哪些数据结构
  2. Redis持久化的机制
  3. Redis是单例还是多例的
  4. Redis你们是如何使用的

Mongodb

  1. Mongodb非常吃内存,在生产环境是如何处理的?
  2. Mongodb可否同时更改一条记录内一个集合中符合条件的多个值?

性能调优

  1. JVM性能调优
  2. Tomcat性能调优
    1. Tomcat内存优化
      启动时告诉JVM我要一块大内存(调优内存是最直接的方式)
      Windows 下的catalina.bat
      Linux 下的catalina.sh

      JAVA_OPTS=’-Xms256m -Xmx512m’ -Xms JVM初始化堆的大小 -Xmx JVM堆的最大值 实际参数大小根据服务器配置或者项目具体设置.

    2. Tomcat 线程优化
      在server.xml中

      maxThreads=”X” 表示最多同时处理X个连接
      minSpareThreads=”X” 初始化X个连接
      maxSpareThreads=”X” 表示如果最多可以有X个线程,一旦超过X个,则会关闭不在需要的线程
      acceptCount=”X” 当同时连接的人数达到maxThreads时,还可以排队,队列大小为X.超过X就不处理

    3. Tomcat IO优化

      • 同步阻塞IO(JAVA BIO)
        同步并阻塞,服务器实现模式为一个连接一个线程(one connection one thread 想想都觉得恐怖,线程可是非常宝贵的资源),当然可以通过线程池机制改善.

      • JAVA NIO
        又分为同步非阻塞IO,异步阻塞IO 与BIO最大的区别one request one thread.可以复用同一个线程处理多个connection(多路复用).

      • 异步非阻塞IO
        (Java NIO2又叫AIO) 主要与NIO的区别主要是操作系统的底层区别.可以做个比喻:比作快递,NIO就是网购后要自己到官网查下快递是否已经到了(可能是多次),然后自己去取快递;AIO就是快递员送货上门了(不用关注快递进度)。

      • 适用场景
        BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解.
        NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持.
        AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持.

      • 在server.xml中

        实现对Tomcat的IO切换.

    4. 大杀器APR
      APR是从操作系统级别来解决异步的IO问题,大幅度的提高性能. (http://apr.apache.org/). APR(Apache Portable Runtime)是一个高可移植库,它是Apache HTTP Server 2.x的核心.能更好地和其它本地web技术集成,总体上让Java更有效率作为一个高性能web服务器平台而不是简单作为后台容器.
      在产品环境中,特别是直接使用Tomcat做WEB服务器的时候,应该使用Tomcat Native来提高其性能.如果不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待.但是配上APR之后,并发的线程数量明显下降,从原来的300可能会马上下降到只有几十,新的请求会毫无阻塞的进来.
      在局域网环境测,就算是400个并发,也是一瞬间就处理/传输完毕,但是在真实的Internet环境下,页面处理时间只占0.1%都不到,绝大部分时间都用来页面传输.如果不用APR,一个线程同一时间只能处理一个用户,势必会造成阻塞。所以生产环境下用apr是非常必要的.
      安装Apache Tomcat Native Library,直接启动就支持apr(http://tomcat.apache.org/native-doc/)它本身是基于APR的. 具体安装方法可以参考其他博客和文章. 排除代码问题Tomcat优化到这个层次,可以应对大部分性能需求.

  3. MySQL性能调优
  4. Mongodb性能调优

其他零零碎碎的

  1. git和svn的区别
  2. git从本地修改到推送到远程所需要经历的状态和命令
  3. maven的打包命令
  4. 谈谈Jenkins在项目中的意义
  5. 使用过哪些消息队列

技术趋势