【Java面试题】Java集合: Java集合框架是Java程序员必须掌握的重要内容,它包括List、Set、Map等接口以及ArrayList、LinkedList、HashMap等具体实现。面试中常常考察这些概念的区别和特性。 1. ArrayList和Vector的主要区别在于线程安全和性能。ArrayList是非线程安全的,但插入和删除操作更快;而Vector是线程安全的,但在多线程环境下性能较好,但整体速度较慢。 2. ArrayList、Vector和LinkedList都是List接口的实现,ArrayList适合随机访问,性能好,而LinkedList适合于顺序访问和插入删除,因为它基于链表结构。 3. 快速失败(fail-fast)是指当集合在迭代过程中被修改时,迭代器会立即抛出`ConcurrentModificationException`;安全失败(fail-safe)的集合如CopyOnWriteArrayList,即使在遍历过程中修改集合,也不会抛异常,而是返回修改前的状态。 4. HashMap的数据结构基于哈希表,由数组+链表/红黑树组成,用于快速查找元素。 5. HashMap的工作原理是通过键的哈希值计算数组索引,然后将键值对存储在对应位置,若出现哈希冲突,则通过链表或红黑树解决。 6. 当HashMap的负载因子(load factor)达到阈值(默认0.75)时,会进行扩容,新的容量通常是原容量的2倍。 7. List的特点是可以保持元素的顺序,允许重复元素;Map则将键和值成对存储,不允许键重复;Set不允许元素重复,且无特定顺序。 8. Set中的元素不重复是通过equals()方法判断的,而不是==,因为==比较的是对象的引用,而equals()比较的是对象的内容。 9. 两个对象值相同(x.equals(y) == true),但可以有不同的hash code,这是可能的,因为不同的对象可能具有相同的属性值,但哈希码不一定相同。 10. Heap是Java内存模型的一部分,主要用于存放新生代的对象;Stack则用于执行方法调用,每个线程都有自己的独立栈。 【JVM与调优】: 1. Java类加载过程包括加载、验证、准备、解析和初始化五个阶段。 2. JVM加载Class文件主要通过类加载器完成,将字节码转化为运行时的数据结构。 3. Java内存分为堆内存、栈内存和方法区,其中堆是对象的主战场,栈是方法的执行上下文。 4. GC(Garbage Collector)负责回收不再使用的对象所占用的内存,以防止内存泄漏。 5. 垃圾回收机制通过可达性分析等算法判断对象是否存活,主要有引用计数法和可达性分析法。 6. 垃圾回收器可以自动回收内存,但无法立即回收。System.gc()和Runtime.gc()会触发全局垃圾回收,但不建议频繁使用,可能导致性能下降。 【并发编程】: 1. Synchronized是Java内置的锁机制,保证了代码的互斥执行,具有可重入性。 2. JVM对原生锁进行了很多优化,如自旋锁、适应性自旋锁、锁消除、锁粗化等,提高并发性能。 3. Synchronized是非公平锁,即线程获取锁的顺序不是完全按照等待时间,可能存在饥饿现象。 4. AQS(AbstractQueuedSynchronizer)是JDK提供的一个用于构建锁和其他同步组件的基础框架。 对比Synchronized和ReentrantLock: - Synchronized是内置的,ReentrantLock是API级别的,后者提供了更丰富的控制。 - ReentrantLock可以实现公平锁,而Synchronized只能是非公平的。 - ReentrantLock提供了tryLock方法,可以尝试获取锁而不阻塞。 - ReentrantLock支持更细粒度的锁,如读写锁(ReadWriteLock)。 Java并发工具还包括Semaphore(信号量)、CountDownLatch(倒计时器)、CyclicBarrier(循环屏障)等,用于协调多个线程间的操作。在面试中,对这些工具的理解和使用也是常考内容。
- 粉丝: 2
- 资源: 74
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助