|
17 | 17 | - [计算机网络](#计算机网络)
|
18 | 18 | - [分布式/集群等高级主题](#分布式集群等高级主题)
|
19 | 19 | - [技术开放题](#技术开放题)
|
20 |
| - - [参考](#参考) |
| 20 | + - [题目参考](#题目参考) |
| 21 | + - [解答参考](#解答参考) |
21 | 22 |
|
22 | 23 | <!-- /TOC -->
|
23 | 24 |
|
|
26 | 27 | ## 数据结构
|
27 | 28 |
|
28 | 29 | 1. HashMap的原理,内部数据结构?
|
29 |
| - - (hash 表,数据+链表(1.8后红黑树)) |
| 30 | + - 底层使用哈希表(数组 + 链表),当链表过长会将链表转成 红黑树以实现 O(logn) 时间复杂度内查找 |
30 | 31 | 1. 讲一下 HashMap 中 put 方法过程?
|
31 |
| - - 对 key 得 hashcode 取 hash,问, |
| 32 | + 1. 对 Key 求 Hash 值,然后再计算 下标。 |
| 33 | + 1. 如果没有碰撞,直接放入桶中, |
| 34 | + 1. 如果碰撞了,以链表的方式链接到后面, |
| 35 | + 1. 如果链表长度超过阀值(TREEIFY_THRESHOLD == 8),就把链表转成红黑树。 |
| 36 | + 1. 如果节点已经存在就替换旧值 |
| 37 | + 1. 如果桶满了(容量 * 加载因子),就需要 resize。 |
32 | 38 | 1. HashMap 中 hash 函数怎么是是实现的? 还有哪些 hash 的实现方式?
|
| 39 | + 1. 高 16bit 不变,低 16bit 和高 16bit 做了一个异或 |
| 40 | + 1. (n - 1) & hash --> 得到下标 |
| 41 | + 1. 还有哪些 Hash 实现方式:可以参考之前的博客 [Effective Java 学习笔记 -- hashCode()](../reading-notes/Effective-Java.md) |
33 | 42 | 1. HashMap 怎样解决冲突,讲一下扩容过程,假如一个值在原数组中,现在移动了新数组,位置肯定改变了,那是什么定位到在这个值新数组中的位置,
|
34 |
| - - 申请一个更大数组,将原数组的中的数据放到新数组中,引用指向新数组, |
35 |
| - - HashMap 采用的是 rehash,再散列一次。 |
| 43 | + - 将新节点加到链表后, |
| 44 | + - 容量扩充为原来的两倍,然后对每个节点重新计算哈希值。 |
| 45 | + - 这个值只可能在两个地方,一个是原下标的位置,另一种是在下标为 <原下标+原容量> 的位置。 |
36 | 46 | 1. 抛开 HashMap,hash 冲突有那些解决办法?
|
37 |
| - - 开放定址,rehash,链地址法,HashMap 使用的这种,建立一个公共溢出区 |
38 |
| -1. 针对HashMap中某个Entry链太长,查找的时间复杂度可能达到O(n),怎么优化? |
| 47 | + - 开放定址,链地址法 |
| 48 | +1. 针对 HashMap 中某个 Entry 链太长,查找的时间复杂度可能达到 O(n),怎么优化? |
| 49 | + - 将链表转为红黑树, JDK1.8 已经实现了。 |
39 | 50 | 1. 数组和 ArrayList 的区别;
|
40 |
| -1. Arraylist如何实现排序 |
41 |
| -1. 如果想实现一个线程安全的队列,可以怎么实现? |
| 51 | + 1. 数组可以包含基本类型和对象类型,ArrayList 只能包含对象类型 |
| 52 | + 1. 数组大小固定,ArrayList 大小可以动态变化 |
| 53 | + 1. ArrayList 提供了更多的特性(`addAll`、`removeAll`)。 |
| 54 | +1. Arraylist 如何实现排序 |
| 55 | + - `Collections.sort(List<T> list)`; |
| 56 | + - `sort(List<T> list, Comparator<? super T> c)`; |
42 | 57 | 1. HashMap ,HashTable 区别
|
43 | 58 | 1. HashMap、ConcurrentHashMap 区别。
|
44 |
| - - ConcurrentHashMap 两个hash过程,第一次找到所在的桶,并将桶锁定,第二次执行写操作。 |
45 |
| -1. ConcurrentHashMap原理,jdk1.8后有哪些改变(引入CAS等) |
46 |
| -1. TreeMap和TreeSet区别和实现原理 |
| 59 | + - ConcurrentHashMap 两个 hash 过程,第一次找到所在的桶,并将桶锁定,第二次执行写操作。 |
| 60 | +1. ConcurrentHashMap原理,jdk1.8 后有哪些改变(引入CAS等) |
| 61 | +1. TreeMap 和 TreeSet 区别和实现原理 |
| 62 | + - `TreeSet` 底层是 `TreeMap`,`TreeMap` 是基于红黑树来实现的。 |
| 63 | +1. 如果想实现一个线程安全的队列,可以怎么实现? |
47 | 64 | 1. 知道 LRU 吗,20分钟基于 HashMap 实现一个 LRU 算法,面试官给个地址,进去写代码,面试官远程看
|
| 65 | + - [如何设计实现一个LRU Cache?](http://yikun.github.io/2015/04/03/%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AALRU-Cache%EF%BC%9F/) |
48 | 66 | 1. 二叉树的遍历方式,前序、中序、后序和层序
|
49 |
| - - 二叉树本身就是一个递归的产物,那前序举例,访问根节点,然后左节点,再右节点,如果左节点是一棵子树,那么就先访问左子树的根节点,再访问左子树的左节点,依次递归;而层序,使用队列进行辅助,实现广度优先搜索 |
| 67 | + - 可以再写一篇了。。 |
50 | 68 | 1. 常见的排序算法时间复杂度(排序算法实现也要重点掌握)
|
| 69 | + - 可以再写一篇了。。 |
51 | 70 | 1. 红黑树的特点及相比平衡二叉树的优点(先介绍各自特点)?
|
| 71 | + - 红黑树 |
| 72 | + 1. 每个节点要么是红色,要么是黑色。 |
| 73 | + 1. 根节点永远是黑色的。 |
| 74 | + 1. 所有的叶节点都是空节点(即 null),并且是黑色的。 |
| 75 | + 1. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的路径上不会有两个连续的红色节点) |
| 76 | + 1. 从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点。 |
| 77 | + - 平衡二叉树 |
| 78 | + 1. 任何节点的两个儿子子树的高度最大差别为一 |
| 79 | + - 红黑树并不追求“完全平衡”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。 |
52 | 80 | 1. B+树的了解
|
| 81 | + - 多分支结构有效降低了树的高度 |
| 82 | + - B 树的各种操作能使 B 树保持较低的高度,从而达到有效避免磁盘过于频繁的查找存取操作,从而有效提高查找效率 |
53 | 83 | 1. Trie-Tree 原理及其应用;
|
| 84 | + - 字典树 |
| 85 | + - 特点 |
| 86 | + 1. 根节点不包含字符,除根节点外的每一个子节点都包含一个字符。 |
| 87 | + 1. 从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。 |
| 88 | + 1. 每个节点的所有子节点包含的字符互不相同。 |
| 89 | + - 核心思想是空间换时间 |
| 90 | + - 应用 |
| 91 | + 1. 字符串检索 |
| 92 | + 1. 词频统计 |
54 | 93 |
|
55 | 94 | ## 算法题(剑指 Offer 上原题不少)
|
56 | 95 |
|
|
233 | 272 | 1. 问我简历上学校 oj 平台这个项目怎么实现1000人并发?并发的性能瓶颈在哪?
|
234 | 273 | - 因为还没完成,现处于开发阶段,只跟面试官说了下自己的构想,nginx+tomcat集群,性能瓶颈可能出现在网络io和java gc上,然后说了下jvm gc的优化,如何实现session共享。最后我问了下面试官这样设计可以吗,他说这样设计不行可能有问题,没有告诉我问题出现在哪里。
|
235 | 274 |
|
236 |
| -## 参考 |
| 275 | +## 题目参考 |
237 | 276 |
|
238 | 277 | 1. [阿里、百度、腾讯、华为面经(均已拿到offer)](https://www.nowcoder.com/discuss/11495)
|
239 | 278 | 1. [【面经】阿里+百度+CVTE面经合集(offer均已收到)](https://www.nowcoder.com/discuss/5941)
|
|
266 | 305 | 1. [西安,美团面经 java](https://www.nowcoder.com/discuss/11319?type=0&order=3&pos=1254&page=1)
|
267 | 306 | 1. [美团补招](https://www.nowcoder.com/discuss/19994?type=2&order=3&pos=11&page=1)
|
268 | 307 | 1. [年级倒数TOP20%的求职经验](https://www.nowcoder.com/discuss/18855?type=2&order=3&pos=44&page=1)
|
| 308 | + |
| 309 | +## 解答参考 |
| 310 | + |
| 311 | +1. [Java HashMap工作原理及实现 ](http://yikun.github.io/2015/04/01/Java-HashMap%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE%9E%E7%8E%B0/) |
| 312 | +1. [红黑树和AVL树的比较 ](http://blog.csdn.net/hustyangju/article/details/27214251) |
| 313 | +1. [从B树、B+树、B*树谈到R 树 ](http://blog.csdn.net/v_july_v/article/details/6530142) |
| 314 | +1. [Trie树(Prefix Tree)介绍 ](http://blog.csdn.net/lisonglisonglisong/article/details/45584721) |
| 315 | +1. [如何设计实现一个LRU Cache?](http://yikun.github.io/2015/04/03/%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AALRU-Cache%EF%BC%9F/) |
0 commit comments