计算机学习笔记 Java基础与底层原理详解①
7月30日课程复习笔记Java基础与底层原理详解本次课程深入剖析了Java语言的核心特性与底层运行机制。从Java“一次编写到处运行”的跨平台原理出发详细讲解了JDK、JRE与JVM的组成与关系。随后课程深入计算机底层系统阐述了原码、反码、补码的转换与运算规则以及不同数据类型int, float, boolean, char在内存中的存储细节与性能权衡。最后详细梳理了变量作用域、运算符优先级及位运算的巧妙应用。第一部分Java语言核心特性与运行机制1. Java的八大核心特性简单性剔除了C/C中复杂的指针操作和手动内存管理引入自动垃圾回收机制使编程更安全可靠。面向对象采用面向对象的编程思想通过类和对象组织代码支持封装、继承和多态提高了代码的复用性和扩展性。分布式支持网络编程程序可以在多台机器上协同运行适用于处理大规模数据计算。健壮性具备严格的语法检测和异常处理机制能有效防止数组越界、空指针等常见错误。体系结构中立Java程序不直接依赖特定的CPU架构如x86, ARM而是运行在Java虚拟机JVM之上。可移植性编译后的.class字节码文件可以在任何安装了JVM的操作系统Windows, Linux, macOS上运行实现“一次编写到处运行”。解释型Java源代码先被编译成字节码再由JVM解释或即时编译JIT成机器码执行。高性能支持多线程能够同时处理多个任务提高程序执行效率。2. JDK、JRE与JVM的关系JDK (Java Development Kit)Java开发工具包是程序员的“工具箱”。它包含了JRE以及编译器javac、调试器等开发工具用于开发和编译Java程序。JRE (Java Runtime Environment)Java运行时环境是运行Java程序的必要环境。它包含了JVM和核心类库。JVM (Java Virtual Machine)Java虚拟机是实现Java跨平台的核心。它负责加载、验证并执行字节码将字节码“翻译”成特定操作系统的机器指令。包含关系JDK 包含 JREJRE 包含 JVM。3. 环境变量与执行流程环境变量 (Path)配置环境变量的目的是为了让操作系统能在任意目录下找到并执行JDK的bin目录下的命令如java,javac。系统会按照当前目录 - 环境变量Path中配置的路径顺序进行查找。执行流程.java源文件 - (javac编译) -.class字节码文件 - (JVM加载、解释/编译) - 操作系统调用 - CPU执行。第二部分数据类型与底层存储原理1. 进制转换与编码基础进制表示二进制前缀0b、八进制前缀0、十进制、十六进制前缀0x。转换方法任意进制转十进制位权展开法即每一位数字乘以基数的位次方然后求和。十进制转任意进制除基取余法即不断除以目标进制数并记录余数直到商为0最后将余数倒序排列。2. 原码、反码、补码计算机内部使用补码来表示和存储有符号整数以统一加减法运算并解决“0”的歧义问题。原码最高位为符号位0正1负其余位表示数值的绝对值。反码正数的反码与原码相同负数的反码是符号位不变其余位按位取反。补码正数的补码与原码相同负数的补码是其反码加1。为何使用补码统一运算计算机只有加法器减法通过加上负数的补码来实现。解决双零问题原码和反码中存在0和-0两种表示浪费编码空间且导致逻辑复杂。补码中0只有一种表示全0而原本表示-0的编码如8位下的10000000被用来表示-128使得8位有符号整数的范围变为-128到127。3. 整型数据 (byte, short, int, long)存储大小byte(8位),short(16位),int(32位),long(64位)。默认类型与转换整数默认类型为int。声明long类型变量时若数值超出int范围需在数字后加L。byte和short在参与运算时会先被自动提升为int类型再进行计算。强制类型转换从大范围类型向小范围类型转换如int转byte需要强制转换可能导致数据溢出或精度丢失截取低位。4. 浮点型数据 (float, double)存储标准遵循IEEE 754标准分为符号位、阶码指数和尾数数值三部分。存储结构float(32位)1位符号 8位阶码 23位尾数。double(64位)1位符号 11位阶码 52位尾数。精度与范围浮点数能表示的数值范围极大但有效位数有限float约6-7位。精度分布不均数值越接近0表示越精确刻度密集数值越大相邻两个可表示数值的间隔越大刻度稀疏精度急剧下降。因此float和int虽然都是32位但int能精确表示范围内的所有整数而float在大数值时无法精确表示所有整数。5. 布尔型数据 (boolean)底层实现虽然逻辑上只需要1位0或1但在JVM底层通常实现为int类型32位。设计权衡这是为了优化CPU缓存性能。CPU与内存交互的基本单位是缓存行通常64字节。如果boolean只占1位或1字节一个缓存行会加载过多数据增加多线程竞争和等待的概率。将其设计为32位可以减少缓存行内的数据项数量提高访问效率。6. 字符型数据 (char)存储原理字符在计算机中存储的不是图形而是其对应的数字编码如ASCII, Unicode。编码与乱码char类型在Java中占2字节16位采用Unicode编码。乱码产生的根本原因是文件存储时使用的编码规则与读取时使用的编码规则不一致。流操作文件流、网络流等底层本质上都是对字节或字符数组的操作。第三部分变量、运算符与位运算1. 变量与常量变量声明Java是强类型语言声明变量必须指定类型类型 变量名;。变量分类全局变量成员变量定义在类中有默认初始值如int为0boolean为false。局部变量定义在方法中没有默认值必须手动初始化后才能使用。常量使用final关键字修饰值在初始化后不可更改。命名规范类名大驼峰方法和变量名小驼峰常量全大写加下划线。2. 运算符算术运算符,-,*,/,%。注意整数除法会向下取整如5/2结果为2。自增/自减,--。前置i先自增再参与运算。后置i先参与运算再自增。陷阱i i的结果是i的原始值因为后置会先保存i的旧值用于赋值然后再自增最后赋值操作将旧值覆盖回去。三元运算符条件 ? 值1 : 值2是if-else的简写形式。3. 位运算所有位运算都在补码基础上进行。与 ()两位都为1结果为1。或 (|)两位有一个为1结果为1。非 (~)按位取反。异或 (^)两位不同结果为1两位相同结果为0。应用不使用临时变量交换两个数原理利用异或运算的可逆性a ^ b ^ b a。步骤a a ^ b此时a存储了a和b的差异信息b a ^ b相当于(a ^ b) ^ b结果为原始a的值赋给ba a ^ b相当于(a ^ b) ^ a结果为原始b的值赋给a