Java面试精华:对象创建、数据结构及JVM深入解析

需积分: 0 3 下载量 174 浏览量 更新于2024-08-04 收藏 10KB MD 举报
--- **1. Java对象的创建过程** 在Java中,对象的创建涉及以下几个步骤: - **类加载检查**:遇到`new`指令时,首先检查类是否已被加载、解析并初始化。若未完成,会触发类加载过程。 - **内存分配**:类加载通过后,虚拟机为对象分配内存,可能使用指针碰撞或空闲列表,取决于Java堆内存状态。线程安全由CAS(Compare and Swap)配合失败重试机制或TLAB(Thread Local Allocation Buffer)技术实现。 - **初始化零值**:分配的内存区域被初始化为零值,除了对象头。 **2. LinkedHashMap和PriorityQueue的区别** - **LinkedHashMap** 是一个有序的哈希映射,它维护了一个访问顺序,键值对按照插入顺序或访问顺序排列。主要用途在于需要保持元素插入顺序的场景。 - **PriorityQueue** 是基于优先队列实现的,存储的是具有自然顺序或者自定义比较器的对象。它按照优先级对元素进行排序,取出的总是具有最高优先级的元素。 **3. ThreadPoolExecutor饱和策略** ThreadPoolExecutor的饱和策略主要有以下几种: - **AbortPolicy**:当线程池饱和时,新任务会被拒绝并抛出RejectedExecutionException异常。 - **CallerRunsPolicy**:新任务直接在调用者线程中运行,直到线程池不再饱和。 - **DiscardOldestPolicy**:丢弃队列中最旧的任务(FIFO),然后尝试执行新的任务。 - **DiscardPolicy**:简单地丢弃新任务,不进行任何处理。 **4. 可达性分析** 可达性分析是JVM垃圾回收的一部分,用于确定对象是否还被其他对象引用,从而确定其是否可以被回收。它是确定弱引用、软引用和phantom reference是否存活的关键过程。 **5. 成员变量与局部变量的区别** - **成员变量**:类的属性,生命周期贯穿整个对象实例,初始化在构造函数中完成,所有方法共享。 - **局部变量**:在方法内部定义,只在该方法执行期间存在,方法结束时自动销毁。 **6. HashMap长度的幂次方** HashMap的长度通常是2的幂次方,这样设计可以提高哈希表的效率,减少哈希冲突的概率。负载因子(载荷系数)会影响扩容,当超过阈值时,会自动调整容量至原容量的两倍。 **7. 类加载器的认识** JVM中的类加载器负责加载类和资源文件,它分为根加载器、扩展加载器、系统加载器和用户自定义加载器。每个类加载器都有自己的命名空间,避免类名冲突。 **8. 线程优先级的理解** 线程优先级表示了线程调度的相对优先级,但不是绝对的执行顺序。高优先级线程可能会被频繁调度,但低优先级线程在系统空闲时也有执行机会。Java提供了一种动态调整线程优先级的方法,但受系统资源限制。 **9. 构造器的重写** 构造器不能被重写(override),但可以通过覆盖(overriding)父类的构造器来提供不同的初始化行为,或者使用super()调用父类的构造器。 **10. 年轻代到年老代的晋升条件** 当对象在年轻代经历了多次Minor GC仍然存活,且年龄达到指定阈值,或者对象大小超过一定阈值(eden区和survivor区无法容纳),就会被晋升到老年代(Old Generation)。