)
一、Java 体系结构JDK/JRE/JVM1.核心组件对比组件全称包含内容用途特点JDKJava Development KitJRE 开发工具javac、jdb、jar等开发Java程序包含编译器等开发工具JREJava Runtime EnvironmentJVM 标准类库java.lang、java.util等运行Java程序用户只需运行程序时安装JVMJava Virtual Machine字节码解释器、JIT编译器、内存管理等执行字节码平台相关字节码平台无关2.层级关系JDK (开发工具包) ├── JRE (运行环境) │ ├── JVM (虚拟机) │ └── 标准类库 (API) ├── 编译器 (javac) ├── 调试器 (jdb) └── 打包工具 (jar)3.跨平台原理核心机制字节码 平台特定的JVM编译时.java→.class字节码平台无关运行时JVM加载并执行字节码JVM本身平台相关口号一次编写到处运行4.关键要点javac编译器只在JDK中JRE不包含任何开发工具javac、jdb等安装JDK后无需单独安装JREJDK已包含JREJVM执行流程加载 → 验证 → 解释/编译JIT→ 执行JIT编译器将热点字节码编译为本地机器码提升性能1.基本数据类型8种类型关键字大小默认值备注整数byte1字节0最节省内存short2字节0int4字节0默认整数类型long8字节0L字面量加L后缀浮点float4字节0.0f单精度需f后缀double8字节0.0d默认浮点类型字符char2字节\u0000单引号Unicode字符布尔boolean1位false不与整数互换2.引用数据类型类如String、自定义类接口数组枚举3.重要特性对比特性基本数据类型引用数据类型存储内容实际值对象内存地址内存位置栈堆对象在堆引用在栈默认值有如0、falsenull可为null否是调用方法不能直接调用通过包装类可以调用赋值方式值拷贝引用拷贝共享对象4.使用注意事项内存优化根据范围选择合适类型如byte代替int精度问题浮点数有舍入误差金融计算用BigDecimalchar类型16位Unicode可存储中文等特殊字符boolean只有true/false默认浮点字面量3.14默认是doublefloat需加f三、Java 变量1.变量三要素数据类型决定内存大小和操作方式变量名标识符用于引用变量值存储在变量中的数据2.命名规则合法字符字母、数字、下划线_、美元符$首字符不能是数字不能是关键字如int、class、true等长度限制理论上无限制但应保持合理3.命名规范最佳实践camelCase首字母小写后续单词首字母大写userName、totalAmount有意义避免单字母除循环变量或模糊名称布尔变量以is、has、can开头isValid、hasPermission常量全大写下划线分隔MAX_SIZE避免使用_开头有特殊含义、拼音、缩写不清4.变量初始化变量类型默认值必须显式初始化示例成员变量有否int count;默认0静态变量有否static double price;局部变量无是int x 10;必须赋值参数变量由调用者提供是void method(int param)5.常见错误使用未初始化的局部变量变量名以数字开头int 1stNum;使用关键字作为变量名int class;类型不匹配的赋值四、Java 运算符1.算术运算符2.关系运算符注意比较基本类型的值比较对象的引用地址非内容3.逻辑运算符运算符描述短路特性逻辑与有左false则短路||逻辑或有左true则短路!逻辑非无一元运算符按位与/非短路与无|按位或/非短路或无短路特性优势避免不必要的计算和异常如空指针4.赋值运算符5.三元运算符语法条件 ? 表达式1 : 表达式2作用简化if-else赋值逻辑示例int max (a b) ? a : b;限制表达式1和2类型需兼容不能替代复杂逻辑6.运算符优先级()括号--自增自减*/%乘除取模-加减!关系||逻辑?:三元-等赋值建议不确定时使用括号明确优先级7.特殊运算示例java // 浮点数除以0 double d 5.0 / 0; // Infinity不抛异常 // 自增区别 int x 5; int a x; // a5, x6后置先使用后加 int b x; // b7, x7前置先加后使用 // 复杂表达式 int x 7; System.out.println(x x); // 7 9 16五、Docker Compose 回顾关联题1.核心概念用途多容器应用的一键编排与管理文件docker-compose.yml命令docker-compose up -d后台启动2.关键配置环境变量env_file字段加载.env文件最佳实践端口映射ports字段数据卷volumes字段命名卷或绑定挂载依赖depends_on仅控制启动顺序不等待就绪3.网络特性默认所有服务加入同一内部网络服务发现通过服务名直接访问DNS解析多网络一个服务可连接多个网络4.常用命令bashdocker-compose up -d # 后台启动 docker-compose down # 停止并移除容器、网络 docker-compose down -v # 同时删除命名卷 docker-compose logs # 查看日志 docker-compose exec # 进入容器 docker-compose config # 验证配置5.适用场景✅ 本地开发多服务应用✅ CI/CD集成测试环境✅ 单机部署微服务原型❌ 大规模生产集群用Kubernetes6.最佳实践敏感信息用.env文件管理并加入.gitignore为不同环境准备不同.env文件避免硬编码密码在yml文件中六、易错点与综合总结1.Java体系结构javac只在JDK中JRE只能运行不能编译JVM平台相关字节码平台无关跨平台依赖各平台的JVM实现2.数据类型boolean只有true/false不是0/1整数除法截断小数部分浮点数默认doublefloat需加fchar是16位Unicode可存中文基本类型不能为null引用类型默认null3.变量局部变量必须显式初始化变量名不能以数字开头不能用关键字命名成员变量有默认值局部变量没有4.运算符比较对象时比地址不是内容和||有短路特性5.综合示例java // 运算注意 double result 10 / 3; // 错误result3.0整数除法 double correct 10.0 / 3; // 正确result3.333... // 三元运算符简化 int max (a b) ? a : b;002-Java一、循环结构基础1.三种基本循环对比循环类型特点适用场景控制类型for循环已知循环次数三段式初始化;条件;更新明确迭代次数、遍历数组/集合入口控制while循环先判断条件再执行循环体循环次数不确定条件判断前置入口控制do-while循环先执行一次循环体再判断条件至少执行一次条件判断后置出口控制2.循环控制要点入口控制for、while先判断条件可能一次都不执行出口控制do-while至少执行一次共同点for和while都是入口控制循环二、跳转语句详解1.三种跳转语句对比语句作用范围功能注意break循环结构、switch语句跳出当前循环或switch执行后续代码不能用于普通if语句continue仅循环结构for/while/do-while跳过本次循环剩余代码进入下一次迭代不跳出循环只跳过本次迭代return方法内部结束当前方法返回调用者可用于void方法提前结束2.break 语句功能立即终止最近的循环或switch结构使用场景循环中找到目标后提前退出switch中匹配到case后跳出限制不能用于普通if条件语句示例for (int i 0; i 10; i) { if (i 5) { break; // 跳出循环i5时停止 } System.out.println(i); }3.continue 语句功能跳过当前循环迭代的剩余部分进入下一次循环执行流程for循环跳过循环体剩余代码 → 执行更新表达式i→ 判断条件while/do-while跳过循环体剩余代码 → 直接判断条件使用场景跳过数组中的无效元素避免深层嵌套if提高可读性过滤特定条件的数据示例for (int i 0; i 10; i) { if (i % 2 0) { continue; // 跳过偶数 } System.out.println(i); // 只打印奇数 }4.return 语句功能结束当前方法的执行返回调用者两种形式return; // void方法无返回值 return value; // 非void方法必须返回匹配类型的值与break的区别return结束整个方法break只结束当前循环或switch注意return后的代码会导致不可达代码编译错误5.System.exit(0)功能终止整个JVM进程作用结束所有方法的执行参数0表示正常退出非0表示异常退出三、条件判断结构1.if-else 语句基本语法if (条件) { // 条件为true时执行 } else if (条件2) { // 条件2为true时执行 } else { // 以上条件都不满足时执行 }省略大括号规则只有紧随if/else后的第一行代码属于条件块后续代码无论缩进如何都不属于条件块示例if (x 0) System.out.println(正数); // 属于if块 System.out.println(这行总是执行); // 不属于if块总是执行2.三元运算符 (?:)语法条件 ? 表达式1 : 表达式2功能简化if-else赋值逻辑适用场景简单的变量赋值方法返回值参数传递不适用场景多重条件嵌套需要执行多个语句的分支逻辑复杂的业务逻辑示例int max (a b) ? a : b; // 代替if-else赋值3.switch-case 语句支持的数据类型基本整型byte、short、int、char包装类Byte、Short、Integer、Character字符串StringJDK7枚举enum不支持的类型boolean、double、float等特点支持多个离散值匹配JVM可优化为跳转表tableswitch/lookupswitch性能可能优于多重if-else需要break防止case穿透示例switch (day) { case 1: System.out.println(周一); break; case 2: System.out.println(周二); break; default: System.out.println(其他); }4.if-else vs switch-case 选择特性IF-ELSESWITCH-CASE条件类型任意布尔表达式等值比较可读性复杂条件时清晰多个离散值时更清晰性能逐条件判断JVM可能优化为跳转表适用场景范围判断、复杂逻辑枚举值、多个固定值匹配四、常见错误与陷阱1.循环常见错误错误类型描述示例/避免方法无限循环条件永远为true循环永不结束确保条件能变为false检查更新逻辑边界错误循环次数多一次或少一次注意i nvsi n理解半开区间修改控制变量循环体内修改循环控制变量避免在循环体内修改i等控制变量空循环体循环体为空可能无意中省略使用{}明确循环体范围2.条件判断常见错误省略大括号误解认为所有缩进代码都属于条件块switch-case穿透忘记break导致多个case执行浮点数相等比较使用比较浮点数应使用范围比较空指针异常条件判断中的对象可能为null3.跳转语句错误break误用在if语句中使用break应只在循环/switch中使用continue误解认为continue会跳出循环实际只跳过本次迭代不可达代码return/break/continue后的代码无法执行4.边界错误详解半开区间for (int i 0; i n; i)→ 执行n次0到n-1闭区间for (int i 0; i n; i)→ 执行n1次0到n经典错误// 期望打印0-9实际打印0-10 for (int i 0; i 10; i) { System.out.println(i); }五、最佳实践与使用场景1.循环选择指南场景推荐循环原因已知迭代次数for循环结构清晰控制集中条件判断前置while循环先判断后执行安全至少执行一次do-while循环保证首次执行遍历集合/数组增强型for简洁无需索引2.跳转语句使用场景使用break搜索找到目标后立即退出错误发生时跳出循环switch中匹配到case后终止使用continue过滤无效数据跳过特定条件的处理简化嵌套if结构使用return方法完成时正常返回错误发生时提前返回递归的终止条件3.代码可读性优化避免深层嵌套使用continue提前返回减少if嵌套明确循环意图选择最适合的循环类型添加注释复杂循环逻辑添加说明提取方法过长的循环体提取为独立方法六、综合示例与练习1.综合示例// 使用break提前退出 int[] numbers {1, 2, 3, 4, 5}; int target 3; boolean found false; for (int num : numbers) { if (num target) { found true; break; // 找到后立即退出 } } // 使用continue跳过特定元素 for (int i 1; i 10; i) { if (i % 2 0) { continue; // 跳过偶数 } System.out.println(奇数: i); } // 三元运算符简化 int score 85; String grade (score 90) ? A : (score 80) ? B : (score 70) ? C : D; // switch-case处理多个固定值 String day MON; switch (day) { case MON: case TUE: case WED: case THU: case FRI: System.out.println(工作日); break; case SAT: case SUN: System.out.println(周末); break; default: System.out.println(无效输入); }2.常见陷阱练习// 陷阱1省略大括号的误解 int x 5; if (x 0) System.out.println(正数); System.out.println(这行总是执行); // 不属于if块 // 陷阱2switch-case穿透 int option 1; switch (option) { case 1: System.out.println(选项1); // 缺少break会继续执行case 2 case 2: System.out.println(选项2); break; } // 输出选项1 选项2 // 陷阱3浮点数比较 double a 0.1 0.2; double b 0.3; if (a b) { // false浮点数精度问题 System.out.println(相等); }七、易错点总结1.语法细节if省略大括号只控制第一行代码switch支持类型不支持boolean、double、float三元运算符只适合简单赋值不能替代复杂if-elsedo-while末尾有分号while(条件);2.逻辑理解break vs continuebreak跳出循环执行循环后代码continue跳过本次继续下一次循环入口 vs 出口控制入口可能一次都不执行for、while出口至少执行一次do-while边界条件i nn次循环0到n-1i nn1次循环0到n3.性能与优化switch优化JVM可能优化为跳转表多分支时效率高循环效率避免在循环内创建对象、进行复杂计算提前退出找到目标后及时break避免无效循环