已经是fw了所以从零学习
许愿四月一个奇迹
·2025-01-07
1. **自我介绍** 2. **项目一 实现原理** 3. **项目二 实现原理(细致流程)** 4. **Django和SpringBoot的区别:** - MVT —-vs—- MVC - Django 模版引擎 —-vs—- Thymeleaf,JSP, FreeMarker 模板引擎 - **追问:**django可以前后端一起做,spring也可以做前端呀,怎么实现的? **使用 Spring Boot + Thymeleaf** - **Thymeleaf** 是 Spring 支持的服务器端模板引擎,可以直接在 HTML 文件中插入 Java 对象和逻辑。 - **适用场景**:需要简单的 Web 界面,项目不复杂或不需要分离前后端。 示例: ```java @Controller public class HomeController { @GetMapping("/") public String home(Model model) { model.addAttribute("message", "Hello, Spring with Thymeleaf!"); return "home"; // 对应 templates/home.html 文件 } } ``` 5. **Python和Java的区别:** - 解释性语言 —-vs—- 编译性语言 - 需要解释器 —-vs—- 编译成字节码后在jvm中运行 - 开源社区活跃,第三方库包多 —-vs—- 企业级支持 - **追问:**为什么Python运行要比 Java慢? 语言设计、实现方式,性能优化机制 --- ### 1. **编译型语言 vs. 解释型语言** - **Java**:编译成 **字节码**,运行在 **Java 虚拟机 (JVM)** 上。JVM 使用 **Just-In-Time (JIT) 编译器**,将热点代码动态编译为机器码,从而提升运行速度。 - **Python**:解释执行,通常使用 **CPython** 解释器逐行解释字节码(`.pyc` 文件)。虽然也有一些 JIT 实现(如 PyPy),但主流 CPython 的解释执行效率较低。 --- ### 2. **动态类型 vs. 静态类型** - **Python** 是动态类型语言,变量类型在运行时才确定,每次操作都需要检查类型,影响执行效率。 - **Java** 是静态类型语言,编译时已经确定了变量类型和方法调用,可以生成优化后的字节码。 **影响** - Python 需要更多的时间进行类型检查和方法查找。 - Java 的类型系统和编译优化使得方法调用和内存管理更高效。 --- ### 3. **内存管理** - **Java** 使用现代的垃圾回收器,如 G1 和 ZGC,它们更高效地管理内存分配和释放。 - **Python** 主要使用 **引用计数** 和 **垃圾回收**,引用计数会带来额外的性能开销,尤其是在频繁分配和释放对象时。 --- ### 4. **原生线程 vs. GIL(全局解释器锁)** - **Java** 支持真正的并行线程执行,充分利用多核 CPU。 - **Python(CPython 实现)** 使用 **GIL(Global Interpreter Lock)**,限制了线程级别的并发能力,尤其在多线程程序中限制性能。 --- ### 5. **标准库和底层优化** - **Java** 的核心类库和 JVM 是高度优化的,由企业级需求驱动,适用于高性能应用。 - **Python** 的标准库虽功能强大,但许多模块使用 Python 代码实现,而不是高性能的本地代码。 --- ### **对比总结** | **维度** | **Java** | **Python** | | --- | --- | --- | | **语言类型** | 编译型(字节码 + JIT 编译) | 解释型(CPython),部分实现有 JIT 编译(PyPy) | | **类型系统** | 静态类型,编译时确定 | 动态类型,运行时确定 | | **执行效率** | 高效 | 较慢 | | **并发支持** | 真正的多线程 | GIL 限制并发性能 | | **内存管理** | 高效垃圾回收(G1、ZGC 等) | 引用计数 + 垃圾回收 | --- ### **优化方向** - **Java** 通过 JIT 编译、内联方法、类型擦除和线程优化实现更高效的性能。 - **Python** 的 PyPy 解释器使用 JIT 编译技术,提升了某些场景的执行速度,但仍未普及。 ### **总结** Python 慢的主要原因是解释型执行、动态类型系统、GIL 限制和内存管理机制较为简单,而 Java 依赖于强大的 JVM 和静态编译优化,从而在速度上胜出。 6. **ArrayList和LinkedList的区别:** `ArrayList` 和 `LinkedList` 是 Java 中常用的集合类,它们都实现了 `List` 接口,但在底层实现和性能上有显著的区别。 --- | **特性** | **ArrayList** | **LinkedList** | | --- | --- | --- | | **底层实现** | 基于动态数组实现。 | 基于双向链表实现。 | | **元素访问速度** | 支持随机访问,时间复杂度为 **O(1)**。 | 必须从头或尾部遍历,访问时间复杂度为 **O(n)**。 | | **插入和删除(中间位置)** | 插入或删除元素需要移动后续元素,时间复杂度为 **O(n)**。 | 插入或删除时只需修改指针,时间复杂度为 **O(1)**(需要找到位置)。 | | **插入和删除(头尾位置)** | 尾部插入效率较高(摊销时间复杂度为 **O(1)**),头部删除复杂度 **O(n)**。 | 头部和尾部插入或删除效率为 **O(1)**。 | | **内存使用** | 由于预分配空间,可能会占用额外内存;当容量不足时需要扩容。 | 每个节点有额外的指针存储(前指针和后指针),占用更多内存。 | | **扩容机制** | 容量不足时,扩容为原容量的 **1.5 倍**。 | 无需扩容,节点动态分配。 | | **适用场景** | 适合频繁读取的场景。 | 适合频繁插入和删除的场景,特别是在头部或尾部操作时。 | **什么时候用 ArrayList 和 LinkedList?** - 如果需要**频繁读取**数据,使用 `ArrayList`。 - 如果需要**频繁插入和删除**数据(特别是在中间位置或头尾位置),使用 `LinkedList`。 - **追问:**对于1 → 2 → 3链表,删除节点2,但是2的next并没有赋值为空,这会在后续开发中引发什么问题? 在 Java 中,如果你从链表 `1 -> 2 -> 3` 中删除中间节点 `2`,但**没有显式地将节点 `2` 的 `next` 引用设置为 `null`**,可能存在以下隐患: ### **1. Java 垃圾回收机制中的引用管理** Java 使用**垃圾回收机制(Garbage Collection, GC)**来自动管理内存,回收不再被引用的对象。GC 的工作原理是: - 如果一个对象不再被任何**可达路径**引用,那么它会被认为是不可达对象,并最终被 GC 回收。 ### **当前链表删除后的引用结构** ``` 1 -> 3 // 1 的 next 被设置为 3 2 -> 3 // 2 的 next 仍然指向 3 ``` ### **垃圾回收的条件** 1. **节点 `2`** 的对象如果还有引用链路存在(例如某个变量或其他数据结构仍然持有对它的引用),它不会被垃圾回收。 2. **仅断开从节点 `1` 到节点 `2` 的引用**,不会自动使 `2` 变得不可达,因为 `2.next` 仍指向 `3`,它在内存中保持活动状态。 ### **隐患**: - **内存泄漏**:如果节点 `2` 未被其他引用使用,但仍持有对 `3` 的引用,它将不被 GC 立即回收,造成**内存泄漏**。 - **意外访问错误**:某些操作可能错误地访问未被真正删除的节点 `2`。 7. **算法题:** - 走台阶,每次可以走1-3级台阶,输入一共n级台阶,那么一共有几种走法? 例子: input:5 output:13
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP