面试结果未知, 感觉有些涉及多线程的东西我的理解不是太深, 没法讲的特别好.
一面
介绍简历上资讯网站项目功能模块设计, 用户群体;
Java Collection框架
ArrayList, LinkedList介绍, 二者的区别?
主要是数据结构定义方式, 以及增删改查时间效率上的区别;
Set介绍?
讲讲功能和用法.
HashMap介绍, 实现方式是什么?
答: 讲的底层一些会比较赢得面试者的好感. 一横一纵, 横数组, 纵链表, 链表长度过长的时候会转化为二叉树提高检索效率;
HashCode默认怎么计算的?
答: 我当时说不知道...
其实默认情况下是把8位长度的十六进制值的逻辑内存地址转换为十进制的数字
final关键字的作用?
答: 属性不可以变, 方法不可以覆盖(overide), 类不可以被继承(这点我没答出来)
String类能否被继承?为什么?
答: 不能, String类的对象本身就是常量, 同时String类是被final修饰的.
讲讲JSP和Servlet的区别?
答: JSP和Servlet的区别在于是HTML夹带Java代码, 这些java代码会被jvm运行后生成文本替换, 最终得到一个HTML文件; Servlet中, 程序员如果要返回HTML的话, 只能out.println(“<table>[数据]</table>”)这么输出文本来构造一个HTML页面, 不太适合前端做页面.
cookie和session的区别?
cookie在用户端, session在服务器端;
cookie可以设定有效时限, session则是在一个会话期间起作用;
我在项目中对cookie的应用介绍了一下... (能讲到自己如何应用面试者说的技术点是一个加分项)
Spring框架的特色?
IOC: 容器进行依赖注入, 在服务器程序初始化的时候就准备好各种类的对象, 方便直接调用.
多线程
threadLocal是什么?原理呢?一般怎么用它?
线程池用过吗?
学习过ExecutorService类, 但是实践经验少.
线程池实现原理?
我确实不太清楚具体实现原理的底层代码细节. 我回答的是书上看的ThreadPoolExecutor的处理流程.
线程池队列数据结构? 溢出策略?
为什么需要使用线程池?
以上三题的答案:
线程池技术
1. 优点
合理使用线程池能够带来的三个好处:
1> 降低资源消耗.
重复利用已经创建的线程降低线程创建和销毁造成的消耗.
2> 提高响应速度
任务到达的时候, 任务可以不用等待线程的创建, 就能立即执行.
3> 提高线程的可管理性
线程池可以对线程这一重要资源进行统一分配, 调优和监控.
2. 一般处理流程
1>判断
(1)线程池核心部分是否满了? 否的话, 创建新线程来处理(需要获取全局锁)
(2)是的话, BlockingQueue是否满了?
(3)是的话, 线程池整个是否已经满了? 否的话, 创建新的线程来处理这个问题(需要获取全局锁)
(4)是的话, 调用饱和策略(RejectedPolicy)
实际执行中, 在ThreadPoolExecutor完成预热之后, 会使得当前的运行线程数>=corePoolSize, 这时候大部分的execute()方法调用的都是(2), 那么不用获取全局锁, 这就能够保证系统运行的又快又好了.
2>饱和策略RejectedPolicy
饱和策略: Abort报错退出, Discard丢弃该任务, callderRuns调用者线程自己来执行, DiscardOldest扔掉队列中最近的
3. 阻塞队列的数据结构选择
ArrayBlockingQueue: 基于数组, FIFO
LinkedBlockingQueue: 基于链表, FIFO
SynchronousQueue: 不存储元素的一个阻塞队列. 也就是说, 每个插入操作必须等到另外一个线程调用移除操作, 否则插入会处于阻塞状态.
PriorityBlockingQueue: 具有优先级的无限阻塞队列
java实现同步有几种方法?
数据结构
是否了解树? 介绍一下树的原理和你所知道的应用场景?
答: 原理可以用二叉树的定义方式, 指针指向下一个孩子节点等来说明; 应用场景很多, 比如加快检索速度, 在HashMap的bucket中用树的结构来提高key-value的查找速度, 在数据库的有B+树来做索引等等...
数据库
数据库的事务是怎么回事?为什么得有事务?
答: ACID, 业务的不可分割性决定事务的ACID性.
数据库的索引是怎么一回事? 为什么不所有的列做上索引?
答: 索引是提高检索速度的技术, 所有列做上索引是起相反作用的. 因为即使是完全只读的数据库, 所有列做上索引非常消耗空间, 很多列比如"性别"只有男女两个值, 做上索引毫无意义; 而对于经常发生增删改的表, 做上索引以后, 每次进行修改操作, 都需要维护索引, 这是有额外的开销的.
note: 从这种提问方式, 可以看的出百度的技术面试官很关心你是否真正理解一个技术在实际中有可能被怎么运用的, 即你不仅仅知道技术是什么, 更知道技术怎么用, 在哪里用.
linux shell
两个需求, 写脚本?
有一个文本文件log.txt, 请写出输出访问量倒序的shell脚本
time IP URL
有两个文本文件, A文件有id, a, b, c列, B文件有id, d,e, f列, 请写出一个脚本, 以A文件为基准, 合并两个文件的列, 也就是说, 丢弃合并后A文件没有的id记录.
写一个合并两个有序数组的算法?
用merge sort的那个合并两个有序数组的merge函数就行了.
二面
问项目相关的redis和事件队列
1. 事件队列如果生产者生产过快, 要怎么处理? redis怎么做阻塞队列的?
2. java多线程: 请介绍下同步的几种方法? Lock和synchronized有什么不一样吗? 优势在哪里?
3. 写一个简单的二叉树reverse算法
note: 写二叉树算法往往涉及递归, 所以不要忘记两点: 检查输入是否为null, 检查递归退出的边界
4. 输入String str1, String str2, 写出加法算法
这里是要求返回str1, str2作为数字的和, 注意输入都很长, 无法放在常规的int型中.
note: 这里按照加法的规则, 一位一位的进行相加和进位, 注意每加一位需要做一次拼接, 把和延长一位(因为和显然也不能放在一个int型中, 这点很容易忘记)
最后, 问实习的时间.