
7月16日课程复习笔记编程思想与Java内存模型本次课程从宏观的编程思想入手探讨了数学与编程的内在联系并对比了不同编程语言的特性。随后课程深入到Java语言的底层系统性地讲解了JVM内存模型、类与对象的内存布局、值传递机制以及数组的内存结构。以下是详细的知识点梳理。第一部分编程思想与Java语言基础1. 编程与数学的内在联系核心关系数学是解决复杂问题的思想基础而编程是实现数学算法的工具。数学负责设计算法处理多因素求解、优化如求极值和矩阵运算等问题编程则将这些连续的数学运算转化为计算机可高效执行的离散步骤。思维转换编程中的变量和函数是对数学中变量和函数f(x)概念的“翻译”。例如数学中的赋值思想在编程中体现为变量解耦通过引入中间变量来降低代码间的耦合度数学中的函数返回值在编程中则通过return关键字实现。复杂逻辑实现数学中的区间函数或多参数函数在编程中通过if-else等条件判断语句实现。递归函数调用自身则是解决斐波那契数列等问题的关键其执行过程可以通过绘制内存图来辅助理解。2. 编程语言概览与选型强类型语言如C、C、Java。要求明确声明变量类型因此性能优越但学习门槛相对较高。弱类型语言如Python、JavaScript。无需声明类型上手快但执行效率较低。适用场景Python因其丰富的库和简洁的语法非常适合模型训练和原型开发。Java/Go凭借其高性能和强大的并发处理能力更适合大规模部署的生产环境。Go语言在打包体积和并行计算方面表现更优而Java生态更完善。C语言因其能直接与硬件交互常用于操作系统等底层开发。3. Java程序的执行流程生命周期Java源代码.java文件首先需要通过编译器javac编译成字节码文件.class然后由Java虚拟机JVM加载并执行。内存区域划分JVM在执行程序时会将内存划分为不同的区域主要包括方法区、栈区和堆区。执行过程类加载类的结构信息如变量、方法定义被存入方法区的常量池中。方法调用程序从main方法开始执行main方法入栈。栈操作每当调用一个新方法时该方法会压入栈顶方法执行完毕后则从栈中弹出。栈区用于存储局部变量和方法调用信息。堆操作堆区用于存储通过new关键字创建的对象实例。第二部分Java内存模型与数据结构1. Java内存模型与数据类型基本类型共8种包括整型byte,short,int,long、浮点型float,double、字符型char和布尔型boolean。它们在栈内存中直接存储其值。引用类型主要包括类、数组、接口等。它们在栈内存中存储的是对象在堆内存中的地址引用而非对象本身。内存区域职责栈存储局部变量和方法调用信息线程私有。堆存储对象实例线程共享。方法区存储已被虚拟机加载的类信息、常量、静态变量等。2. 类与对象的内存布局类是创建对象的模板或蓝图。类的定义信息在类加载时被存入方法区的类常量池中。对象是类的实例。使用new关键字创建对象时JVM会在堆内存中开辟一块独立的空间来存储该对象的非静态属性和方法引用。静态成员被static修饰的成员变量和方法属于类本身在类加载时就存在于方法区的静态常量池中被所有对象共享。非静态成员每个对象都有自己独立的一份内存空间来存储其非静态属性不同对象之间互不影响。3. 值传递机制核心原则Java中所有的参数传递都是值传递。基本类型传递传递的是变量值的副本。在方法内部修改形参不会影响外部的实参。引用类型传递传递的是对象地址的副本。在方法内部通过形参修改对象的属性会影响外部的实参所指向的对象因为两者指向堆内存中的同一个地址。但如果在方法内部让形参指向一个新的对象则不会影响外部的实参。4. 字符串常量池优化机制Java为字符串提供了特殊的优化机制。直接赋值如String s helloJVM会先在字符串常量池中查找是否存在内容为hello的字符串若存在则直接返回其引用若不存在则创建并放入池中。new关键字如String s new String(hello)无论常量池中是否存在都会在堆内存中创建一个新的字符串对象。比较比较的是内存地址equals()方法比较的是字符串内容。5. 数组的内存结构一维数组在堆内存中表现为一块连续的地址空间用于存储相同类型的数据元素。数组对象本身还包含类型指针、长度等元数据。多维数组本质是“数组的数组”。例如一个二维int数组其外层数组的每个元素存储的是另一个一维int数组的地址。访问元素时需要通过多层索引层层查找。引用类型数组数组的每个元素存储的是一个对象的地址而不是对象本身。以下是代码及内存图示意