资讯动态

Java面试基础知识点

发布时间:2026/8/15 10:00:25 来源:尧图企业网站定制
Java面试基础知识点第一章 Java核心基础语法1.1 基本数据类型与包装类1.1.1 8种基本数据类型1.1.2 自动装箱与拆箱自动装箱Autoboxing编译器自动将基本类型转换为对应的包装类对象。自动拆箱Unboxing编译器自动将包装类对象转换为基本类型。// 自动装箱编译器会调用 Integer.valueOf(100)Integera100;// 自动拆箱编译器会调用 a.intValue()intba;// 实际编译后等价于IntegeraInteger.valueOf(100);intba.intValue();1.1.3 Integer缓存机制高频面试题Integer 内部维护了一个 IntegerCache 缓存数组默认缓存范围是 -128 ~ 127。当调用 Integer.valueOf() 或自动装箱时会先检查缓存如果值在范围内则直接返回缓存对象否则 new 一个新对象。// 源码JDK 8// 源码JDK 8publicstaticIntegervalueOf(inti){if(iIntegerCache.lowiIntegerCache.high)returnIntegerCache.cache[i(-IntegerCache.low)];returnnewInteger(i);}// 面试常见陷阱题Integera100,b100;System.out.println(ab);// true — 在缓存范围内同一对象Integerc200,d200;System.out.println(cd);// false — 超出缓存不同对象IntegerenewInteger(100);IntegerfnewInteger(100);System.out.println(ef);// false — new 一定创建新对象// 可通过JVM参数调整缓存上限// -Djava.lang.Integer.IntegerCache.high500面试技巧回答时要说清楚三点① 缓存范围默认 -128~127 ② valueOf() 方法会先查缓存 ③ new Integer() 不经过缓存一定创建新对象。1.2 String / StringBuilder / StringBuffer1.2.1String / StringBuilder / StringBuffer的区别1.2.2 String不可变的原因与好处●安全性String 被广泛用作参数如网络连接、文件路径不可变防止被篡改●字符串常量池不可变使得同一个字符串可以被多个引用共享节省内存●HashMap的key不可变保证了 hashCode 不变如果 String 可变放入 HashMap 后修改会导致数据丢失●线程安全不可变对象天然是线程安全的不需要同步// JDK 8 底层实现final char[] valuepublicfinalclassString{privatefinalcharvalue[];// final修饰不可变}// JDK 9 底层实现final byte[] value coder 标识编码// 优化Latin1字符用1字节中文用2字节节省空间publicfinalclassString{privatefinalbyte[]value;// JDK9改用byte[]privatefinalbytecoder;// LATIN10, UTF161}1.2.3 字符串常量池字符串常量池String Pool是 JVM 在堆中开辟的一块区域JDK7从方法区移到堆用于存储字符串字面量实现字符串的复用。Strings1hello;// 字面量放入常量池Strings2hello;// 从常量池取出同一个对象s1 s2 为 trueStrings3newString(hello);// 在堆中创建新对象s1 ! s3Strings4s3.intern();// intern() 返回常量池中的引用s1 s4 为 true// 重要JDK7 intern() 如果常量池没有会在常量池记录堆中对象的引用而非复制Strings5newStringBuilder(ja).append(va).toString();System.out.println(s5.intern()s5);// trueJDK71.2.4 String拼接的性能差异// ❌ 反例每次循环创建新的String对象产生大量垃圾Stringresult;for(inti0;i10000;i){resulti;// 等价于 result new StringBuilder(result).append(i).toString();}// ✅ 正例使用StringBuilder只创建一个对象StringBuildersbnewStringBuilder();for(inti0;i10000;i){sb.append(i);}Stringresultsb.toString();// 编译优化单个表达式的拼接会自动优化为StringBuilderStringsabc;// 编译器优化 → abc1.3 面向对象封装、继承、多态1.3.1 封装Encapsulation封装是将对象的属性和行为包装在一起通过访问修饰符隐藏内部实现细节只暴露必要的接口。publicclassBankAccount{privatedoublebalance;// 私有属性外部不能直接访问// 通过公有方法控制访问可以加入业务逻辑校验publicdoublegetBalance(){returnbalance;}publicvoiddeposit(doubleamount){if(amount0)thrownewIllegalArgumentException(金额必须大于0);balanceamount;}publicvoidwithdraw(doubleamount){if(amountbalance)thrownewIllegalArgumentException(余额不足);balance-amount;}1.3.2 继承Inheritance继承是子类获得父类的属性和方法实现代码复用。Java 只支持单继承一个类只能有一个直接父类但支持多重实现实现多个接口。// 父类classAnimal{protectedStringname;publicvoideat(){System.out.println(name is eating);}}// 子类继承父类classDogextendsAnimal{publicvoidbark(){System.out.println(name is barking);}Overridepublicvoideat(){// 方法重写System.out.println(Dog name is eating);}}// super 关键字classPuppyextendsDog{publicvoidshow(){super.eat();// 调用父类方法}}1.3.3 多态Polymorphism—— 核心重点多态是指同一个行为具有多个不同表现形态。Java中多态分为两种编译时多态静态绑定——方法重载Overload同一个类中方法名相同参数列表不同类型、数量、顺序返回值可以不同但不能仅靠返回值区分。classCalculator{publicintadd(inta,intb){returnab;}publicdoubleadd(doublea,doubleb){returnab;}// 参数类型不同publicintadd(inta,intb,intc){returnabc;}// 参数个数不同}运行时多态动态绑定——方法重写Override子类重写父类方法父类引用指向子类对象实际调用的是子类的方法。这是面试考察的重点。classAnimal{publicvoidsound(){System.out.println(Animal sound);}}classCatextendsAnimal{Overridepublicvoidsound(){System.out.println(Meow);}}classDogextendsAnimal{Overridepublicvoidsound(){System.out.println(Woof);}}// 多态体现父类引用指向子类对象Animala1newCat();Animala2newDog();a1.sound();// 输出 Meow — 运行时确定调用Cat的方法a2.sound();// 输出 Woof — 运行时确定调用Dog的方法// 多态的实际应用工厂模式、策略模式、依赖注入等

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价