Java常见知识(持续更新

其实今年面试发现,对于底层的东西还是得多看,之前虽然整理过一些Java面试的东西,但还是不够,下面就回顾下比较需要掌握的知识点。

1、JVM的内存结构

收藏一篇比较好的文章:

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)方法将链表结构转换为红黑树。ConcurrentHashMap在1.8中的实现,相比于1.7的版本基本上全部都变掉了。首先,取消了Segment分段锁的数据结构,取而代之的是数组+链表(红黑树)的结构而对于锁的粒度,调整为对每个数组元素加锁(Node)。然后是定位节点的hash算法被简化了,这样带来的弊端是Hash冲突会加剧。因此在链表节点数量大于8时,会将链表转化为红黑树进行存储https://blog.csdn.net/fouy_yun/article/details/77816587

3、List/Set实现及数据结构

集合原理

4、List的removeheIterator的remove(一边循环一边remove)

集合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)以及使用限制。

猜你喜欢

转载自raising.iteye.com/blog/2401278
今日推荐