### Java经典面试题知识点梳理 #### J2SE基础 1. **九种基本数据类型的大小,及其封装类**: - Java提供了八种基本数据类型(`byte`, `short`, `int`, `long`, `float`, `double`, `boolean`, `char`),每种类型都对应一个封装类。例如,`byte` 的封装类为 `Byte`,`int` 的封装类为 `Integer`。了解这些类型的基本属性和它们的包装类如何工作,对于理解自动装箱和拆箱至关重要。 2. **`switch` 能否用 `String` 做参数?**: - 自 Java 7 开始,`switch` 语句支持 `String` 类型作为其条件表达式的一部分。这使得在字符串匹配时更加灵活和易于阅读。 3. **`equals` 与 `==` 的区别**: - `==` 比较的是两个对象的引用是否相同,即它们是否指向内存中的同一位置。 - `equals` 方法用于比较两个对象的内容是否相等,默认情况下它也是比较引用,但许多类(如 `String`)重写了此方法以比较实际内容。 4. **`Object` 类的公共方法**: - `toString()`:返回对象的字符串表示形式。 - `equals(Object obj)`:测试该对象是否等于指定的对象。 - `hashCode()`:返回对象的哈希码值。 - `getClass()`:返回对象的类。 - `clone()`:创建并返回该对象的一个副本。 - `notify()` 和 `notifyAll()`:唤醒正在等待此对象监视器的线程。 - `wait()`:导致当前线程等待这个对象的监视器。 - `finalize()`:垃圾回收前调用,可以用来释放资源或执行清理操作。 5. **Java 的四种引用类型**: - **强引用**:最普通的引用类型,通过对象名直接引用对象。 - **软引用**:当 JVM 认为有必要回收内存之前,即使内存不足也不会被回收。 - **弱引用**:更弱一些的引用类型,在下一次垃圾回收时会被回收。 - **虚引用**:无法通过虚引用来获取对象实例,主要用来跟踪对象被垃圾回收的过程。 6. **`hashcode` 的作用**: - `hashcode` 方法返回对象的哈希值,通常用于 `HashMap` 或其他基于哈希的集合类。它的主要目的是提高查找效率。 7. **`ArrayList`、`LinkedList`、`Vector` 的区别**: - `ArrayList` 和 `Vector` 都是基于数组实现的列表,其中 `Vector` 是线程安全的,而 `ArrayList` 不是。 - `LinkedList` 基于双向链表实现,适用于频繁插入和删除的场景。 8. **`String`、`StringBuffer` 与 `StringBuilder` 的区别**: - `String` 是不可变的字符串类。 - `StringBuffer` 和 `StringBuilder` 都是可变的字符串类,但 `StringBuffer` 是线程安全的,而 `StringBuilder` 不是。 9. **`Map`、`Set`、`List`、`Queue`、`Stack` 的特点与用法**: - `Map` 保存键值对映射。 - `Set` 不允许重复元素。 - `List` 有序集合,可以有重复元素。 - `Queue` 用于保存按照先进先出 (FIFO) 原则排列的元素。 - `Stack` 一种特殊的队列,遵循后进先出 (LIFO) 原则。 10. **`HashMap` 和 `HashTable` 的区别**: - `HashMap` 允许 `null` 键和 `null` 值;`HashTable` 不允许。 - `HashMap` 是非线程安全的;`HashTable` 是线程安全的。 11. **`HashMap` 和 `ConcurrentHashMap` 的区别**: - `ConcurrentHashMap` 是 `HashMap` 的线程安全版本。 - `ConcurrentHashMap` 在 Java 8 中进行了重大改进,引入了更高效的实现策略。 12. **`TreeMap`、`HashMap`、`LinkedHashMap` 的区别**: - `TreeMap` 保持键的自然排序。 - `HashMap` 不保证顺序。 - `LinkedHashMap` 保持插入顺序。 13. **`Collection` 包结构与 `Collections` 包的区别**: - `Collection` 接口定义了一个对象集合。 - `Collections` 是一个工具类,提供了一些静态方法来操作集合。 14. **`try-catch-finally` 语句结构**: - `try` 块中编写可能会抛出异常的代码。 - `catch` 块捕获异常。 - `finally` 块总是被执行,即使发生异常也不例外。 15. **`Exception` 与 `Error` 包结构**: - `Exception` 代表应用程序应该尝试处理的情况。 - `Error` 表示合理的应用程序不应该试图捕获或处理的严重问题。 16. **Java 面向对象的三个特征与含义**: - 封装:隐藏对象内部状态和实现细节。 - 继承:子类继承父类的特性和行为。 - 多态:一个接口具有多种不同的实现方式。 17. **`Override` 与 `Overload` 的含义及区别**: - `Override` 指子类重写父类的方法。 - `Overload` 指在同一类中重载同名方法。 18. **接口与抽象类的区别**: - 接口只能定义常量和抽象方法。 - 抽象类可以定义变量和具体方法。 19. **静态类与非静态类的区别**: - 静态类成员独立于任何特定对象存在。 - 非静态成员依赖于对象实例。 20. **Java 多态的实现原理**: - 通过方法覆盖(重写)和方法重载来实现。 - 在运行时根据对象的实际类型来确定调用哪个方法。 21. **实现多线程的两种方法**: - 继承 `Thread` 类。 - 实现 `Runnable` 接口。 22. **线程同步的方法**: - `synchronized` 关键字。 - `ReentrantLock` 类。 - `Lock` 接口。 23. **锁的等级**: - 方法锁:锁定整个方法。 - 对象锁:锁定特定对象。 - 类锁:锁定整个类的所有实例。 24. **生产者消费者模式**: - 一种经典的多线程问题解决方案,涉及生产者线程和消费者线程。 25. **`ThreadLocal` 的设计理念与作用**: - 提供线程本地变量,避免数据共享带来的竞争条件。 26. **`ThreadPool` 用法与优势**: - 通过线程池管理线程,提高响应速度和资源利用率。 27. **`Concurrent` 包里的其他组件**: - `ArrayBlockingQueue`:阻塞队列。 - `CountDownLatch`:倒计时闭锁。 28. **`wait()` 和 `sleep()` 的区别**: - `wait()` 会释放对象的锁,而 `sleep()` 不会。 - `wait()` 需要在同步上下文中使用,而 `sleep()` 可以在任何地方使用。 29. **`foreach` 与普通 `for` 循环效率对比**: - `foreach` 更简洁,但在某些特定情况下可能不如普通 `for` 循环高效。 30. **Java I/O 与 NIO**: - Java I/O(Java IO):传统的字节流和字符流。 - Java NIO(New IO):引入了缓冲区和通道的概念,提高了性能。 31. **反射的作用与原理**: - 反射允许在运行时检查和修改类、字段和方法。 - 原理涉及到使用 `Class` 对象和相关的 API。 32. **泛型常用特点**: - 泛型提供编译时类型安全,避免运行时错误。 - `List<String>` 不能转换为 `List<Object>`,因为类型参数是不可协变的。 33. **解析 XML 的几种方式**: - DOM:将整个文档加载到内存中。 - SAX:事件驱动模型,逐个解析文档。 - PULL:简化版的 SAX,便于理解和使用。 34. **Java 与 C++ 对比**: - Java 是完全的面向对象语言。 - C++ 支持面向对象和过程式编程。 35. **Java 1.7 与 1.8 新特性**: - Java 1.8 引入了 Lambda 表达式和 Streams API。 - Java 1.7 主要是对并发库的改进。 36. **设计模式**: - 单例模式:确保一个类只有一个实例。 - 工厂模式:提供创建对象的接口。 - 适配器模式:使不兼容的接口能够协同工作。 - 责任链模式:传递请求直到被处理。 - 观察者模式:对象之间的一对多依赖关系。 37. **JNI 的使用**: - Java Native Interface:允许 Java 代码调用本地应用程序或库。 #### JVM 1. **内存模型以及分区**: - Java 堆:存储所有对象实例。 - 方法区:存储类的信息、常量、静态变量等。 - 虚拟机栈:每个线程拥有一个栈,存储局部变量等。 - 本地方法栈:与虚拟机栈相似,用于本地方法调用。 - 程序计数器:线程私有的,记录当前线程所执行的字节码指令地址。 2. **堆里面的分区**: - Eden:新创建的对象首先分配在这里。 - Survivor:经历了一次或多次垃圾收集的对象移动到这里。 - 老年代:经过多次垃圾收集仍然存活的对象会被移动到这里。 3. **对象创建方法**: - 使用 `new` 关键字创建对象。 - 调用类的构造函数。 - 对象的内存分配、初始化和构造。 4. **GC 的两种判定方法**: - 引用计数:每个对象都有一个引用计数器。 - 引用链:通过可达性分析判断对象是否可回收。 5. **GC 的三种收集方法**: - 标记清除:标记不再使用的对象,然后清除这些对象。 - 标记整理:标记并清除后,将活着的对象压缩到内存的一端。 - 复制算法:将内存分为两块,每次只使用一块。 6. **GC 收集器**: - CMS 收集器:专注于最小化暂停时间。 - G1 收集器:面向服务端应用,目标是最小化 GC 暂停时间。 7. **Minor GC 与 Full GC 分别在什么时候发生?**: - Minor GC 发生在 Eden 区满时。 - Full GC 发生在老年代空间不足时。 8. **几种常用的内存调试工具**: - jmap:显示对象实例的堆转储快照。 - jstack:显示线程的堆栈跟踪。 - jconsole:图形化的监控工具。 9. **类加载的五个过程**: - 加载:读取类的二进制数据。 - 验证:确保加载的类文件符合 Java 语言规范。 - 准备:为静态变量分配内存。 - 解析:将符号引用转换为直接引用。 - 初始化:执行类的初始化方法 `<clinit>()`。 10. **双亲委派模型**: - Bootstrap ClassLoader:加载 Java 运行时核心类库。 - Extension ClassLoader:加载扩展类库。 - Application ClassLoader:加载用户自定义类。 11. **分派:静态分派与动态分派**: - 静态分派:编译时确定方法的调用。 - 动态分派:运行时确定方法的调用。 #### 操作系统 1. **进程和线程的区别**: - 进程是操作系统资源分配的基本单位。 - 线程是进程内的执行实体。 2. **死锁的必要条件**: - 互斥条件:至少有一个资源必须处于非共享模式。 - 请求与保持条件:一个已经获得资源的进程可能请求新的资源。 - 不剥夺条件:进程已获得的资源不会被抢占。 - 循环等待条件:形成一个进程等待链。 3. **Window 内存管理方式**: - 段存储:按逻辑段组织内存。 - 页存储:将内存分割成固定大小的页。 - 段页存储:结合了段存储和页存储的优点。 4. **进程的几种状态**: - 就绪:等待 CPU 时间。 - 执行:占用 CPU。 - 阻塞:等待某一事件完成。 5. **IPC 几种通信方式**: - 管道:允许父子进程之间的通信。 - 消息队列:允许发送消息到接收者。 - 信号量:管理多个进程对共享资源的访问。 - 共享内存:允许多个进程共享同一段内存区域。 - 套接字:允许不同进程间的网络通信。 6. **什么是虚拟内存**: - 虚拟内存是一种技术,它让程序可以使用比实际物理内存更大的地址空间。 7. **虚拟地址、逻辑地址、线性地址、物理地址的区别**: - 虚拟地址:程序看到的地址。 - 逻辑地址:由指令给出的地址。 - 线性地址:处理器产生的地址。 - 物理地址:内存芯片上的实际地址。 #### TCP/IP 1. **OSI 与 TCP/IP 各层的结构与功能**: - OSI 模型包括七层:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。 - TCP/IP 模型包括四层:网络接口层、网际层、传输层和应用层。 2. **TCP 与 UDP 的区别**: - TCP 是面向连接的协议,提供可靠的数据传输服务。 - UDP 是无连接的协议,不保证数据传输的可靠性。 3. **TCP 报文结构**: - 源端口号:标识发送方的端口。 - 目标端口号:标识接收方的端口。 - 序列号:标识数据包中第一个字节的序列号。 - 确认号:期望收到的下一个字节的序列号。 - 数据偏移:指示 TCP 首部长度。 - 控制位:包括 SYN、ACK、FIN 等标志位。 4. **TCP 的三次握手与四次挥手过程**: - 三次握手:客户端发送 SYN,服务器回应 SYN+ACK,客户端确认 ACK。 - 四次挥手:客户端发送 FIN,服务器回应 ACK,服务器发送 FIN,客户端回应 ACK。 5. **TCP 拥塞控制**: - 慢启动:指数增加拥塞窗口大小。 - 拥塞避免:线性增加拥塞窗口大小。 - 快重传:快速恢复拥塞窗口大小。 - 快恢复:减少拥塞窗口大小。 6. **TCP 滑动窗口与回退 N 协议**: - TCP 滑动窗口:控制数据流的速度,避免发送方发送过快。 - 回退 N 协议:当检测到一个帧丢失时,重新发送多个帧。 7. **HTTP 的报文结构**: - 请求行:包括方法、URL 和 HTTP 版本。 - 请求头:包括各种 HTTP 头字段。 - 空行:分隔请求头和请求正文。 - 请求正文:请求的具体内容。 8. **HTTP 的状态码含义**: - 2xx 成功:请求成功。 - 3xx 重定向:需要进一步的操作才能完成请求。 - 4xx 客户端错误:请求包含语法错误或无法完成请求。 - 5xx 服务器错误:服务器未能完成一个显然有效的请求。 9. **HTTP request 的几种类型**: - GET:请求获取资源的信息。 - POST:提交实体到指定的资源。 - PUT:替换指定资源的当前内容。 - DELETE:删除指定资源。 - HEAD:获取资源头部信息。 10. **HTTP 1.1 和 HTTP 1.0 的区别**: - HTTP 1.1 默认启用持久连接。 - HTTP 1.1 引入了管线化,允许客户端在一个连接中发送多个请求。 - HTTP 1.1 支持更多的状态码。 11. **HTTP 如何处理长连接**: - HTTP 1.1 默认启用了持久连接,即默认情况下连接不会立即关闭。 - 通过设置 `Connection: keep-alive` 标头可以明确地保持连接打开状态。
剩余63页未读,继续阅读
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助