【Java基础】HashMap扩容 | CopyOnWriteArrayList 的底层原理 | 字节码 | Java 异常体系
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 异常体系相关推荐
- Java基础-hashMap原理剖析
Java基础-hashMap原理剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是哈希(Hash) 答:Hash就是散列,即把对象打散.举个例子,有100000条数 ...
- 【重难点】【Java基础 05】说一说你平时遇到的异常、什么情景下会用到反射、反射的底层原理
[重难点][Java基础 05]说一说你平时遇到的异常.什么情景下会用到反射.反射的底层原理 文章目录 [重难点][Java基础 05]说一说你平时遇到的异常.什么情景下会用到反射.反射的底层原理 一 ...
- JAVA基础再回首(一)——基本概念、JAVA开发工具、JAVA基本语法
JAVA基础再回首(一)--基本概念.JAVA开发工具.JAVA基本语法 学了java,做了android应用开发,现在回想起来,真的是一路坎坷..我在上章博客中提到了我以后的几个学习计划和目标就是把 ...
- 视频教程-Java基础中国象棋和网络聊天室Swing开发-Java
Java基础中国象棋和网络聊天室Swing开发 IT行业资深从业者,7年资深Java高级开发,Java架构师.曾就职银行.电信等行业多家上市公司.担任项目负责人,软件架构师.有丰富的高并发.分布式系统 ...
- 《深入理解Java虚拟机》笔记5——类加载机制与字节码执行引擎
第七章 虚拟机类加载机制 7.1 概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在J ...
- java编译会产生多少个类文件,编译一个定义了三个类和四个方法的Java源程序文件,总共会产生多少个字节码文件 ? ( )...
编译一个定义了三个类和四个方法的Java源程序文件,总共会产生多少个字节码文件 ? ( ) 更多相关问题 论述风化作用基本概念及其主要类型. 什么是药用植物 学?其 研究任务是什么 ? 庐山瀑布很有名 ...
- java异常 字节码,Java字节码角度分析异常处理
目录 从字节码角度来分析:异常处理 1.1 异常-catch // 从字节码角度来分析:异常处理 public class T13_ByteAnalyseException { public stat ...
- Java基础 HashMap实现原理及方法
1.什么是HashMap? HashMap通常提起他,我们想到的就是键值对方式存储(key-value型式),可以接收null键值和null值.基于Map接口的非同步实现(也就是线程不安全),并不保证 ...
- java Map及其实现类的底层原理
文章目录 一.Map接口及其多个实现类的对比 二.Map中存储的key-value特点 三.HashMap在JDK7中的底层原理 四.HashMap在JDK8中的底层原理 五.HashMap在JDK7 ...
最新文章
- MindSpore网络模型类
- 《你的灯亮着吗》读书笔记1
- servlet配置web.xml问题
- ios tableview分组间距
- WSUS 3.0 STEP BY STEP 配置手册
- iOS Hacker 使用Theos开发tweak
- 【报告分享】2021开放数字资产价值报告:数字化孕育新的发展动能.pdf(附下载链接)...
- Uber无人车正式分拆:估值72.5亿美元,获孙正义和丰田10亿美元投资
- JSP 获取Request 经常使用參数
- 远程接入CBTS的应用
- 药店app的布局html,APP首页常用排版
- Centos下查看和修改网卡Mac地址
- css下标怎么打,css如何显示文字的上标和下标
- SQL Server 进程无法连接到 Subscriber “xxxxxx”
- 三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经
- 线代9讲_特征值与特征向量相似理论
- java ieee754_IEEE754浮点数
- 及时复盘的好处_复盘是什么意思,有什么意义
- 全连接网络和卷积神经网络对比分析
- 树莓派 Python编写OLED显示程序