Java常见知识(持续更新_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java常见知识(持续更新

Java常见知识(持续更新

 2017/11/29 19:04:50  Everyday都不同  程序员俱乐部  我要评论(0)
  • 摘要:其实今年面试发现,对于底层的东西还是得多看,之前虽然整理过一些Java面试的东西,但还是不够,下面就回顾下比较需要掌握的知识点。1、JVM的内存结构收藏一篇比较好的文章:JVM内存模型及垃圾回收算法:http://blog.csdn.net/kingofworld/article/details/177185872、HashMap原理1)HashMap:http://wiki.jikexueyuan.com/project/java-collection/hashmap
  • 标签: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)方法将链表结构转换为红黑树。)

?

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

发表评论
用户名: 匿名