跳至主要內容
深入浅出 String 字符串

引子

相信每个 Javaer 都遇到过这个问题:String abc = new String("123"); 创建了几个对象?其作为八股文已是老生常谈,考究的是大伙对对象创建以及字符串在 JVM 中的存储理解。本篇文章就来深入探讨下 String 方方面面的问题。

String 内部结构

char[] -> byte[]

String 内部原本使用一个 char[] value 存储字符,若不是”版本任你更,我用 Java 8“ 的钉子户,应该能发现从 JDK 9 开始,它就变成了 byte[] value。这么做的目的主要是为了减少字符串占用的内存,减少 GC 次数。(详见参考资料JEP 254


YUDI-Corgi原创JavaJavaString大约 18 分钟
Java 8 中 HashMap 的改变

前言

聊聊 HashMap 篇中,通过 JDK1.7 的 HashMap 的几个方法:put()、get()、resize()/transfer()讲解了其原理,在最后简单描述了 HashMap 死链问题。引出了在 Java 8 中,HashMap 底层结构变化为 数组+链表+红黑树,提高了查询效率,并解决了死链问题。我们就以此作为切入点,来看看 HashMap 在 Java 8 版本有了哪些变化。


YUDI-Corgi原创JavaJavaHashMap集合大约 13 分钟
聊聊 HashMap

前言

Map,Java 三大集合框架之一,JDK1.2 时便已存在,是一个Key-Value键值对映射的接口,即一个Key对应一个Value。在日常开发使用中,我们常见的 Map 实现类有:HashMap、Hashtable、TreeMap、LinkedHashMap 等,用以应对不同业务情况下的数据存储与使用。而本篇的主角是 HashMap,让我们来粗浅的聊聊它吧。(注意:本篇 HashMap 的源码和原理讲解全部基于 JDK1.7)

基础

HashMap 是基于哈希表(Hashtable)的 Map 实现类,以Key-Value形式保存数据,Key唯一,Value可重复,并采用 Hash 算法确定Key-Value的存储位置从而保证其进行数据快速存取。类图如下:


YUDI-Corgi原创JavaJavaHashMap集合大约 8 分钟
JVM 类加载机制

JVM-内存模型 篇已经详细讲解了 JVM 内存模型的结构,如果想先了解 JVM 的内存模型,可以戳一下链接先去看看哦。这一篇,我将着重描述 Java 类加载机制,在 JVM 中类的加载到底经历了哪些过程。

什么是类的加载

类的加载指的是将类的 .class 文件中的二进制数据读入到内存中,将其放在 JVM 运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终结果是位于堆区中的 Class 对象,Class 对象封装了类在方法区内的数据结构,并提供了访问方法区内的数据结构的接口。


YUDI-Corgi原创JavaJavaJVM大约 9 分钟
JVM 内存模型

什么是 JVM

概念

JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,是一种用于计算设备的规范、能够运行 Java 字节码的虚拟机,拥有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。

引入 Java 虚拟机后,Java 语言开发的程序在不同平台上运行时不需要重新编译。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的字节码(.class),就可以在多种平台上不加修改地运行。对于 JVM,除了 Oracle,也有其它的开源或闭源实现。(摘自维基百科


YUDI-Corgi原创JavaJavaJVM大约 9 分钟