Java面试深度解析:百度面试常见问题

需积分: 5 0 下载量 175 浏览量 更新于2024-08-03 收藏 1KB MD 举报
"Java面试题集锦,涵盖了Java并发、垃圾回收、数据库、网络协议、设计模式等多个领域的核心知识点,适合准备Java相关面试者参考学习。" 以下是对这些面试题涉及知识点的详细解释: 1. **synchrnoized和ReentrantLock的底层实现**:synchronized基于Java内置机制,依赖于Monitor(监视器锁);ReentrantLock是Java并发包中的锁,底层采用 CAS(Compare and Swap)操作和AQS(AbstractQueuedSynchronizer)。 2. **锁的四种状态及升级过程**:从无锁(Lock-Free)、偏向锁(Bias Lock)、轻量级锁(Lightweight Lock)到重量级锁(Mutex Lock),锁的状态随着竞争程度逐步升级。 3. **CMS(Concurrent Mark Sweep)和G1(Garbage-First)**:CMS是一种低暂停时间的垃圾收集器,而G1是一种并行、分代、区域化的垃圾收集器,目标是实现可预测的停顿时间。 4. **G1何时触发Full GC**:当老年代空间不足或者Young GC后晋升到老年代的对象大小超过历次Young GC平均晋升大小的1.5倍时,G1可能触发Full GC。 5. **其他线程安全方式**:除CAS、原子类、synchronized、Lock之外,还有volatile、ThreadLocal、AtomicReference等。 6. **HashMap与Hashtable**:HashMap允许null键值,不保证线程安全;Hashtable不允许null键值,是线程安全的。 7. **允许null键的map**:除HashMap外,还有LinkedHashMap、WeakHashMap等。 8. **HashMap扩容原因**:HashMap扩容是为了保持负载因子(默认0.75)以避免过多的哈希冲突,当元素数量达到容量的75%时,会进行扩容至原来两倍大小。 9. **红黑树插入时间复杂度**:红黑树插入操作的时间复杂度为O(logn)。 10. **解决哈希冲突的方法**:开放寻址法、链地址法、再哈希法、建立公共溢出区等。 11. **大数据排序**:面对1T数据但只有1G内存的情况,可以使用外部排序,如归并排序或MapReduce。 12. **Tomcat类加载器**:Tomcat自定义类加载器以实现Web应用的隔离,防止不同应用之间的类冲突。 13. **TCP握手挥手**:TCP连接的建立需要三次握手(SYN-SYN/ACK-ACK),断开连接需要四次挥手(FIN-ACK-FIN-ACK)。 14. **MySQL隔离级别**:包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)、串行化(SERIALIZABLE)。 15. **B树与B+树**:B树每个节点可以有多个子节点,所有键都在叶子节点;B+树所有数据都存储在叶子节点,非叶子节点只作为索引。 16. **设计模式与JDK源码**:如单例模式(Singleton)在`java.lang.Runtime`,工厂模式在`java.util.Calendar`,观察者模式(Observer)在`java.util.EventObject`等。 17. **Java运行时数据区**:包括程序计数器、虚拟机栈、本地方法栈、堆、方法区(Java 8后变为元空间)。 18. **垃圾回收算法**:主要有标记-清除、复制、标记-整理、分代收集等。 19. **吞吐量优先与响应时间优先的垃圾收集器**:吞吐量优先通常指Parallel Scavenge + Parallel Old组合,响应时间优先则常用G1或ZGC。 20. **类加载全过程**:加载、验证、准备、解析、初始化。 21. **线程池7个参数**:corePoolSize(核心线程数)、maximumPoolSize(最大线程数)、keepAliveTime(空闲线程存活时间)、workQueue(工作队列)、threadFactory(线程工厂)、handler(拒绝策略)、poolSize(当前线程池大小)。 22. **CAS ABA问题**:ABA问题是指在乐观锁中,一个值从A变到B再变回A,CAS无法检测到这个变化。解决方案可以使用版本号或原子引用。 23. **Java内存模型**:描述了线程如何访问和修改主内存以及线程工作内存中的数据,确保多线程环境下的可见性、原子性和有序性。 24. **有界与无界阻塞队列**:有界队列限制了最大容量,当队列满时,生产者会被阻塞;无界队列没有容量限制,不会阻塞生产者。 25. **Session与Cookie的区别**:Session存储在服务器端,Cookie存储在客户端。Session用于跟踪用户会话,Cookie常用于存储用户偏好设置等非敏感信息。 26. **反射**:Java反射机制允许程序在运行时动态获取类的信息并调用其方法,但过度使用会增加系统开销,影响性能。 27. **AQS(AbstractQueuedSynchronizer)**:它是Java并发包中的抽象类,提供了线程同步的基本框架,如ReentrantLock、Semaphore等都基于它实现。 28. **JUC(Java Util Concurrency)包中的同步组件与AQS**:许多组件如ReentrantLock、CountDownLatch、Semaphore、CyclicBarrier等都实现了AQS的acquire和release方法来管理共享资源的访问。