Java高级工程师面试深度解析

需积分: 13 3 下载量 110 浏览量 更新于2024-09-07 收藏 20KB TXT 举报
"Java高级工程师面试题涵盖了基础、线程、数据库、服务器及优化等多个方面,旨在测试候选人的综合技术能力。" 1. **垃圾回收机制** Java的垃圾回收(GC)机制包括新生代与老年代的内存管理。Eden区是新生代的主要区域,当它满时会触发Minor GC,将存活的对象移动到Survivor空间。如果Survivor空间不足以容纳所有存活对象,部分对象会直接晋升到老年代。一般来说,Minor GC比Full GC更频繁,而Full GC会导致较长的暂停时间,因此需要谨慎调整JVM参数以优化性能。 2. **HashMap与HashTable的区别** HashMap是非同步的,适合于高并发场景,初始容量默认为16,负载因子为0.75。当元素数量达到容量的75%时,会进行扩容,扩容时将表的大小翻倍。HashTable则是线程安全的,但其效率相对较低,因为每个操作都是同步的。HashMap允许null键值对,而HashTable不允许。 3. **内存分配与垃圾回收比率** JVM的年轻代和老年代的大小比例通常设置为1:2,以平衡Minor GC和Full GC的发生频率。如果老年代占总内存比例过高,可能会导致频繁的Full GC,这需要通过调整JVM内存参数来优化。 4. **字节流读取** 字节流读取数据时,`read()`方法每次返回1个字节。如果读取的是ASCII字符,每个字符只需8位。但如果读取的是Unicode字符,每个字符可能需要16位(即两个字节)。在读取过程中,不足的字节会被填充为0,因此读取一个Unicode字符时,可能会返回包含8位0的字节序列。 5. **字符流与字节流** 字符流(如Reader/Writer)适用于处理字符编码,如UTF-8或GBK,而字节流(如InputStream/OutputStream)处理原始字节数据。ASCII字符可以看作是Unicode的一个子集,因此一个ASCII字符在Unicode编码下也是8位。 6. **线程状态** 线程的状态包括新建、就绪、运行、阻塞和终止。`Thread.sleep()`, `Thread.wait()`, `Thread.join()`都可能导致线程进入阻塞状态,其中`sleep()`和`wait()`会抛出`InterruptedException`,而`join()`在被中断时也会抛出异常。 7. **JVM内存设置** `-Xms`和`-Xmx`分别用于设置JVM的初始堆内存和最大堆内存。合理的设置可以避免因内存溢出导致的程序崩溃。如果初始内存设置过小,程序启动时可能会频繁扩展内存,影响性能。 8. **Redis的数据结构与使用** Redis支持多种数据结构,如字符串、哈希、列表、集合和有序集合。Jedis库提供了操作这些数据结构的方法,如哈希的`hmset`, `hmget`, `hdel`, `hkeys`;列表的`lpush`, `lrange`, `rpush`, `delsort`, `key`;集合的`sadd`, `srem`, `smembers`, `scard`;有序集合的`sadd`, `score`等。Redis还可以通过RDB和AOF两种方式持久化数据,确保数据安全性。在实际应用中,Redis常用于缓存、计数、发布订阅等场景。