
JAVA基础1.标识符1.1.什么是标识符Java 标识符Identifier是程序员在代码中为类、方法、变量、包、接口、标签等自定义命名的符号。与关键字不同标识符完全由开发者定义但必须严格遵守 Java 的命名规则1.2.标识符可以标识什么变量Variable方法Method类Class接口Interface枚举Enum注解Annotation包Package类型参数Type Parameter类型名称Type Name常量Constant1.3.命名规则组成字符只能由字母A-Z, a-z、数字0-9、下划线_和美元符号$组成首字符限制不能以数字开头。必须以字母、_或$开头。不能是关键字不能使用 Java 的关键字如class,public和保留字如goto,const作为标识符。大小写敏感MyClass、myclass、MYCLASS是三个完全不同的标识符。长度无上限理论上没有长度限制但应保持合理可读性。1.4.标识符命名规范**约定俗成**类型规范示例包名全小写单词间用.分隔通常使用反向域名com.alibaba.fastjson类名 / 接口名大驼峰UpperCamelCase名词或名词短语UserService,Serializable方法名小驼峰lowerCamelCase动词或动宾短语getUserById(),calculateTotal()变量名小驼峰有意义的名称避免单字母循环变量除外orderList,isActive常量名全大写 下划线分隔MAX_RETRY_COUNT,DEFAULT_TIMEOUT枚举值同常量全大写下划线PENDING,COMPLETED泛型参数单个大写字母或有意义的大驼峰缩写T,E,K,V,Req2.关键字Java 关键字Keywords是 Java 语言中预定义的、具有特殊含义的保留字。它们全部为小写不能用作变量名、类名、方法名等标识符3.字面量3.1.什么是字面量Java 字面量Literal是指在源代码中直接书写的固定值。它们不需要通过变量或表达式计算编译器在编译阶段就能确定其值和类型3.2.Java中都有哪些字面量整数字面量100-42浮点字面量3.143.14f字符字面量‘A’字符串字面量“Hello, World!”布尔字面量true,falsenull 字面量null唯一值4.变量4.1.什么是变量Java 变量是程序中用于存储数据值的命名内存空间。每个变量都有明确的类型、名称和作用域且在使用前必须先声明4.2.变量的分类根据声明位置和生命周期Java 变量分为三大类类型声明位置生命周期默认值存储位置局部变量方法/代码块/构造器内部方法调用开始 → 结束❌ 无默认值必须手动初始化栈Stack成员变量实例变量类中、方法外无static对象创建 → 被GC回收✅ 有默认值堆Heap静态变量类变量类中、方法外有static类加载 → 程序结束✅ 有默认值方法区/元空间示例对比public class VariableDemo { static int classVar 10; // 静态变量属于类所有实例共享 int instanceVar; // 实例变量默认值为 0 public void method() { int localVar 5; // 局部变量必须初始化 // int uninit; // ❌ 编译错误未初始化就使用 System.out.println(localVar); } }4.3.基本数据类型与默认值类型分类数据类型占用空间默认值 (成员变量)取值范围备注整数型byte1 字节0-2⁷ ~ 2⁷-1 (-128 ~ 127)最小整型适合节省内存的场景short2 字节0-2¹⁵ ~ 2¹⁵-1 (-32,768 ~ 32,767)较少使用int4 字节0-2³¹ ~ 2³¹-1 (-2,147,483,648 ~ 2,147,483,647)Java 中最常用的整型long8 字节0L-2⁶³ ~ 2⁶³-1 (-9.2×10¹⁸ ~ 9.2×10¹⁸)字面量需加L后缀浮点型float4 字节0.0f±1.4E-45 ~ ±3.4E38有效位数约 6~7 位IEEE 754 单精度字面量需加F/fdouble8 字节0.0d±4.9E-324 ~ ±1.7E308有效位数约 15~16 位IEEE 754 双精度默认浮点类型字符型char2 字节\u0000‘\u0000’ ~ ‘\uffff’ (0 ~ 65,535)无符号采用 UTF-16 编码单元布尔型booleanJVM 实现相关false仅true/false不直接对应数值不可与整数互转4.4.核心规则先声明后使用Java 不允许隐式声明x 10;在未声明x时直接报错局部变量无默认值这是新手最常踩的坑。编译器会严格检查 definite assignment 确定性赋值未赋值的局部变量连读取都不允许作用域限制-- 局部变量仅在 {} 内可见 -- 同名变量不能在同一作用域内重复声明 -- 内层块可以声明与外层同名的变量遮蔽但不推荐final 修饰符final变量只能赋值一次之后不可修改。对于引用类型final仅保证引用不变对象内容仍可修改4.5.命名规范速查场景规范正例反例普通变量小驼峰名词/形容词userName,isActiveUserName,user_name常量全大写下划线MAX_SIZE,DEFAULT_TIMEOUTmaxSize,Max_Size循环变量单字母可接受i,j,k,row,colloopCounterVariable布尔变量is/has/can/should 开头isValid,hasPermissionvalid,permissionFlag集合变量复数或带类型后缀users,orderListdata,temp4.6.常见陷阱与最佳实践Integer 缓存池Integer a 128; Integer b 128; a b结果为false因为超出 [-128, 127] 缓存范围每次new了新对象。比较包装类永远用.equals()浮点精度丢失0.1 0.2 ! 0.3。金融计算必须用BigDecimal禁止用float/double线程安全实例变量和静态变量在多线程环境下不安全。局部变量天然线程安全每个线程有自己的栈帧避免魔法值不要直接在代码中写if (status 3)应定义为常量ORDER_COMPLETED 3或使用枚举最小作用域原则变量尽量在最靠近使用的地方声明减少认知负担和误用风险5.二进制5.1.二进制字面量表示从Java 7开始支持直接使用0b或0B前缀书写二进制整数int bin 0b1010; // 十进制 10 long binLong 0B1111_0000L; // 支持下划线分隔增强可读性 byte b (byte) 0b11111111; // byte 需要强制转换因为默认是 int5.2. 常用进制转换方法Integer / Long 类功能方法示例十进制 → 二进制字符串Integer.toBinaryString(n)toBinaryString(10)→1010二进制字符串 → 十进制Integer.parseInt(s, 2)parseInt(1010, 2)→10指定宽度补零String.format(%32s, ...).replace( , 0)输出完整32位二进制其他进制互转Integer.toString(n, radix)radix8(八进制), 16(十六进制)5.3. 位运算符Bitwise OperatorsJava 提供完整的位操作直接对二进制位进行处理运算符含义示例按位与0b1100 0b1010 0b1000按位或^按位异或0b1100 ^ 0b1010 0b0110~按位取反~0b1100 ...11110011补码左移低位补00b0001 2 0b0100算术右移高位补符号位-8 1 -4逻辑右移高位补0-8 1 21474836445.4.Java 整数的二进制存储补码Two’s Complement正数原码 反码 补码负数补码 反码 1符号位最高位为 1 表示负数0 表示正数6.数据类型6.1.基本数据类型8种基本类型直接存储值分配在栈内存中不是对象没有方法。类型关键字字节数取值范围默认值说明整型byte1-128 ~ 1270节省空间常用于IO流/网络传输short2-32,768 ~ 32,7670较少使用int4-2³¹ ~ 2³¹-1 (约±21亿)0最常用的整数类型long8-2⁶³ ~ 2⁶³-10L时间戳、大计数等字面量需加L浮点型float4IEEE 754 单精度0.0f字面量需加F/f精度约6-7位有效数字double8IEEE 754 双精度0.0d默认浮点类型精度约15-16位有效数字字符型char20 ~ 65,535 (Unicode)‘\u0000’无符号用单引号A支持中文布尔型booleanJVM未明确规定true / falsefalse逻辑判断专用不能与整数互转6.2.引用数据类型引用类型存储的是对象的内存地址引用对象本身在堆内存中。类别示例说明类ClassString,ArrayList, 自定义类所有类的实例都是引用类型接口InterfaceList,Runnable变量声明为接口实际指向实现类对象数组Arrayint[],String[]数组是对象即使是基本类型数组枚举EnumColor.RED本质是特殊的类注解AnnotationOverride元数据标记6.3.自动装箱 / 拆箱Autoboxing Unboxing每个基本类型都有对应的包装类Wrapper Class基本类型包装类缓存范围byteByte-128 ~ 127shortShort-128 ~ 127intInteger-128 ~ 127 ⭐高频考点longLong-128 ~ 127floatFloat无缓存doubleDouble无缓存charCharacter0 ~ 127booleanBooleanTRUE/FALSE 两个常量6.4.如何选择数据类型场景推荐类型原因一般整数运算intCPU 原生字长性能最优时间戳/文件大小/IDlongint 范围不够金额/汇率/税率BigDecimal避免浮点精度灾难科学计算/图形学double精度和性能的平衡大量标志位/状态压缩byte 位运算节省内存文本处理String/StringBuilder不可变安全 / 可变高效拼接集合容器元素包装类泛型不支持基本类型7.运算符Java 运算符是执行数据操作的核心符号。为了便于理解和记忆我们可以将其分为 算术、关系、逻辑、位运算、赋值、三元 六大类并重点关注优先级和易错陷阱7.1.算术运算符用于基本的数学计算运算符说明示例⚠️ 注意事项-*/加减乘除10 / 3 3整数相除结果仍为整数截断小数%取模求余10 % 3 1结果符号与被除数相同-10 % 3 -1--自增/自减avsa见下方详解字符串拼接age: 25只要一侧是 String另一侧自动调用toString()int a 5; int b a; // b5, a6 先赋值给b再自增 int c a; // c7, a7 先自增再赋值给c7.2.关系运算符比较运算符结果为boolean类型。运算符说明适用类型!等于 / 不等于基本类型比值引用类型比地址大于/小于/大于等于/小于等于仅基本数值类型instanceof判断对象是否为某类的实例仅引用类型String s1 new String(hello); String s2 new String(hello); System.out.println(s1 s2); // false不同堆对象 System.out.println(s1.equals(s2)); // true内容相同7.3.逻辑运算符用于组合布尔表达式运算符名称短路说明短路与✅左侧为 false 则不计算右侧短路或非短路与❌两侧都计算非短路或❌!逻辑非-取反^异或-两值不同为 true相同为 false7.4.位运算符运算符含义典型用途^ ~与/或/异或/取反左移乘以 2ⁿ算术右移除以 2ⁿ保留符号逻辑右移无符号除法、哈希计算7.5.赋值运算符运算符等价形式⚠️ 隐藏行为基本赋值引用类型赋的是地址不是拷贝-*/%复合赋值自带隐式强制转换^ 位复合赋值byte b 10; b 200; // ✅ 编译通过等价于 b (byte)(b 200)结果溢出为 -46 b b 200; // ❌ 编译报错int 不能自动转回 byte7.6.三元运算符唯一的三目运算符是 if-else 的简洁替代result condition ? valueIfTrue : valueIfFalse;7.7.运算符优先级从高到低无需死记硬背掌握核心原则即可括号()优先级最高→ 不确定时就加括号一元 算术 移位 关系 位 逻辑 三元 赋值同级别从左到右赋值运算符除外从右到左// ❌ 难以阅读且容易出错 int r a b 2 0xFF; // ✅ 清晰明确 int r ((a b) 2) 0xFF;7.8.实战避坑清单#陷阱正确做法1比较字符串/对象用.equals()且常量放前面hello.equals(var)2整数除法丢精度至少一侧转 double(double)a / b3代替判空始终用做条件组合4三元运算符拆箱 NPE确保两侧类型安全或对包装类做空检查5复合赋值静默溢出关键计算显式强转并校验范围6浮点数比较不用用Math.abs(a-b) epsilon或BigDecimal8.控制语句8.1.选择语句分支if-else最基础的分支结构if (condition) { // ... } else if (anotherCondition) { // ... } else { // ... }switch根据表达式的值匹配多个分支特性传统 switch增强 switch (Java 14)语法case X:break;case X -(无需 break)穿透问题❌ 容易忘记 break 导致 fall-through✅ 天然无穿透返回值❌ 不支持✅ 可作为表达式赋值多值匹配多个 case 重复写case A, B, C -null 处理❌ NPE✅case null -(Java 17)支持类型byte/short/int/char/String/enum同上 sealed class 模式匹配(预览)8.2.循环语句for 循环// 经典 for for (int i 0; i n; i) { ... } // 增强 for (for-each) for (String s : list) { ... }while / do-whilewhile (condition) { ... } // 先判断后执行 do { ... } while (condition); // 先执行后判断至少执行一次循环性能对比场景推荐方式原因ArrayList 遍历经典 for / for-each随机访问 O(1)两者性能接近LinkedList 遍历for-each / Iterator避免 get(i) 的 O(n) 开销已知次数经典 for最直接流式处理/并行Stream API声明式 可并行化大数据量数值计算经典 for避免装箱和 Stream 开销8.3.跳转语句语句作用注意事项break跳出当前循环/switch支持标签break outerLoop;continue跳过本次迭代进入下一次支持标签continue outerLoop;return退出当前方法finally 块仍会执行yieldswitch 表达式中返回值 (Java 14)仅用于 switch 表达式内部8.4.异常控制流补充try-catch-finally本质上也是一种控制语句影响程序执行路径try { // 可能异常的代码 } catch (IOException | SQLException e) { // 多异常捕获 (Java 7) // 处理 } finally { // 必定执行即使 try/catch 中有 return }8.5.常见陷阱与最佳实践#陷阱正确做法1switch 忘记 break 导致穿透使用 Java 14-语法2for-each 中修改集合用 Iterator.remove() 或 removeIf()3if (obj null)放后面常量/null 放左侧if (null obj)防误写成4浮点数做循环条件for(double d0; d!1.0; d0.1)可能死循环改用整数计数5嵌套过深3层提取方法 / 提前 return / 策略模式重构6switch 对 null 传参传统 switch 会 NPEJava 17 可用case null7finally 中 return永远不要这样做会吞掉 try/catch 中的异常和返回值9.方法Java 方法Method是类或对象的行为抽象是代码复用和模块化的基本单元。以下是从基础语法到高级特性的系统性梳理9.1.方法定义与核心要素[修饰符] 返回类型 方法名(参数列表) [throws 异常列表] { // 方法体 }要素说明⚠️ 关键点修饰符public/protected/private/static/final/abstract/synchronized/native可组合使用顺序无强制要求但建议按规范排列返回类型任意类型或voidvoid 方法不能用 return 返回值但可用return;提前退出方法名标识符遵循驼峰命名构造器不是方法无返回类型、名称类名参数列表(类型 名称, ...)Java 只有值传递见下方详解throws声明可能抛出的受检异常运行时异常RuntimeException无需声明9.2.参数传递机制只有值传递这是 Java 最重要的概念之一也是面试高频考点参数类型传递的内容方法内修改的影响基本类型值的副本❌ 不影响原始变量引用类型引用的副本地址拷贝✅ 通过引用修改对象属性 → 影响原对象 ❌ 重新赋值引用本身 → 不影响原引用// 经典示例 void modify(int num, StringBuilder sb) { num 100; // 修改副本外部不变 sb.append( world); // 通过副本引用操作同一对象外部可见 sb new StringBuilder(new); // 重新赋值副本引用外部不受影响 }9.3.方法重载 vs 重写对比维度重载 (Overload)重写 (Override)位置同一个类中父子类之间方法名相同相同参数列表必须不同必须相同返回类型可以不同不能仅靠返回类型区分相同或是其子类型协变返回访问修饰符无限制不能比父类更严格绑定时机编译期静态绑定运行期动态绑定多态注解无需建议加Override防误写9.4.特殊方法类型构造器名称与类名相同无返回类型不写则编译器自动生成无参构造器写了有参构造器后无参构造器不再自动生成支持this(...)调用同类其他构造器super(...)调用父类构造器必须是第一条语句static 方法属于类而非实例可通过类名直接调用不能访问非静态成员、不能使用this/super不能被重写只能被隐藏不参与多态典型用途工具方法、工厂方法、main 入口final 方法不能被子类重写JVM 可进行内联优化现代 JIT 已能自动判断手动加 final 的性能收益有限abstract 方法只有声明没有实现以;结尾所在类必须是抽象类子类必须实现否则子类也必须是抽象类native 方法由 C/C 等本地语言实现JNI无方法体以;结尾典型System.arraycopy(),Thread.sleep()可变参数 (Varargs)void print(String... args) { } // 本质是 String[] 数组 // 可变参数必须是最后一个参数避免与重载混用导致歧义。9.5.Java 新方法特性演进版本特性说明8Lambda / 方法引用list.forEach(System.out::println)函数式编程8default 方法接口中可提供默认实现解决接口演化问题9private 接口方法接口中抽取私有辅助方法避免 default 方法代码重复16Record 紧凑构造器自动生成全参构造器/getter/equals/hashCode/toString21未命名变量_void process(int _, String name)忽略不需要的参数9.6.实战避坑清单#陷阱正确做法1重写时签名不一致变成重载始终加Override注解2父类构造器带参子类忘记 super()显式调用super(args)3static 方法中用 thisstatic 方法无 this 上下文4可变参数传 nullmethod(null)可能匹配歧义明确传new Type[]{}5方法过长 (50行)拆分为多个职责单一的私有方法6参数过多 (4个)封装为参数对象或使用 Builder 模式7在构造器中调用可重写方法子类字段尚未初始化导致 NPE 或逻辑错误8用 boolean 参数控制行为process(true)可读性差改用枚举或策略模式9.7.方法设计原则速查单一职责一个方法只做一件事最小权限能用 private 就不用 protected能用 protected 就不用 public防御性编程公开方法校验参数Objects.requireNonNull()私有方法可用断言命名即文档calculateTotalPrice()优于calc()isValid()优于check()避免副作用查询方法不应修改状态修改方法应有明确命名如set/add/remove