一、在使用tcp时,当接受到一个http请求后,tcp如何处理的

  1. TCP连接建立: 客户端和服务器通过三次握手建立TCP连接。
  2. HTTP请求发送: 客户端发送HTTP请求给服务器,包含请求方法、URL等信息。
  3. 服务器接收请求: 服务器TCP层接收请求数据,传递给应用层。
  4. 应用层处理: 服务器的应用层解析和处理HTTP请求。
  5. 生成HTTP响应: 服务器生成HTTP响应,包括状态码、头部和体。
  6. TCP传输响应: 服务器TCP层将响应数据传输到客户端。
  7. 客户端接收响应: 客户端TCP层接收HTTP响应数据。
  8. 应用层处理响应: 客户端应用层解析和处理HTTP响应。
  9. 断开TCP连接: 客户端和服务器通过四次挥手断开TCP连接。

二、js和ts的区别

JavaScript(JS)和TypeScript(TS)之间的主要区别:

  1. 类型系统:
    • JavaScript: 动态类型语言,运行时确定变量类型。
    • TypeScript: 引入了静态类型,允许在编写代码时定义变量的类型。
  2. 编译:
    • JavaScript: 无需编译,由浏览器解释执行。
    • TypeScript: 需要编译成JavaScript,使用TypeScript编译器(tsc)进行。
  3. 类型注解:
    • JavaScript: 不需要显式声明变量类型。
    • TypeScript: 支持显式的类型注解,提供更强的类型检查。

三、说一下你了解到的加密算法,以及使用加密算法的场景和各加密算法的优缺点

1. 对称加密算法:

  • AES(Advanced Encryption Standard):
    • 场景: 广泛用于文件加密、通信加密等。
    • 优点: 高效、安全。
    • 缺点: 密钥管理可能挑战,需要共享密钥。

2. 非对称加密算法:

  • RSA(Rivest–Shamir–Adleman):
    • 场景: 用于密钥交换、数字签名等。
    • 优点: 安全,可用于密钥分发。
    • 缺点: 较慢,适用于短消息。

3. 哈希函数:

  • SHA-256(Secure Hash Algorithm 256-bit):
    • 场景: 用于数据完整性验证、密码存储等。
    • 优点: 不可逆,相同输入产生相同输出。
    • 缺点: 不适合加密通信,因为不可逆。

4. 椭圆曲线加密(ECC):

  • 场景: 用于密钥交换和数字签名。
  • 优点: 安全性与密钥长度成正比,相对短的密钥长度提供较高的安全性。
  • 缺点: 算法相对复杂,不如RSA广泛支持。

这是一些常见的加密算法,选择取决于具体的使用场景和安全需求。

四、说一下创建线程的方法有哪几种

创建线程的两种主要方法是:

  1. 继承Thread类:
    • 创建一个新的类,继承Thread类。
    • 重写run()方法,包含线程的逻辑。
    • 创建线程对象,调用start()方法启动线程。
  2. 实现Runnable接口:
    • 创建一个新的类,实现Runnable接口。
    • 实现run()方法,定义线程的逻辑。
    • 创建Thread对象,将实现了Runnable接口的对象传递给Thread的构造函数。
    • 调用start()方法启动线程。

推荐使用实现Runnable接口的方式,因为它更灵活,允许一个类同时实现多个接口。这有助于避免Java的单继承限制。

五、Vue2和Vue3的区别是什么

