其实今年面试发现,对于底层的东西还是得多看,之前虽然整理过一些Java面试的东西,但还是不够,下面就回顾下比较需要掌握的知识点。
收藏一篇比较好的文章:
JVM内存模型及垃圾回收算法 :http://blog.csdn.net/kingofworld/article/details/17718587
?
2、HashMap原理
1)HashMap:?http://wiki.jikexueyuan.com/project/java-collection/hashmap.html
put的时候用equals方法比较key是否已经存在(延伸:equals和==区别:http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html; 以及重写equals和hashCode:
http://blog.csdn.net/javazejian/article/details/51348320)
2) ConcurrentHashMap
http://www.jianshu.com/p/1ca810c0ea42? (注意jdk1.8是红黑树, 链表的长度超过8时,会调用treeifyBin(tab , i)方法将链表结构转换为红黑树。)
?
3、List/Set实现及数据结构(暂略)
?
4、List的removeheIterator的remove(一边循环一边remove)
class="html" name="code">集合remove与迭代器remove checkForComodification()会检查expectedModCount与modCount 是否相等,如果不相等就会抛出ConcurrentModificationException异常。 在ArrayList的remove()方法内部的实现主要是通过循环找到元素的下标, 然后调用私有的fastRemove()方法:astRemove()方法中会先修改modCount的值,然后将通过复制一个新的数组的方法将原来index位置上的值覆盖掉,最后数组大小减一 (modCount的作用是记录操作(添加删除)ArrayList中元素的次数(这个很关键),每次操作ArrayList中元素后就会使modCount加一) Iterator的remove()方法分析 看源码可知ArrayList通过iterator()方法得到了一个内部类Itr,这个内部类实现了Iterator接口,在内部类Itr中定义了一个变量expectedModCount . expectedModCount 只在new一个Itr对象时初始化为modCount,在调用Itr对象的next()与remove()方法时第一步会先调用checkForComodification()方法, 并且在remove()方法中会调用ArrayList.this.remove(lastRet)方法(也就是具体的ArrayList对象的remove()方法,上面我们讲过,在ArrayList对象的remove()方法中会使得modCount的值加一),然后修改expectedModCount 的值为modCount。 Collection与Iterator的remove()方法最大的区别就是: Iterator的remove()方法会在删除元素后将modCount 的值赋值给expectedModCount,使其又相等。 如果调用Iterator 的remove() 方法来删除的话,则iterator的内部对象个数和原来集合中对象的个数会保持同步, 而直接调用集合的remove方法来删除的话,集合中对象的个数会变化而Iterator 内部对象的个数不会变化, 当调用Iterator 的next 遍历的时候发现集合中的对象的个数和Iterator 内部对象的个数不同,这样指针往后移动的时候就找不到要迭代的对象。 这是报异常的主要原因,但 内部对象操作时为了避免这种情况都会通过checkForComodification方法检测是否一致,不一致提前抛出异常ConcurrentModifiedException。
?
5、Linux常用命令
内存:jstat -gcutil查看gc回收; OOM内存溢出(包含堆溢出和栈溢出),先导出内存堆栈信息,用第三方工具如MAT分析
CPU: jstack命令看哪些线程使用cpu过高,锁竞争,IO等;
软连接:ln -s abc cde 建立abc 的软连接
?
6、redis的过期机制? mongo的结构(Bson)以及使用限制。