15k 14 分钟

本篇是对 Java 内存模型 ( JMM ) 及 volatile 关键字的深度记录,从而彻底理解 JMM 和 volatile 关键字的作用。 # Java 内存区域与内存模型 # Java 内存区域 Java 虚拟机在运行程序时会把自动管理的内存划分为以下几个区域,每个区域都有各自的用途以及创建和销毁的时机,其中蓝色部分代表的是所有线程共享的数据区域,绿色部分代表的是每个线程私有的数据区域。 Method Area(方法区) : 方法区又被称为: Non-Heap 属于线程共享的内存区域,主要用于存储已被虚拟机加载的类信息、常量、静态变量、通过即时编译器编译后的代码等数据,根据...
25k 23 分钟

本篇章是对 Java 并发中的 synchronized 关键字进行深入探索。🚀本篇章代码 Demo # 序言 线程安全是并发编程中的重要关注点,应该注意的是,造成线程安全问题的主要原因有以下两点: 1️⃣ 是存在共享数据 (临界资源)。 2️⃣ 存在多条线程共同操作共享数据。 为了解决这个问题,我们需要这样一个方案,当存在多个线程操作共享数据时,需要保证同一个时刻有且只有一个线程在操作共享数据,其它线程必须等到该线程处理完数据后再进行。 这种方式的名称叫 互斥锁 ,即能达到互斥访问目的的锁,也就说当一个共享数据被当前正在访问的线程加上 互斥锁...
14k 12 分钟

本章是:为什么重写 equals() 方法时一定要重写 hashCode() 方法深入解析。 # equals 和 hashCode 是什么 在 Java 开发中每个对象都有一个默认的 equals() 方法,它比较的是对象的引用是否相等 (即:比较两个对象是否是同一个实例)。但是在实际开发中,我们通常需要比较对象的内容是否相等,而不仅仅是比较它们的引用。这就是为什么我们要重写 equals() 方法的原因。 hashCode(哈希码) 是另一个与对象相关的重要概念,哈希码是一个整数值,它是根据对象的内容计算得出的,在 Java...
6.8k 6 分钟

# 基础概念 我们先来了解一下相关的基础概念:机器码、真值、原码、反码、补码。 # 1️⃣ 机器码 我们知道无论是代码还是数值,在计算机中最后都转换成了二进制的形式存在,而一个数值在计算机中的二进制表示形式,就是这个数的机器码。 机器码是有符号位的,在计算机中用一个二进制数的最高位存放符号,正数为 0 ,负数为 1 。 示例如下 (使用原码表示): 十进制的 +5 ,计算机字长为 8 位,其二进制是 00000101 。 十进制的 -5 ,计算机字长为 8 位,其二进制是 10000101 。 其中的 00000101 和 10000101 就是机器码。 # 2️⃣...
65k 59 分钟

在 Java 5 中新增了枚举类型,它是一种特殊的数据类型,之所以特殊是因为它是一种 class 类型却又比 class 类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。🚀本篇章代码 Demo # 定义枚举 下面这是在没有枚举类型的情况下定义常量常见的方法如下: OrdinaryConstantDemo.java本示例使用JAVA 8package top.rem.rain;/** * @Author: LightRain * @Description: 普通方式定义常量 * @DateTime: 2023-12-05 21:14 *...
599 1 分钟

# 电阻欧姆公式 颜色 单位 Ω 棕 1Ω 红 2Ω 橙 3Ω 黄 4Ω 绿 5Ω 蓝 6Ω 紫 7Ω 灰 8Ω 白 9Ω 黑 0Ω 金色 误差 ± 5%(95%~105%) 银色 误差 ± 10%(90%~110%) 无色 误差 ± 20%(80%~120%) 普通电阻计算公式是根据电阻上面的色环来计算出是多少 Ω 的电阻。 四色环电阻 :前两位代表正常值第三位代表需要在后面补几个 0 的个数,第四位则是代表误差正负值。 如:橙红红,橙色代表 3 ,红色代表 2 ,拼在一起就是 32 但是第三位也是一个 2 ,也就是代表需要在末尾处补两个 0 ,最后就是...
37k 34 分钟

本篇章源码基于 Java 8 版本,不同版本可能存在差异。🚀本篇章代码 Demo # 类加载执行流程 我们每编写一个 .java 文件的时候都储蓄着需要执行的程序与逻辑。 这些 .java 文件经过 Java 编译器后会生成它对应的类加载文件也就是 .class 文件。 此时 .class 文件中保存着 Java 代码转换后的虚拟机指令。 当需要使用某个类时,虚拟机将会加载它的 .class 文件,并创建对应的 class 对象。 并将 class...
455 1 分钟

# Java 八种数据类型 科普一下:1 个字节 = 8 位 系统默认使用字节表示占用。 数据类型 字节占用 位数 默认值 取值范围 举例说明 byte (位) 1 (字节) 8 (位) 0 -128 ~ 127 byte b = 10 short (短整数) 2 (字节) 16 (位) 0 -32768 ~ 32767 short s = 10 int (整数) 4 (字节) 32 (位) 0 -2^31 ~ 2^31-1 int i = 10 long (长整数) 8 (字节) 64 (位) 0 -2^63 ~ 2^63-1 long l = 10l float...
35k 32 分钟

本篇深入分析并理解 Java Class 对象,这对后续深入理解反射技术非常重要。🚀本篇章代码 Demo # Class 对象深入理解 # RTTI 概念以及 Class 对象作用 我们先来了解一下 RTTI 概念, RTTI 全称是 Run-Time Type Identification 是指运行时类型识别。 对于这个词一直是 C++ 中的概念,至于会在 Java 中出现 RTTI 的说法来源于 《Thinking in Java》 一书中。 其作用就是在运行时识别一个对象的类型和类的信息,这里分为两种: 第一种:传统的 RTTI 它假设我们在编译期已知道了所有类型...
28k 26 分钟

Java 注解是在 JDK5 引入的新特性,目前大部分框架都使用了注解简化代码并提高编码效率,因此掌握并深入理解 Java 注解对于一个 Java 工程师来说是很有必要的事。🚀本篇章代码 Demo # 理解注解 Java 注解与普通修饰符 public static void 的使用方法并没有多大区别。 DemoApplicationTests.javapackage top.rem.rain.annotation.demo;import org.junit.jupiter.api.Test;import...