JAVA SE重点数据类型部分8种基本类型byte, char, short, int, long, float, double, boolean。要记住它们的默认值和取值范围比如char的默认值是\u0000boolean默认是false。引用类型String、数组、接口、类、枚举等。整形提升这是常考的坑点比如byte a 10; byte b 20; byte c a b;会报错因为ab会自动提升为int类型需要强转(byte)(ab)。布尔类型转换任何类型和布尔类型都不能相互转换这点要特别注意。常量final修饰的变量是常量只能赋值一次不能被修改。字面值是直接写出来的常量比如5,hello,12.21。运算符是无符号右移没有无符号左移。%是取余/取模注意它的正负号规则与被除数符号一致。逻辑控制switch重点记不能做switch参数的类型long, float, double。循环语句do-while至少执行一次for-each常用于遍历数组或集合面试常问for和for-each的区别for-each更简洁但不能修改元素不能获取索引不能处理非数组/集合对象。命名规则小驼峰命名法首字母小写后面单词首字母大写如maxNum。标识符可以包含数字、字符、下划线、$。JDK 常用命令javac作用Java 编译器用于将.java源文件编译成.class字节码文件。示例javac HelloWorld.java会生成HelloWorld.class文件。java作用Java 虚拟机启动器用于运行已编译的.class文件不需要加.class后缀。示例java HelloWorld会执行HelloWorld类中的main方法。javap -c作用反汇编器用于查看.class文件的字节码指令-c表示只显示反汇编的代码。示例javap -c HelloWorld.class可以查看方法内部的字节码操作常用于底层调试或学习 JVM 指令。✅记忆口诀“编javac跑java反javap -c看字节码。”✅面试常见问题javac和java的区别javac是编译器java是运行时启动器。javap -c有什么用查看类的字节码指令用于分析 JVM 执行过程。一、方法的定义与作用核心作用模块化组织代码实现复用避免重复写相同逻辑。组成要素方法名、参数列表、返回值返回值可以是void表示无返回值。二、方法的调用方式调用位置可以在主函数main中调用其他自定义方法。也可以在其他自定义方法的内部调用方法嵌套调用。调用规则方法名和参数列表必须严格匹配个数、类型都要对应。返回值类型可选如果方法声明有返回值如int调用时需接收如果是void则不能接收返回值。面试常考题重点给定两个数字写一个方法交换它们的值。❗ 陷阱Java是值传递如果直接传基本类型变量如int a, int b方法内交换不会影响外部变量。✅ 正确做法传对象如数组、自定义类或使用数组包装。示例代码void swap(int[] arr) { int temp arr[0]; arr[0] arr[1]; arr[1] temp; } // 调用swap(new int[]{a, b});三、方法的重载Overloading——面试高频考点定义在同一个类中方法名相同参数列表不同参数个数不同 / 参数类型不同 / 参数顺序不同返回值类型无关。示例void sum(int); // 重载11个int参数 int sum(int, int); // 重载22个int参数 int sum(double, double); // 重载32个double参数 这三个方法在编译时都能区分不会冲突。构造方法能否重载✅ 可以因为构造方法名固定为类名只要参数列表不同就可以重载。举例Student()、Student(String name)、Student(String name, int age)都是合法重载。易错点仅返回值不同 ≠ 重载编译报错。仅参数名不同 ≠ 重载参数名不影响签名。四、方法的递归Recursion——思维代码双重考验基本思想将大问题拆解为规模更小的同类子问题子问题再继续拆解直到能直接解决。如求阶乘n! n * (n-1)!直到1! 1。核心注意事项必须有终止条件递归出口→ 否则无限递归导致栈溢出StackOverflowError。每次递归必须向终止条件靠近→ 否则死循环。自己调用自己→ 递归的本质是自调用。经典例题斐波那契数列f(n) f(n-1) f(n-2)终止条件f(1)1, f(2)1。汉诺塔问题、二叉树遍历等。 总结面试/笔试必背点知识点关键点方法定义模块化、可复用组成方法名、参数列表、返回值方法调用参数匹配、返回值接收交换实参值需传对象或数组值传递陷阱方法重载同一类中方法名相同 参数列表不同返回值无关构造方法可重载递归拆解问题 终止条件 自身调用防止栈溢出一、数组的定义本质数组是存放一组相同数据类型的集合且在内存中是连续的。默认值简单类型如int、byte未赋值时默认值为0或对应类型的默认值如boolean默认false。引用类型如String、自定义类未赋值时默认值为null。示例int[] arr1 new int[5]; // 5个int的默认值都是0 String[] arr2 new String[3]; // 3个String的默认值都是null二、数组作为方法的参数引用类型传递数组是引用类型传参时传递的是引用地址而非副本。因此方法内修改数组元素会影响原数组。void modify(int[] arr) { arr[0] 100; // 修改原数组的第0个元素 } public static void main(String[] args) { int[] arr {1,2,3}; modify(arr); System.out.println(arr[0]); // 输出100 }可变参数编程int sum(int... a)表示可以传入任意个数的int参数本质是数组。调用时既可以传数组也可以传多个int值。int sum(int... a) { int res 0; for (int num : a) res num; return res; } // 调用sum(1,2,3) 或 sum(new int[]{1,2,3})三、JVM内存划分数组的内存位置JVM运行时内存分为5个区域数组相关的内存分配如下程序计数器记录线程执行的字节码行号与数组无关。Java虚拟机栈存储局部变量、方法调用栈帧。如果数组是局部变量如在方法中定义的数组其引用存在栈中但数组本身在堆中。本地方法栈与本地方法Native Method有关与数组无关。堆存储对象包括数组的实例数组的实际数据在堆中。方法区存储类的元数据、常量池等。如果数组元素是引用类型如String字符串常量可能在方法区的常量池中。四、数组的拷贝方式重点浅拷贝数组拷贝需要注意如果数组元素是引用类型拷贝的是引用浅拷贝即新数组和原数组的元素指向同一个对象。常见拷贝方式for循环手动遍历复制每个元素。clone()Object类的方法数组实现了Cloneable接口可调用arr.clone()。System.arraycopy()底层native方法效率高。int[] src {1,2,3}; int[] dest new int[3]; System.arraycopy(src, 0, dest, 0, 3); // 从src的0位置复制3个元素到dest的0位置Arrays.copyOf()基于System.arraycopy封装支持扩容/缩容。int[] newArr Arrays.copyOf(src, 5); // 复制src并扩容到长度5新元素默认值0五、操作数组的常用工具类java.util.ArraysArrays.toString(arr)将数组转为字符串方便打印默认print(arr)会输出地址用这个方法可读性更好。int[] arr {1,2,3}; System.out.println(Arrays.toString(arr)); // 输出 [1, 2, 3]Arrays.sort(arr)对数组排序升序。如果是自定义类需要实现Comparable接口或传入Comparator。int[] arr {3,1,2}; Arrays.sort(arr); System.out.println(Arrays.toString(arr)); // 输出 [1, 2, 3]六、二维数组内存结构二维数组本质上是“一维数组的每个元素是一个一维数组”。int[][] arr new int[3][]; // 不规则二维数组3行每行长度可不同 arr[0] new int[2]; // 第0行长度2 arr[1] new int[3]; // 第1行长度3 arr[2] new int[1]; // 第2行长度1不规则二维数组允许每行的列数不同即“锯齿状”数组。七、匿名数组定义没有名字的数组通常用于一次性传递数组参数不需要先声明数组变量。示例// 调用方法时直接传匿名数组 int sum sum(new int[]{1,2,3,4});关键易错点总结数组默认值基本类型是0/false等引用类型是null。数组拷贝的浅拷贝如果元素是引用类型拷贝后新数组和原数组的元素共享对象。二维数组的内存先分配“行”的数组再分配每行的数组。可变参数int... a本质是数组只能有一个可变参数且必须在参数列表最后。一、类与对象的基本概念类是模板蓝图定义了对象的属性字段和行为方法。对象是类的实体实例通过new 类名()创建一个类可实例化多个对象。二、类的成员字段、方法、代码块字段属性对象的状态如Person类的name、age。方法行为对象的动作如Person类的eat()、run()。代码块静态代码块用static{}修饰优先执行与静态属性声明顺序有关仅执行一次用于初始化静态资源。实例代码块构造代码块用{}修饰在构造方法前执行用于初始化实例属性可看作构造方法的“公共逻辑”。三、内部类面试高频考点内部类是定义在类内部的类分为4类需重点掌握实例内部类和静态内部类实例内部类非静态内部类定义在类内部无static修饰。特点包含外部类的this引用有额外开销内存占用略高。不能定义静态成员变量除非是static final常量因为常量在编译期确定。面试问题Q实例内部类是否有额外开销A有因为持有外部类的引用。Q实例内部类能否定义静态成员变量A不能除非是static final修饰的常量。静态内部类定义在类内部被static修饰。特点不依赖外部类实例可直接通过外部类名.内部类名访问。不能访问外部类的非静态成员因为静态内部类没有外部类的this引用。面试问题Q静态内部类能否访问外部类的非静态成员A不能。若需访问需传入外部类对象。匿名内部类定义没有名字的内部类是外部类的子类或实现类只能用一次。本质语法糖简化代码如线程、接口回调场景。// 匿名内部类实现Runnable接口 new Thread(new Runnable() { Override public void run() { System.out.println(匿名内部类); } }).start();本地内部类了解定义在方法内部定义的类作用域仅限方法内。四、访问类的属性/方法静态成员用static修饰属于类可通过类名.属性/方法访问无需创建对象。非静态成员实例成员属于对象需通过对象引用.属性/方法访问必须先new对象。五、封装面向对象三大特性之一定义用private修饰属性/方法隐藏内部实现对外提供public的get/set方法访问。优点降低使用者学习成本只需关注“如何使用”无需关注“如何实现”。保护数据安全防止非法修改。面试常考封装的意义、如何实现封装。六、构造方法对象的“出生证明”定义方法名与类名相同无返回值连void都没有。作用实例化对象时为对象分配内存并初始化属性。调用时机new 类名()时自动调用如Person p new Person();调用无参构造。多个构造方法重载若类未显式定义构造方法编译器会默认生成一个无参构造。若显式定义了构造方法编译器不再生成默认无参构造需手动写无参构造否则new Person()会报错。面试常考构造方法的重载、默认构造的生成规则。七、关键字this含义代表当前对象的引用哪个对象调用方法this就指向哪个对象。常见场景区分成员变量和局部变量如this.name name;。构造方法间调用需放在第一行如this(10);调用有参构造。八、toString()方法Object类的方法默认行为Object类的toString()返回格式为类名哈希值如Person123456。重写意义打印对象时输出更有意义的信息如对象的属性值。Override public String toString() { return Person{name name , age age }; }使用直接打印对象引用时如System.out.println(p);会自动调用toString()。九、匿名对象定义没有名字的对象如new Person().eat();。特点只能使用一次因为没有引用指向它GC 会回收。适合临时调用方法简化代码。易错点总结内部类的静态变量实例内部类不能有普通静态变量只能是static final常量。构造方法的重载若显式定义了有参构造默认无参构造会消失需手动添加。静态成员访问静态方法不能直接访问非静态成员因为静态方法属于类此时可能还没有对象。匿名内部类的使用场景仅在需要一次性使用类时使用如线程、接口回调。一、继承extends定义子类派生类通过extends关键字继承父类基类的属性和方法除构造方法外所有构造方法会被显式调用。关键字 super代表父类对象的引用。用法super()调用父类的构造方法必须放在子类构造方法的第一行。super.data调用父类的数据成员。super.fun()调用父类的方法。面试常考thisvssuperthis代表当前对象的引用可区分局部变量和成员变量。super代表父类对象的引用访问父类的成员。区别this()调用本类构造super()调用父类构造this可单独用super不能。继承的优点代码共享子类复用父类代码减少重复。提高重用性父类方法/属性可被多个子类继承。提高可扩展性子类可扩展父类功能。面试问题子类继承了父类的什么答除构造方法显式调用外其他所有成员字段、方法、静态成员等都会被继承。二、多态定义父类引用指向子类对象且子类和父类有同名、同参数列表、同返回值的覆盖方法重写。运行时调用的是子类的方法运行时多态。实现条件向上转型父类引用指向子类对象如Animal a new Cat();。方法重写子类重写父类的方法方法名、参数、返回值相同。代码层次父类引用调用同名方法时子类重写的方法会被执行运行时绑定。多态的好处降低类使用者的成本只需知道对象有某个方法无需关心具体类型。封装的延伸使用者无需了解实现细节只需用方法。面试常考多态的理解答父类引用调用子类重写的方法运行时执行子类逻辑。体现“一个接口多种实现”。向下转型前提先通过instanceof判断如if (a instanceof Cat)否则会报ClassCastException。用途将父类引用转回子类引用访问子类特有方法如Cat c (Cat) a;。三、抽象类abstract定义包含抽象方法没有具体实现的方法用abstract修饰的类。关键字 abstract修饰类表示该类不能被实例化只能被继承。修饰方法表示该方法没有方法体必须由子类重写。特点不能被实例化不能new抽象类。属性可以是public static final常量也可以是普通属性。可以有非抽象方法普通方法提供默认实现。可以被继承子类必须重写所有抽象方法除非子类也是抽象类。最大意义为了被继承强制子类实现抽象方法规范子类行为。面试问题抽象类和接口的区别答抽象类有构造方法、可有非抽象方法、属性无限制、单继承。接口无构造方法、方法默认public abstractJDK8前、属性必须是public static final、多实现。JDK8后接口可含default/static方法但核心区别仍存四、接口interface定义用interface修饰是一种完全抽象的类型JDK8前定义行为规范。特点方法JDK8前方法默认public abstractJDK8后可含default默认方法有实现和static方法。属性必须是public static final常量必须初始化。不能被实例化不能new接口。类通过implements实现接口可多实现如class A implements B, C。意义弥补Java“单继承”的缺陷实现多继承的效果类可实现多个接口。常用接口Comparable用于自定义对象的自然排序实现compareTo方法。Comparator用于定制排序实现compare方法更灵活。Cloneable标记接口实现后可通过clone()复制对象需重写clone()并抛CloneNotSupportedException。五、关键总结面试/笔试必背特性继承extends抽象类abstract接口interface关键字extendsabstractinterface实例化子类可实例化不能实例化不能实例化方法可继承父类方法可含抽象/非抽象方法JDK8前全抽象JDK8后可含default/static属性继承父类属性无限制普通/静态/常量必须是public static final继承/实现单继承类→类单继承类→抽象类多实现类→接口构造方法子类调用父类构造super有构造方法供子类调用无构造方法六、易错点提醒继承时构造方法的调用子类构造方法第一行必须调用super()或隐式调用父类无参构造否则编译错误。多态的前提必须有“继承/实现”“方法重写”“向上转型”。抽象类的继承子类必须重写所有抽象方法除非子类也是抽象类。接口的实现类实现接口时必须实现所有抽象方法JDK8前或实现非默认/非静态方法。向下转型必须先instanceof判断否则抛ClassCastException。一、String字符串本质与常量池类型Java中String是引用类型。常量池JDK1.7字符串常量如hello存放在堆中的常量池相同字符串常量在常量池中只存一份节省内存。示例String str hello; // hello放入常量池 String str2 hello; // 直接从常量池取str str2 为true方法intern()将字符串放入常量池若已存在则直接引用不存在则创建后引用。String s1 new String(hello); String s2 s1.intern(); // s2指向常量池的hellos2 str 为true2. 拼接性能对比面试常考拼接会产生大量临时对象每次都新建StringBuilder再toString性能差。append拼接StringBuilder/StringBuffer的append方法是在原对象上修改无临时对象性能高。线程安全StringBuffer方法加了synchronized线程安全但性能略低。StringBuilder非线程安全单线程下性能更高。选择策略单线程大量拼接 → 用StringBuilder。多线程大量拼接 → 用StringBuffer。少量拼接 → 可用编译器会优化为StringBuilder。面试常考StringvsStringBuffervsStringBuilder维度StringStringBufferStringBuilder可变性不可变可变可变线程安全安全不可变安全synchronized不安全性能拼接差临时对象中等锁开销最高无锁适用场景少量拼接、常量多线程大量拼接单线程大量拼接二、异常Exception概念作用程序异常时按预设逻辑处理让程序尽可能恢复正常并继续执行同时保证代码清晰。体系Throwable顶层类→ErrorExceptionError错误如栈溢出、内存溢出由程序员无法解决只能重启或修改逻辑。Exception异常分为运行时异常RuntimeException非受查异常编译时不检查如NullPointerException、ArrayIndexOutOfBoundsException。编译时异常受查异常编译时必须处理如IOException、SQLException否则编译报错。异常处理关键字try-catch-finallytry包裹可能异常的代码。catch捕获并处理异常可多个catch子类在前父类在后。finally无论是否异常都会执行一般用于释放资源如关闭文件、数据库连接。throws声明异常告诉调用者“我这个方法可能抛异常你自己处理”。throw手动抛出异常如throw new RuntimeException(出错了)。面试问题Qfinally块的作用A一般用于对资源的释放如关闭流、数据库连接确保即使发生异常资源也能被正确释放。finally无论try是否异常都会执行除非JVM退出或System.exit()。Q如何处理异常A两种方式try-catch-finally捕获并处理。throws声明抛出交给调用者处理。Q自定义异常A继承Exception受查异常或RuntimeException非受查异常提供构造方法。class MyException extends Exception { public MyException(String msg) { super(msg); } }关键注意点Error是错误程序无法处理只能修改逻辑。运行时异常如NullPointerException是程序逻辑错误应尽量在编码阶段避免如判空。编译时异常必须处理try-catch或throws否则编译失败。finally中如果有return会覆盖try或catch中的return不建议在finally写return。总结String重点是常量池、intern()、拼接性能对比、三者的区别。异常重点是异常体系、处理关键字try-catch-finally、throws、throw、自定义异常、面试常见问题。