Vue.js 3 相对于 Vue.js 2 的主要区别包括:

  1. 性能优化:
    • Vue.js 3 使用 Proxy 替代 Object.defineProperty,提高了响应式系统的性能。
    • 优化了虚拟 DOM 的算法,减少了不必要的 DOM 操作,提升整体性能。
  2. Composition API:
    • 引入了 Composition API,允许更灵活地组织组件逻辑,提高了代码的可维护性。
  3. 模块化的代码结构:
    • Vue.js 3 将代码拆分成更小的模块,使得代码更易维护和测试。
  4. Teleport 组件:
    • 引入了 Teleport 组件,用于在 DOM 中的其他位置渲染组件的内容。
  5. 更好的 TypeScript 集成:
    • 提供了更好的 TypeScript 支持,提供更好的类型推断。
  6. 自定义渲染器 API:
    • 提供了更灵活的自定义渲染器 API,支持更多渲染目标。
  7. 其他改进和优化:
    • 改进了组件实例初始化的性能。
    • 提供了更好的错误处理和调试体验。
    • 移除了一些不必要的特性和方法。

Vue.js 3 的这些改进使得它更适合构建现代化、高性能的Vue应用。

六、说一下你知道的日志框架

  1. Log4j:
    • 开源日志框架,支持多种输出目标,配置灵活,丰富的日志级别和过滤器。
  2. Logback:
    • Log4j 的继承者,性能更好,支持异步日志记录,适用于高并发环境。
  3. java.util.logging:
    • Java标准库提供的日志框架,与Java平台集成紧密,适用于小型项目和基本日志需求。
  4. Slf4j (Simple Logging Facade for Java):
    • 日志门面,允许应用程序使用不同的日志框架,提供了一致的接口。

七、说一下Map集合的的实现类

常见的Map接口的实现类包括:

  1. HashMap:
    • 基于哈希表,提供快速查找。
    • 不保证顺序,允许null键和值。
  2. TreeMap:
    • 基于红黑树,提供有序键值对。
    • 不允许null键。
  3. LinkedHashMap:
    • 基于哈希表,保持插入顺序或最近访问顺序。
    • 允许null键和值。
  4. HashTable:
    • 早期实现,线程安全但性能较差。
    • 不允许null键和值,大多数情况下被ConcurrentHashMap替代。
  5. ConcurrentHashMap:
    • 线程安全,使用分段锁提供高并发性能。
    • 不允许null键和值。

八、说一下各个实现类的区别

  • HashMap:
    • 特点: 基于哈希表实现,快速查找。
    • 顺序: 不保证顺序,允许null键和值。
  • TreeMap:
    • 特点: 基于红黑树实现,提供有序键值对。
    • 顺序: 按键的自然顺序或自定义顺序排序,不允许null键。
  • LinkedHashMap:
    • 特点: 基于哈希表,保持插入或访问顺序。
    • 顺序: 插入顺序可以通过构造函数参数指定,允许null键和值。
  • HashTable:
    • 特点: 早期实现,线程安全但性能较差。
    • 不允许空值: 不允许null键和值,大多数情况下被ConcurrentHashMap替代。
  • ConcurrentHashMap:
    • 特点: 线程安全,高并发性能,分段锁机制。
    • 不允许空值: 不允许null键和值。

根据需求选择合适的实现类。如果对顺序要求不高,追求高性能,可选用HashMap;如果需要有序的键值对,选择TreeMap;如果要求线程安全,可选择ConcurrentHashMap

九、用HashMap去实现一个业务

示例业务:使用 HashMap 实现学生信息管理。

import java.util.HashMap;
import java.util.Map;

public class StudentManager {
    private Map<String, Student> studentMap;

    public StudentManager() {
        studentMap = new HashMap<>();
    }

    public void addStudent(String studentId, String name, int age, String course) {
        Student student = new Student(studentId, name, age, course);
        studentMap.put(studentId, student);
    }

    public Student getStudent(String studentId) {
        return studentMap.get(studentId);
    }

    public void removeStudent(String studentId) {
        studentMap.remove(studentId);
    }

    public void printAllStudents() {
        System.out.println("All Students:");
        for (Student student : studentMap.values()) {
            System.out.println(student);
        }
    }

    public static void main(String[] args) {
        StudentManager studentManager = new StudentManager();

        studentManager.addStudent("1001", "Alice", 20, "Math");
        studentManager.addStudent("1002", "Bob", 22, "History");

        studentManager.printAllStudents();

        Student student = studentManager.getStudent("1001");
        System.out.println("Student 1001: " + student);

        studentManager.removeStudent("1002");

        studentManager.printAllStudents();
    }
}

