非技术
- 为什么离职
这个回答就见仁见智了,没有标准答案
业务
- 在项目开发中遇到的难点有哪些?都是怎么解决的?
同上
- 前后端分离的优缺点
数据结构基础知识
算法的复杂度
- 双层for循环累加一个二维数组的算法复杂度
- 一个递归算阶乘的算法复杂度
- 写一个程序,判断字符串是否对称,并给出复杂度
Java基础
- 技术体系
Java技术体系的三个分支,SE、EE、ME,他们可以调用共同的类库JavaSE,就是Java的标准平台。- JavaSE:开发出来的,就是桌面程序,就是C/S架构的软件。
- JavaEE:就是Java的企业平台,JavaEE开发的B/S架构的软件,简单理解就是网站,我们平时看到的各种网站,都可以用JavaEE开发。
- JavaME:开发的就是手机程序,移动设备程序等!
总结就是,SE开发软件,EE开发网站,ME开发移动设备软件。
- Map、List、Set接口都有哪些实现?
- HashMap中负载因子的作用
负载因子越高越节省空间、越增加查询成本 - ConcurrentHashMap是如何实现的线程安全?
- concurrent pkg下都有哪些类
- StringBuffer 和 StringBuilder的区别
- 接口和抽象类的异同
- JDK1.8新特性
- Lambda表达式
- Stream函数式操作流元素集合
- 接口新增:默认方法与静态方法
- 方法引用,与Lambda表达式联合使用
- 引入重复注解
- 类型注解
- 最新的Date/Time API (JSR 310)
- 新增base64加解密API
- 数组并行(parallel)操作
- JVM的PermGen空间被移除:取代它的是Metaspace(JEP 122)元空间
- 设计模式
a. 单例模式的使用场景 - Servlet的生命周期
- 实例化
即调用构造器创建servlet对象,在如下两种情况下会进行对象实例化:- 当请求到达容器时,容器查找该servlet对象是否存在,如果不存在,会创建实例
- 容器在启动时,或者新部署了某个应用时,会检查web.xml中servlet是否有 load-on-starup 配置。如果有,则会创建该servlet实例。load-on-starup参数值越小,优先级越高(最小值为0,优先级最高)。
- 初始化
为servlet分配资源,调用init(ServletConfig config);方法
config对象可以用来访问servlet的初始化参数
初始化参数是使用init-param配置的参数
init可以override - 就绪/调用
有请求到达容器,容器调用servlet对象的service()方法。
HttpServlet的service()方法,会依据请求方式来调用doGet()或者doPost()方法。但是,这两个do方法默认情况下,会抛出异常,需要子类去override。 - 销毁
容器依据自身的算法,将不再需要的servlet对象删除掉。
在删除之前,会调用servlet对象的destroy()方法。
destroy()方法用于释放资源。
ps:在servlet的整个生命周期当中,init,destroy只会执行一次,而service方法会执行多次。
- 实例化
- Servlet是否线程安全的?其类内有两个类变量,name和age,会不会有线程问题?如何解决?
Servlet是单实例多线程的,所以不是线程安全的。
当Tomcat接收到Client的HTTP请求时,Tomcat从线程池中取出一个线程,之后找到该请求对应的Servlet对象并进行初始化,之后调用service()方法。要注意的是每一个Servlet对象再Tomcat容器中只有一个实例对象,即是单例模式。如果多个HTTP请求请求的是同一个Servlet,那么着两个HTTP请求对应的线程将并发调用Servlet的service()方法。此时如果Servlet1中定义了实例变量或静态变量,那么可能会发生线程安全问题。
可以将变量移到方法内部,或者将变量的操作方法使用synchronized关键字修饰 - JSP的九大内置对象
详情请见:JSP九大内置对象和四大作用域 - Session的生命周期
- Session如何实现的保持回话
- Session如何在浏览器端禁用cookie的情况下保持回话
- synchronized关键字可以使用的场景:类?方法?变量?代码块?
- 谈谈volatile关键字
- 泛型的使用场景及优势
- 对象中equals方法的作用
- 重定向与请求转发的区别
转发:request.getRequestDispatcher(“new.jsp”).forward(request, response)
重定向:response.sendRedirect(“new.jsp”)
转发是服务器行为,重定向是客户端行为
转发信息不会丢失,重定向信息会丢失
转发URL没有变化,重定向URL会发生变化
转发浏览器请求一次,重定向浏览器请求两次 - newCachedThreadPool线程池何时回收闲置的线程?若长时间没有任务,所有的线程会被回收吗?
- 线程的状态切换
- wait和sleep的区别?对待锁的区别?
- 拦截器与过滤器
- 相同点
- 都是AOP编程思想的体现
- 都能实现权限检查、日志记录等
- 不同点
- 使用范围不同:Filter是Servlet规范规定的,只能用于Web程序中;而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。
- 规范不同:Filter是Servlet规范中定义的,是Servlet容器支持的;而拦截器是在Spring容器内的,是Spring框架支持的。
- 使用的资源不同:同其他的代码块一样,拦截器也是一个Spring组件,归Spring管理,配置在Spring文件中,因此能使用Spring中的任何资源、对象,例如Service对象、数据源、事务管理等,通过IoC注入到拦截器即可;而Filter不能。
- 深度不同:Filter只在Servlet前后起作用;而拦截器能够深入到方法前后、异常抛出前后灯,因此拦截器的使用具有更大的弹性。
- 结论
在Spring架构的程序中,要优先使用拦截器。
- 相同点
框架知识
- SSM框架中,各个框架的作用是什么?
Spring MVC作为控制器,作用跟Struts类似,接收外部请求,解析参数传给服务层
Spring 容器属于协调上下文,管理对象间的依赖,提供事务机制,控制反转和依赖注入,创建对象交由容器管理,达到了解耦的作用
mybatis 属于orm持久层框架,主要用来操作数据库,将业务实体与数据表联合起来 - Spring默认是单例模式还是多例模式?各自的优缺点是什么?如何切换?
- Spring的AOP你是如何理解的?
- Spring如何通过AOP实现的全局事务管理
- Spring配置事务管理都用到了哪些标签
- IOC你是如何理解的?
- Spring的IOC是如何实现的?
- Spring创建bean时,必须有构造方法?若有多个构造方法,如何匹配具体某一个?
- bean标签下的constructor-arg标签和property标签的区别?
constructor-arg:通过构造函数注入
property:通过set方法注入
详情请见:Spring依赖注入的方式 - ref属性和value属性的区别?value属性可以传递null么?
- BeanFactory和FactoryBean的区别
- @Resource注解和@Autowired注解有什么区别
- @Component注解的作用
- SpringMVC前台提交一个表单到数据库,中途都会经过哪些主要的类
- SpringMVC的拦截器使用的什么设计模式
- SpringMVC如何返回一个页面?
- MyBatis取值#和$的区别
- MyBatis有哪几种传参方式
- MyBatis如何实现的分页查询
- MyBatis如何实现的数据库字段和类属性的绑定
数据库
- MySQL数据库如何实现的事务?
- 常用的SQL优化
- 哪些操作会破坏索引
- 全值匹配
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’; - 最佳左前缀法则: 如果索引了多列, 要遵守最左前缀法则, 指的是查询从索引的最左前缀开始并且不跳过索引中的列.
where name = ‘july’ and pos = ‘dev’; - 不在索引列上左任何操作(计算, 函数, 类型转换), 会导致索引失效而转向全表扫描
explain select * from staffs where left(name,3) = ‘july’; - 存储引擎不能使用索引中范围条件右边的列
explain select * from staffs where name = ‘july’ and age > 23 and pos = ‘dev’; - 尽量使用覆盖索引, 减少select *
explain select * from staffs where name = ‘july’ and age = 23 and pos = ‘dev’; - mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描
- is null和is not null也无法使用索引
- like以通配符开头(‘%abc’)mysql索引会失效变成全表扫描
- 字符串不加单引号索引失效
- 少用or, 用它来连接时索引会失效
- 全值匹配
- 在使用utf8编码下,varchar(4)可以存储几个汉字?占用多少字节?
varchar(N), 这里的N是指字符数,并不是字节数
utf8下一个汉字3字节,一个英文1字节
所以答案是:4汉字,12字节 - 在一个有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,问,删除的顺序是什么?
- 写一个sql查询第二高分数?
- MySQL的锁有哪几种
- 乐观锁和悲观锁的区别
- 主键和唯一键的区别
- MySQL的事务隔离级别有哪些?每个级别下有可能导致什么问题?
Linux
- 如何挂起一个任务
- unix socket和TCP哪个通信效率高?
HTML
- 可以实现行内合并单元格的是?
rowspan的作用是指定单元格纵向跨越的行数。
colspan是“column span(跨列)”的缩写。colspan属性用在td标签中,用来指定单元格横向跨越的列数 - 谈谈前端使用bootstrap的优缺点
- Velocity的使用场景是什么
- 一个表单提交响应速度很慢,如何防止重复提交?
- JS闭包
- JS变量的作用域?JS方法内的变量能否在外部访问?
- Jquery的选择器有哪些?
jQuery选择器总结
Redis
- Redis支持哪些数据结构
- Redis持久化的机制
- Redis是单例还是多例的
- Redis你们是如何使用的
Mongodb
- Mongodb非常吃内存,在生产环境是如何处理的?
- Mongodb可否同时更改一条记录内一个集合中符合条件的多个值?
性能调优
- JVM性能调优
- Tomcat性能调优
-
Tomcat内存优化
启动时告诉JVM我要一块大内存(调优内存是最直接的方式)
Windows 下的catalina.bat
Linux 下的catalina.shJAVA_OPTS=’-Xms256m -Xmx512m’ -Xms
JVM初始化堆的大小 -Xmx JVM堆的最大值 实际参数大小根据服务器配置或者项目具体设置. -
Tomcat 线程优化
在server.xml中maxThreads=”X” 表示最多同时处理X个连接
minSpareThreads=”X” 初始化X个连接
maxSpareThreads=”X” 表示如果最多可以有X个线程,一旦超过X个,则会关闭不在需要的线程
acceptCount=”X” 当同时连接的人数达到maxThreads时,还可以排队,队列大小为X.超过X就不处理 -
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切换.
-
-
大杀器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优化到这个层次,可以应对大部分性能需求.
-
- MySQL性能调优
- Mongodb性能调优
其他零零碎碎的
- git和svn的区别
- git从本地修改到推送到远程所需要经历的状态和命令
- maven的打包命令
- 谈谈Jenkins在项目中的意义
- 使用过哪些消息队列