1. HashMap的扩容机制

  • JDK 1.7

扩容是针对数组进行扩容,链表是不需要进行扩容的。扩容时先生成原来数组两倍大小的新数组,在把原来老数组上的链表上的元素转移过去。具体在转移链表中元素的步骤是:取每个元素的 key,基于新数组长度,计算出每个元素在新数组中的下标,将元素添加到新数组上去。最后,当所有的元素都转移完成后,将新数组赋给 HashMap 的 Table 属性

  • JDK 1.8 版本

先生成新数组,遍历老数组中每个位置的链表或者红黑树,如果是链表的话,就直接将链表中的每个位置重新计算下标,然后添加到新数组上去。如果是红黑树的话,遍历红黑树,计算出红黑树中每个元素对应在新数组中的下标位置。算法为:

先统计每个下标位置的元素个数,如果该位置的元素个数超过了8, 则生成一个新的红黑树,并将根节点添加到新数组的对应位置。如果没超过8,则生成一个链表,将链表的头节点添加到数组的对应位置。

最后,当所有的元素都转移完成后,将新数组赋给 HashMap 的 Table 属性。


2. CopyOnWriteArrayList 的底层原理

出现原因:首先,CopyOnWriteArrayList 要解决的是 ArrayList 线程不安全的问题,所以我们需要一个线程安全的 ArrayList 。

add操作原理: CopyOnWriteArrayList 实现了对写线程的加锁,这里要注意:CopyOnWriteArrayList 并未实现读写线程的串行,其add方法在内部实现时,新建一个新数组,为新数组添加新的元素,添加结束后,再将新数组赋给 List。通过这种方式实现 写线程运行时,不影响读线程运行,从而提高了效率。

使用场景:CopyOnWriteArrayList 适用于读多写少的场景,但是其不适用实时性要求高的场景。除此之外,CopyOnWriteArrayList 的内存消耗高,因为其在 add 操作时,需要新建一新数组。


3. 字节码是什么,有什么好处

Java 源文件(即 *.java)经过 javac 编译器被编译为 java字节码文件(即 *.class )。如下图所示:

优点: Java 字节码文件可以在各种操作系统上运行,但是要求操作系统上要有 java 的运行环境 jdk 或者 jre。因为Java 字节码的存在,使得 Java 语言可以实现 跨平台。除此之外,其也提升了代码执行的性能,因为编译器可做一些优化,比如锁消除、标量替换、方法内联等。


4. Java 的异常体系

Java 中的异常体系如下:

异常处理具有一顶级父类 Throwable, Throwable 具有两个子类 Exception 和 Error 。
Error 是指非常严重的错误,如栈溢出、内存溢出等异常,其可能是操作系统层面产生的问题。对 Error 类异常我们一般不去捕获,等待它自己抛出即可。

而 相比之下 Exception 类的异常就没有那么严重了,我们可以自己写程序来解决。其又分为 运行时异常 和 非运行时异常。运行时异常是指程序编译可以通过,但是运行时会抛出的异常,比如空指针异常、数组下标越界异常等。而非运行时异常,是程序编译都通过不了的异常,比如 IO异常 或 SQL 异常。


【Java基础】HashMap扩容 | CopyOnWriteArrayList 的底层原理 | 字节码 | Java 异常体系相关推荐

  1. Java基础-hashMap原理剖析

    Java基础-hashMap原理剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.什么是哈希(Hash) 答:Hash就是散列,即把对象打散.举个例子,有100000条数 ...

  2. 【重难点】【Java基础 05】说一说你平时遇到的异常、什么情景下会用到反射、反射的底层原理

    [重难点][Java基础 05]说一说你平时遇到的异常.什么情景下会用到反射.反射的底层原理 文章目录 [重难点][Java基础 05]说一说你平时遇到的异常.什么情景下会用到反射.反射的底层原理 一 ...

  3. JAVA基础再回首(一)——基本概念、JAVA开发工具、JAVA基本语法

    JAVA基础再回首(一)--基本概念.JAVA开发工具.JAVA基本语法 学了java,做了android应用开发,现在回想起来,真的是一路坎坷..我在上章博客中提到了我以后的几个学习计划和目标就是把 ...

  4. 视频教程-Java基础中国象棋和网络聊天室Swing开发-Java

    Java基础中国象棋和网络聊天室Swing开发 IT行业资深从业者,7年资深Java高级开发,Java架构师.曾就职银行.电信等行业多家上市公司.担任项目负责人,软件架构师.有丰富的高并发.分布式系统 ...

  5. 《深入理解Java虚拟机》笔记5——类加载机制与字节码执行引擎

    第七章 虚拟机类加载机制 7.1 概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在J ...

  6. java编译会产生多少个类文件,编译一个定义了三个类和四个方法的Java源程序文件,总共会产生多少个字节码文件 ? ( )...

    编译一个定义了三个类和四个方法的Java源程序文件,总共会产生多少个字节码文件 ? ( ) 更多相关问题 论述风化作用基本概念及其主要类型. 什么是药用植物 学?其 研究任务是什么 ? 庐山瀑布很有名 ...

  7. java异常 字节码,Java字节码角度分析异常处理

    目录 从字节码角度来分析:异常处理 1.1 异常-catch // 从字节码角度来分析:异常处理 public class T13_ByteAnalyseException { public stat ...

  8. Java基础 HashMap实现原理及方法

    1.什么是HashMap? HashMap通常提起他,我们想到的就是键值对方式存储(key-value型式),可以接收null键值和null值.基于Map接口的非同步实现(也就是线程不安全),并不保证 ...

  9. java Map及其实现类的底层原理

    文章目录 一.Map接口及其多个实现类的对比 二.Map中存储的key-value特点 三.HashMap在JDK7中的底层原理 四.HashMap在JDK8中的底层原理 五.HashMap在JDK7 ...

最新文章

  1. MindSpore网络模型类
  2. 《你的灯亮着吗》读书笔记1
  3. servlet配置web.xml问题
  4. ios tableview分组间距
  5. WSUS 3.0 STEP BY STEP 配置手册
  6. iOS Hacker 使用Theos开发tweak
  7. 【报告分享】2021开放数字资产价值报告:数字化孕育新的发展动能.pdf(附下载链接)...
  8. Uber无人车正式分拆:估值72.5亿美元,获孙正义和丰田10亿美元投资
  9. JSP 获取Request 经常使用參数
  10. 远程接入CBTS的应用
  11. 药店app的布局html,APP首页常用排版
  12. Centos下查看和修改网卡Mac地址
  13. css下标怎么打,css如何显示文字的上标和下标
  14. SQL Server 进程无法连接到 Subscriber “xxxxxx”
  15. 三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经
  16. 线代9讲_特征值与特征向量相似理论
  17. java ieee754_IEEE754浮点数
  18. 及时复盘的好处_复盘是什么意思,有什么意义
  19. 全连接网络和卷积神经网络对比分析
  20. 树莓派 Python编写OLED显示程序

热门文章

  1. 网络通是免费的内网端口映射软件
  2. 虚拟筛选涉及的小分子数据库
  3. 贪心算法_排队不等式_绝对值不等式_推公式
  4. 灰色预测模型实现python
  5. 期末小结(一). 专业技术
  6. 趣头条疯狂777就是坑货,根本不是纯随机
  7. 大学物理复习2-动量守恒定律的应用+质心运动定理
  8. Linux文件系统体系结构
  9. 7年测试工程师,裸辞掉17K的工作,想跳槽找更好的,还是太高估自己了....
  10. java如何优雅的判空