原文链接:点击打开链接
总的来说还是非常有收获的,请各路大神不要鄙视我。
0. 开场白:本次校招的要求是………… ,三项中没有明显的短板,并且满足两项才可以。
1. Q: Java容器类
A: 有4个接口继承Conllection接口:List, Queue, Set, Map;
List中有ArrayList, Vector, LinkedList
Set中有HashSet
Map中HashMap, HashTable, ConcurrentTable
2. Q: 读过HashMap的源代码吗? 具体是怎么实现的.
A: 数组 + 链表; 冲突时会把插入项插入在链表的第一个位置; 关于LoadFactor和reHash……
3. Q: 用Collection中的类实现LRU算法
A: 我提出了一个用类似于队列的数组的算法. 即把用过的块放到数组的尾部.
Q: 嗯~ 可以.
4. Q: 写个小代码, 把数组[1, 2, 3, 4, 5, 6]用递归逆序一下
A: 脑子秀逗了, 然后各种错 T^T(不要鄙视我)
5. Q: 编程中用过树不?
A: 用过.
Q: 怎么用的?
A: 语塞…… 对哦? 我怎么用的? 二叉查找树算不算? Orz
Q: 知道B树不?
A: 知道, B+树用于数据库索引.
Q: 嗯~ 那等下问数据库的时候再问你好了.
6. Q: 知道Java内存模型不?
A: 嗯~ 知道... Java内存分为方法区、堆、Java栈、本地方法栈还有PC……;堆又分为YG,OG和PG;YG又分为Eden、S0和S1。
Q: 嗯~ 很好…… 那知道GC的工作原理不?
A: 嗯……有一个Copy算法:………………;GC有串行GC,并行GC,还有CMS和G1.
Q: 那他的回收策略是什么?
A: 从根对象查找有没有对该对象的引用, 没有就回收; 引用分为四种类型, ……, 如果……, 则……
7. Q: 说说Object中的方法
A: sleep(), notify(), notifyAll(), toString(), hashCode(), equals()
开始放大招:Orz
8. Q: sleep(500), wait(500), wait()这三句话有什么区别?
A: 不知道. 我知道sleep方法和wait方法的区别: …………
Q: 嗯~ 是的. 那你知道sleep()方法线程处于什么状态, wait()之后线程又处于什么状态吗?
A: 不知道欸~ 我猜猜………… 一通乱猜…………
Q: 那你知道他们被唤醒后又处于什么状态吗?
A: Orz.
9. Q: 有线程A, B和C, 他们全部执行完之后才能做下一件事. 这个应该如何实现?(线程同步问题)
A: 我说说我之前的实现: 开一个大小为3的布尔数组, 然后你们懂的...
Q: 有更好的方法吗?
A: Orz. 不知道欸.
Q: 你知道ConcurrentHashMap中有一个log.condiction吗?
A: 不知道.
10. Q: 进程和线程有什么区别?
A: 进程是资源拥有的最小单位; 线程是操作系统调度的最小单位.
Q: 一个进程挂了, 会影响其他进程吗?
A: 不影响吧? 不过如果他们有父子关系是不是会影响?
Q: (不鸟我继续问) 一个进程中的线程挂了会不会影响这个进程?
A: 不会吧? 其他线程应该会继续被调度吧? 不过如果调度到挂掉的线程进程是不是也会挂掉?
Q: 嗯~ 这叫做僵尸进程.
11. Q: 再出一个题: 有10亿的int数据, 给你1GB内存, 如何排序呢?
A: 分区~! 用位运算算出高6位, 分64个区, 分区后的数值保存在文件. 然后对每个文件再排序.
Q: 那你说说文件上的内容应该用什么排序方法呢?
A: 呃~ 我觉得nlogn的排序应该都可以吧?
Q: 比如说?
A: 归并排序?
Q: 为什么用归并排序?
A: 我觉得都可以啊~ 就随便说了一个
Q: (提醒我说) 归并排序需要额外空间~ 然后我分区的时候是卡着1GB内存分配的, 所以显然不能用归并.
Q: 那还有什么排序方法呢?
A: 那就快排好了.
Q: (又提醒我) 快排的时候递归也需要空间, 所以快排也不行. 如果你这样分区, 排序只能用堆排, 因为堆排的空间复杂度是O(1).
OK, 被彻底地玩弄于股掌之间. 事实证明, 智商是硬伤.