Java常考十道面试题 1. Java 的三大特性是什么请分别说明。答案1. 封装Encapsulation定义隐藏对象内部实现细节通过private限制访问提供getter/setter等公共方法交互作用降低耦合、提高安全性、便于维护示例实体类的属性封装2. 继承Inheritance定义子类通过extends继承父类非私有属性和方法实现代码复用特点Java 只支持单继承避免菱形依赖可通过接口间接实现多继承作用代码复用、扩展功能3. 多态Polymorphism定义同一行为的不同表现形式核心方法重写子类覆写父类方法和向上转型父类引用指向子类对象示例List list new ArrayList()调用list.add()时实际执行 ArrayList 的实现作用提高代码灵活性和可扩展性2. String、StringBuffer、StringBuilder 的区别是什么答案特性StringStringBufferStringBuilder可变性不可变final 修饰字符数组可变数组扩容可变数组扩容线程安全安全无修改操作安全方法加synchronized不安全无锁效率最低修改会创建新对象中等最高适用场景少量字符串操作多线程环境字符串拼接单线程环境字符串拼接核心区别String不可变对象每次修改都会创建新对象适合常量定义StringBuffer线程安全的可变字符串适合多线程环境StringBuilder非线程安全的可变字符串效率最高适合单线程环境3. JVM 内存模型包含哪些主要分区各有什么作用答案JVM 内存模型JMM定义了线程如何通过内存交互解决多线程可见性、原子性、有序性问题。核心分区程序计数器Program Counter线程私有记录当前线程执行的字节码行号无 OOM 可能虚拟机栈JVM Stack线程私有存储方法调用的栈帧局部变量、操作数栈等栈深度溢出抛StackOverflowError扩容失败抛OutOfMemoryError本地方法栈Native Method Stack线程私有为 Native 方法如System.currentTimeMillis()提供内存支持可能抛StackOverflowError/OOM堆Heap线程共享存储对象实例和数组GC 主要区域分年轻代、老年代OOM 高频发生区方法区Method Area线程共享存储类信息、常量、静态变量等JDK 8 后用元空间Metaspace实现占用本地内存默认无上限4. 什么是 GC垃圾回收常见 GC 算法和收集器有哪些答案GC 定义自动回收堆中不可达对象无引用指向的对象的内存避免内存泄漏无需手动释放。核心算法标记-清除Mark-Sweep先标记垃圾再清除缺点效率低、会产生内存碎片复制算法Copying将内存分为两块存活对象复制到另一块清除原块优点无碎片、效率高适用年轻代默认使用标记-整理Mark-Compact标记后将存活对象向一端移动再清除剩余区域适用老年代默认使用常见收集器年轻代SerialGC串行单线程Parallel Scavenge并行注重吞吐量老年代Serial Old串行Parallel Old并行CMS并发注重响应时间G1区域分代兼顾吞吐量和响应时间5. Java 中实现多线程的三种方式及区别是什么答案方式 1继承 Thread 类class MyThread extends Thread { Override public void run() { // 线程执行代码 } } // 启动new MyThread().start();缺点单继承限制无法继承其他类方式 2实现 Runnable 接口class MyRunnable implements Runnable { Override public void run() { // 线程执行代码 } } // 启动new Thread(new MyRunnable()).start();优点无继承限制可实现多个接口缺点无法直接获取返回值方式 3实现 Callable 接口class MyCallable implements CallableString { Override public String call() throws Exception { // 线程执行代码可返回值 return result; } } // 启动FutureTaskString task new FutureTask(new MyCallable()); // new Thread(task).start();优点支持返回值和异常处理适合异步任务缺点代码稍复杂6. 什么是线程安全如何保证线程安全答案线程安全定义多线程并发访问共享资源时不会出现数据错乱、死锁等问题比如多线程抢票不会出现超卖、重复售票。实现方式锁机制synchronized关键字可修饰方法/代码块底层是监视器锁ReentrantLock类锁支持公平锁/非公平锁、可中断无锁机制volatile修饰变量保证可见性和有序性不保证原子性原子类AtomicInteger基于 CAS 实现原子操作线程封闭局部变量线程私有无共享ThreadLocal每个线程独立存储副本避免共享并发容器ConcurrentHashMap分段锁/CAS 实现线程安全CopyOnWriteArrayList写时复制读无锁7. HashMap 和 ConcurrentHashMap 的区别是什么JDK 8答案特性HashMapConcurrentHashMap线程安全不安全安全CAS synchronizednull 键/值允许不允许 null 键允许 null 值迭代器Fail-FastWeakly Consistent锁粒度无锁桶级别锁JDK 8性能单线程性能高并发性能高ConcurrentHashMap JDK 8 改进JDK 7分段锁Segment默认 16 个段JDK 8CAS synchronized锁粒度更细桶级别结构数组 链表 红黑树链表长度 8 转为红黑树8. 和 equals 的区别是什么答案 运算符基本数据类型比较值是否相同引用数据类型比较引用地址是否相同equals 方法默认实现与相同比较引用地址重写后比较对象内容如 String、Integer 等类重写了 equals示例String x string; String y string; String z new String(string); System.out.println(x y); // true同一引用 System.out.println(x z); // false不同引用 System.out.println(x.equals(y)); // true内容相同 System.out.println(x.equals(z)); // true内容相同注意事项null值不能调用equals()方法否则会抛出空指针异常重写equals()必须重写hashCode()9. int 和 Integer 的区别是什么答案特性intInteger类型基本数据类型包装类引用类型存储位置栈内存堆内存默认值0null是否可为 null否是泛型支持不支持支持方法无提供丰富方法如 parseInt、toString装箱与拆箱装箱Integer a 10;自动将 int 转换为 Integer拆箱int b a;自动将 Integer 转换为 int缓存机制Integer 缓存了 -128 到 127 的值在这个范围内使用比较返回 true。10. ArrayList 和 LinkedList 的区别是什么答案特性ArrayListLinkedList底层实现动态数组双向链表随机访问O(1)效率高O(n)效率低插入/删除需要移动元素效率较低只需修改指针效率高内存占用初始容量 10扩容 1.5 倍每个元素存储前驱后继指针线程安全不安全不安全适用场景ArrayList适合增删操作较少、查询操作较多的场景LinkedList适合查询操作较少、增删操作较多的场景扩容机制ArrayList初始容量为 10扩容为原来的 1.5 倍LinkedList无需扩容动态添加节点