class Student {
    private String studentId;
    private String name;
    private int age;
    private String course;

    public Student(String studentId, String name, int age, String course) {
        this.studentId = studentId;
        this.name = name;
        this.age = age;
        this.course = course;
    }

    @Override
    public String toString() {
        return "Student{" +
                "studentId='" + studentId + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", course='" + course + '\'' +
                '}';
    }
}

这个例子中,StudentManager 使用 HashMap 存储学生信息,提供了添加、获取、删除和打印学生信息的方法。

十、使用TreeMap实现一个业务

示例业务:使用 TreeMap 实现订单管理系统。

import java.util.*;

public class OrderManager {
    private TreeMap<Integer, Order> orderMap;

    public OrderManager() {
        orderMap = new TreeMap<>();
    }

    public void addOrder(int orderId, String product, double amount) {
        Order order = new Order(orderId, product, amount);
        orderMap.put(orderId, order);
    }

    public Order getOrder(int orderId) {
        return orderMap.get(orderId);
    }

    public void removeOrder(int orderId) {
        orderMap.remove(orderId);
    }

    public void printAllOrders() {
        System.out.println("All Orders:");
        for (Order order : orderMap.values()) {
            System.out.println(order);
        }
    }

    public static void main(String[] args) {
        OrderManager orderManager = new OrderManager();

        orderManager.addOrder(1001, "Laptop", 1200.0);
        orderManager.addOrder(1002, "Phone", 800.0);

        orderManager.printAllOrders();

        Order order = orderManager.getOrder(1001);
        System.out.println("Order 1001: " + order);

        orderManager.removeOrder(1002);

        orderManager.printAllOrders();
    }
}

class Order implements Comparable<Order> {
    private int orderId;
    private String product;
    private double amount;

    public Order(int orderId, String product, double amount) {
        this.orderId = orderId;
        this.product = product;
        this.amount = amount;
    }

    @Override
    public int compareTo(Order other) {
        // 按订单ID升序排序
        return Integer.compare(this.orderId, other.orderId);
    }

    @Override
    public String toString() {
        return "Order{" +
                "orderId=" + orderId +
                ", product='" + product + '\'' +
                ", amount=" + amount +
                '}';
    }
}

这个例子中,OrderManager 使用 TreeMap 存储订单信息,并按订单ID升序排序。提供了添加、获取、删除和打印订单信息的方法。在面试中,这个示例可以展示对数据结构的熟练应用以及对Java集合和排序的理解。

十一、详细说一下LinkedHashMap

LinkedHashMap 是 Java 中的一个集合类,继承自 HashMap。它保持了插入顺序或者最近访问顺序,具体由构造函数参数决定。适用于需要保持元素顺序的场景,如实现基于访问顺序的缓存淘汰策略。允许存储 null 键和值。

十二、在后端用哪种方式去记住用户

在后端,常见的用户身份认证方式有:

  1. Session-Based Authentication:
    • 使用会话追踪用户登录状态,通过会话标识识别用户。
    • 安全性高,但需要服务器存储和管理会话信息。
  2. Token-Based Authentication (JWT):
    • 使用令牌进行身份验证,减轻服务器存储压力。
    • 生成令牌包含用户信息和签名,客户端携带令牌访问资源。
  3. OAuth 2.0:
    • 用于授权的开放标准,支持用户通过第三方服务进行身份验证。
    • 适用于需要与其他服务进行集成的场景。
  4. Remember Me Cookies:
    • 通过持久性 Cookie 实现“记住我”功能,识别用户。
    • 安全性相对较低,潜在风险是令牌被窃取。

选择方式取决于应用需求、安全性和用户体验。 Token-Based Authentication 或 OAuth 2.0 是现代应用中常见的方式。

