Booogu Blog

「胸中丘壑,眼中星河」

JVM方法调用原理

解析、静态/动态分派

方法调用的含义 方法调用仅仅指的是,确定被调用方法的版本(即确定调用哪个方法),而不等同于方法中的代码执行。方法调用共分为解析、分派两类: 解析 对应类加载过程中的”解析“阶段,指的是是把字节码中的部分符号引用转化为直接引用,这一步骤的前提是:方法在程序真正运行之前就有一个可确定的调用版本,并且此调用版本在运行期是不可变的。这意味着:方法的调用目标,在代码写好,编译器进行编译的那一刻就已经确...

Java基本类型与包装类,装箱拆箱

基本类型、包装类、装箱拆箱

Java基本类型的特点 Java中8中基本类型及其长度与默认值,注意Java中的基本类型长度与硬件架构无关,这种所占空间大小不变性是Java程序比其他大多数语言更具有可移植性的原因之一 装箱拆箱实现原理 反编译字节码得知: 自动装箱:调用包装类的valueOf()方法 自动拆箱:调用包装类的xxxValue()方法 基本类型的valueOf() Integer:-12...

==/equals/hasCode总结

==、equals、hasCode

==与equals异同 ==比较的都是值(Java只有值传递),对于基本数据类型比较的是数值,对于引用类型,比较的是引用对象的地址值 Object的equals方法,就是调用==,所以equals方法需要重写,比如String类做了重写,仅比较字符串的内容是否相同 为什么重写equals必须同时重写hashCode? 为了保证:两个对象相当(.equals),则它们的hashCode必须相...

Java字符串总结

字符串常量、对象、拼接、常量池

字符串常量与字符串对象 所有直接”abc”字面量出现的字符串,都会直接判定并进入常量池。 new String(),一定会创建一个字符串对象,位于堆,如果没有被引用,很快会被GC 字符串拼接:     ① 纯字符串常量相加,”hello” + “world”,编译时,String在底层会创建StringBuilder来append,但最后不会返回StingBuilder.toS...

WIP走近开源世界

如何参与开源社区 & 开源协作?

向往开源,但心存犹疑,不知如何下手?   作为程序猿/媛,觉得开源可有可无?开源离自己很远?   不知道参与开源有什么意义? 来吧,本文围绕参与开源的主题,本着扫盲 + 实践的目的,带大家领略开源世界的精彩。 为什么要参与开源? 掌握开源“硬技能...

WIP数据结构基础

常用数据结构整理备忘

数组、链表、栈、队列、哈希、树、图等数据结构基础 数组 数组具有随机访问的特点,是内存中一块连续的存储区域,适用于读取大于写入的情况。 查找复杂度:准确讲是随机访问的复杂度,是O(1)。 插入复杂度:因为插入需要移动元素,与问题规模n成正比,为O(n) 删除复杂度:也需要移动元素,为O(n) 链表 内存中不连续,适用于写入大于读取的场景 查找复杂度:需要从头...

深入Java虚拟机

JVM指令集与字节码的关系 | 字节码指令集的设计

“Booogu的第一篇技术博文” 2021年初的某个夜晚,Booogu决定开始记录一些想法和心得,就从手边这本书开始吧! 字节码介绍 JVM虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需的参数(称为操作数,Oprand)构成。 Java采用的是基于栈而非寄存器的架构,大多数指令都不包含操作数,只...