Java面试必备:基础概念与核心技术解析

需积分: 0 0 下载量 159 浏览量 更新于2024-08-29 收藏 143KB PDF 举报
本文主要涵盖了Java基础面试中常见的问题,涉及了面向对象编程、Java虚拟机、关键字static、数据类型、方法重写与重载、构造函数、多态、线程、集合类等多个核心概念。 1. **面向对象编程(OOP)**:OOP是Java的核心特性,它包括封装、多态、继承和抽象四大原则。封装是将数据和操作这些数据的方法捆绑在一起,保护数据不被非法访问;多态允许子类对象能代替父类对象,实现不同对象对同一消息的不同响应;继承则允许创建一个新的类来继承已有类的属性和方法,实现代码复用;抽象则通过抽象类或接口来定义通用行为,但不包含具体实现。 2. **Java虚拟机(JVM)**:JVM是Java运行的平台,它实现了Java的“一次编写,到处运行”的特性。因为Java字节码在任何平台上都能被JVM解释执行,所以Java被称为平台无关。 3. **JDK与JRE的区别**:JDK是Java Development Kit,包含了开发和运行Java程序所需的工具和JRE;JRE是Java Runtime Environment,仅包含运行Java程序所需的基本组件。 4. **static关键字**:static用于声明类变量和静态方法,它们属于类而不是类的实例。Java中,static方法不能被覆盖,因为它们不与对象绑定,而private方法虽然不能被外部类覆盖,但可以在同一个类内被覆盖。 5. **数据类型与自动拆装箱**:Java支持基本数据类型和引用数据类型。自动拆装箱是指在基本类型和其对应的包装类之间自动转换,如int到Integer,节省了手动转换的步骤。 6. **方法覆盖与重载**:覆盖(Overriding)是指子类重写父类中具有相同方法签名的方法;重载(Overloading)是指在同一个类中,方法名相同但参数列表不同的多个方法。 7. **构造函数**:构造函数用于初始化新创建的对象,构造函数重载是指在同一个类中有多个同名但参数列表不同的构造函数。复制构造函数是用于创建一个新对象,其内容与已存在对象完全相同。 8. **多继承与接口**:Java不支持多重继承,但可以通过实现接口来达到类似的效果。接口只包含抽象方法和常量,而抽象类可以有具体方法。 9. **接口与抽象类的区别**:接口是完全抽象的,不能有非静态成员变量;抽象类可以有非抽象方法,且一个类可以实现多个接口,但只能继承一个抽象类。 10. **值传递与引用传递**:Java中所有参数传递都是值传递,但对引用类型来说,传递的是对象的引用副本,而不是对象本身。 11. **线程**:线程是进程内的执行单元,多个线程可以在同一进程中并发执行。线程有新建、就绪、运行、等待和死亡等状态。 12. **线程创建方式**:Java提供通过实现Runnable接口、继承Thread类以及使用ExecutorService创建线程。选择哪种方式取决于需求和设计考虑。 13. **线程状态**:线程的状态包括新建、可运行、运行、阻塞、等待、超时等待和终止。 14. **同步方法与同步代码块**:两者都是用于线程同步,防止数据竞争。同步方法通过`synchronized`修饰符,同步代码块则通过`synchronized`关键字加括号指定同步范围。 15. **监视器同步**:监视器基于对象的锁机制,一个线程进入同步代码块后,其他试图进入的线程会被阻塞,直到获得锁。 16. **死锁**:当两个或更多线程相互等待对方释放资源导致无法继续执行时,发生死锁。 17. **避免死锁**:通常通过资源预分配、避免循环等待和设置超时策略等方式来预防。 18. **集合类**:Java集合框架包括接口如List、Set、Map,以及实现这些接口的类如ArrayList、HashSet、HashMap等。 19. **Cloneable和Serializable接口**:Cloneable接口表示对象可以被克隆,Serializable接口表示对象可以被序列化存储或网络传输。 20. **迭代器**:迭代器是遍历集合元素的接口,提供了next()和hasNext()方法。 21. **Iterator与ListIterator**:Iterator用于遍历任何集合,而ListIterator专用于List,支持双向遍历和修改元素。 22. **fail-fast与fail-safe**:fail-fast迭代器在检测到并发修改时抛出异常,而fail-safe迭代器如CopyOnWriteArrayList在并发修改时不会抛出异常,但可能返回旧数据。 23. **HashMap**:HashMap基于哈希表实现,提供O(1)的平均查找和插入时间复杂度。 24. **hashCode()与equals()**:这两个方法对于散列结构(如HashMap)的正确运作至关重要,hashCode()用于计算对象的哈希码,equals()用于比较两个对象是否相等。 25. **HashMap与Hashtable**:HashMap允许空键值对,是非同步的,而Hashtable不允许空键值对,是线程安全的。 26. **数组与ArrayList**:数组是固定大小的,访问速度快;ArrayList是动态数组,提供了更多的操作方法,但访问速度相对较慢,适合频繁添加删除元素。 27. **ArrayList与LinkedList**:ArrayList基于数组实现,适合随机访问;LinkedList基于链表,插入删除效率高,但随机访问效率低。 28. **Comparable与Comparator**:Comparable用于实现对象的自然排序,Comparator用于自定义排序规则。 29. **PriorityQueue**:优先级队列按照优先级顺序(默认最小堆)进行元素的插入和移除。 30. **大O表示法**:大O表示法用于描述算法的时间复杂度,表示算法运行时间与输入数据规模的增长关系。 以上内容涵盖了Java基础面试中的常见问题,帮助理解Java的基础概念和核心机制。