十三、当查询数据库时数据量非常大时,如何提高数据库的查询效率

提高数据库查询效率的方法:

  1. 索引优化: 为经常查询的列创建索引。
  2. 分页查询: 将查询结果分页,避免一次性返回大量数据。
  3. 缓存: 使用缓存存储查询结果,减少对数据库的频繁访问。
  4. 数据类型优化: 使用最适合存储数据的数据类型,减小存储空间。
  5. 分库分表: 在数据量大时,考虑水平分库分表。
  6. 定期优化表结构: 删除不再需要的索引,优化查询语句。
  7. 连接池: 使用数据库连接池管理连接,减少连接创建销毁开销。
  8. 查询优化: 优化查询语句,确保使用了正确的JOIN、WHERE条件,避免全表扫描。
  9. 垂直分割: 将表按列进行垂直分割,分开存储常用和不常用的列。
  10. 异步处理: 对于不需要实时返回的查询,考虑使用异步处理。
  11. 全文搜索引擎: 对于全文搜索需求,考虑使用专门的搜索引擎如Elasticsearch。

十四、线程池除了能够执行定时任务,还有哪些作用

线程在多线程编程中有多种用途,除了执行定时任务,还有以下常见的作用:

  1. 并发执行: 允许程序同时执行多个任务,提高程序整体执行效率。

  2. 异步操作: 在程序执行中,某些操作可能是异步的,可以使用线程来处理这些异步任务,不阻塞主线程的执行。

  3. 响应性: 通过多线程,可以让程序更加响应用户的输入或事件,保持界面的活跃性。

  4. 任务分解: 将大任务拆分成多个子任务,由多个线程并行执行,提高任务执行速度。

  5. 资源共享: 不同线程可以共享相同的内存空间,使得资源更加高效地被利用。

  6. 实时性: 在实时系统中,线程可以用于满足对任务执行时间的实时性要求。

  7. 处理复杂计算: 对于复杂的计算任务,可以使用多线程来分担计算负担,提高计算速度。

  8. 处理IO操作: 在涉及IO操作的场景中,可以通过多线程并行处理IO任务,提高系统吞吐量。

  9. 服务器并发处理: 在服务器端,线程可以用于处理多个客户端请求,提高服务器的并发性能。

  10. 死锁避免: 合理使用线程可以减少死锁的概率,提高程序的稳定性。

  11. 实现并发控制: 多线程可以用于实现并发控制机制,如信号量、互斥锁等,确保对共享资源的安全访问。

总体而言,线程的多任务执行特性使其在各种场景中发挥重要作用,包括提高系统性能、改善用户体验、处理并发任务等。然而,多线程编程也涉及到一些并发控制和线程安全的问题,需要谨慎设计和管理。

十五、JDK17和JDK8相比做了哪些优化

JDK 17 相对于 JDK 8 的优化和改进包括:

  1. 新特性:
    • 引入了 Project Panama 和 Project Loom。
  2. 性能改进:
    • 优化了垃圾收集器和类加载器性能。
  3. JEP:
    • JDK 17 包含多个 JEP(JDK Enhancement-Proposal),其中一些涉及性能和新功能。
  4. 其他改进:
    • 强化了对 JDK 内部的封装性。

相较于 JDK 8,JDK 17 引入了更多现代化的特性和性能优化。

十六、说一下JDK17的垃圾回收机制和JDK8的垃圾回收进制有什么区别

JDK 17 相对于 JDK 8 在垃圾回收机制上引入了 ZGC 和 Shenandoah GC,并对 ZGC 进行了改进,专注于低停顿时间。JDK 8 引入了 G1 和 CMS,也关注低停顿时间。选择垃圾收集器需根据应用需求和性能特点。

十七、说一下数据库集群

数据库集群是多个数据库服务器合作的解决方案,提供高可用性、负载均衡和水平扩展。它能自动处理故障转移,确保系统可用性,同时通过复制和分片等技术来维护数据一致性。

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.