zoukankan      html  css  js  c++  java
  • 面试知识点——Java

    Java容器

    hashmap实现原理

    存储结构是链表数组,数组的每个元素都是链表(为了解决冲突,还可以将链表变成红黑树进一步降低复杂度)。
    put方法:根据Key类的hashCode函数得到散列码(这就要求Key类实现hashCode函数),根据散列码找到数组里对应的位置(散列码到下标的转换有不同方法),查找是否已经有Key(这就要求Key类实现equals函数),如果碰撞导致链表过长(大于等于TREEIFY_THRESHOLD),就把链表转换成红黑树(此时要求Key实现Comparable);
    get方法:思路同上,根据hashcode函数得到散列码,查找数组相应位置
    如何设计好的hashcode函数?

    hash=C0;
    hash=C1 * hash + field.hashcode;
    //C0、C1为常数
    

    负载因子(过大,过小),再散列

    java多线程

    jvm内存模型

    java 垃圾回收机制

    对象存活状态检查

    • 引用计数法(对象添加引用计数器,优点:简单高效,缺点:对象之间循环引用)
    • 可达性分析算法

    垃圾收集算法

    对象的判定到回收之间还有两次标记,如果对象没有实现finalize方法或者已经执行过finalize方法,则直接回收,否则对象进入待回收队列(同一对象的finalize方法最多被系统调用一次)

    • 标记-清除算法
    • 标记-整理算法
    • 复制算法
    • 分代算法

    新生代由于存活率较低,适合复制算法,老年代由于存活率高,适合标记清除或者标记整理算法

    垃圾收集器

    垃圾收集器之间的组合

    • Serial:新生代,单线程,复制算法收集内存,Stop the world

    • ParNew:新生代,复制算法,Serial的多线程版本

    • Parallel Scanvenge:新生代,复制算法,多线程,注重吞吐量(用户时间/总时间)

    • Serail Old:老年代,单线程,标记-整理算法

    • Parallel Old:PS的老年代版本,多线程,标记-整理算法

    • CMS(Concurrent Mark Sweep):老年代,多线程,标记-清除算法,四个步骤:初始标记、并发标记、重新标记、并发清除。各个阶段的作用,CMS的缺点

    • G1:多线程,内存分区,新生代与老年代不再物理隔离,都由一组区域组成。G1的特点。G1维护优先列表,优先回收价值大的区域。步骤:初始标记,并发标记,最终标记,筛选回收。各个阶段的作用

    内存分配与回收策略

    内存分为新生代和老年代,新生代分为一块较大的eden区和两块较小的survivor区,eden区和其中一块survivor区时可用的,另一块survivor区用于复制算法放置回收的对象。

    对象优先分配在新生代,如果对象过大或者年龄达到条件即可晋升到老年代。

    新生代对象内存分配过程:首先查看eden区空间是否够用,不够用则进行一次minor gc到survivor区,如果survivor区也不够用,通过分配担保机制转移到老年代。

    java nio

  • 相关阅读:
    redis缓存分页数据ID
    Kafka学习之(六)搭建kafka集群
    高并发下,php使用uniqid函数生成唯一标识符的四种方案(本博客也有雪花算法的方式,在【算法组】)
    Kafka学习之(五)搭建kafka集群之Zookeeper集群搭建
    Centos 更改系统时间
    Js删除字符串中的指定字符串
    Jquery 给Js动态新添加的元素 绑定的点击事件
    PHP 常用的header头部定义汇总
    来了解一下Ajax是什么?Ajax的原理?Ajax与传统Web比较?Ajax的优缺点?Ajax的Post与Get比较
    phpstorm常用快捷键(自备不全)
  • 原文地址:https://www.cnblogs.com/darknessplus/p/9787903.html
Copyright © 2011-2022 走看看