一、在使用tcp时,当接受到一个http请求后,tcp如何处理的
- TCP连接建立: 客户端和服务器通过三次握手建立TCP连接。
- HTTP请求发送: 客户端发送HTTP请求给服务器,包含请求方法、URL等信息。
- 服务器接收请求: 服务器TCP层接收请求数据,传递给应用层。
- 应用层处理: 服务器的应用层解析和处理HTTP请求。
- 生成HTTP响应: 服务器生成HTTP响应,包括状态码、头部和体。
- TCP传输响应: 服务器TCP层将响应数据传输到客户端。
- 客户端接收响应: 客户端TCP层接收HTTP响应数据。
- 应用层处理响应: 客户端应用层解析和处理HTTP响应。
- 断开TCP连接: 客户端和服务器通过四次挥手断开TCP连接。
二、js和ts的区别
JavaScript(JS)和TypeScript(TS)之间的主要区别:
- 类型系统:
- JavaScript: 动态类型语言,运行时确定变量类型。
- TypeScript: 引入了静态类型,允许在编写代码时定义变量的类型。
- 编译:
- JavaScript: 无需编译,由浏览器解释执行。
- TypeScript: 需要编译成JavaScript,使用TypeScript编译器(tsc)进行。
- 类型注解:
- JavaScript: 不需要显式声明变量类型。
- TypeScript: 支持显式的类型注解,提供更强的类型检查。
三、说一下你了解到的加密算法,以及使用加密算法的场景和各加密算法的优缺点
1. 对称加密算法:
- AES(Advanced Encryption Standard):
- 场景: 广泛用于文件加密、通信加密等。
- 优点: 高效、安全。
- 缺点: 密钥管理可能挑战,需要共享密钥。
2. 非对称加密算法:
- RSA(Rivest–Shamir–Adleman):
- 场景: 用于密钥交换、数字签名等。
- 优点: 安全,可用于密钥分发。
- 缺点: 较慢,适用于短消息。
3. 哈希函数:
- SHA-256(Secure Hash Algorithm 256-bit):
- 场景: 用于数据完整性验证、密码存储等。
- 优点: 不可逆,相同输入产生相同输出。
- 缺点: 不适合加密通信,因为不可逆。
4. 椭圆曲线加密(ECC):
- 场景: 用于密钥交换和数字签名。
- 优点: 安全性与密钥长度成正比,相对短的密钥长度提供较高的安全性。
- 缺点: 算法相对复杂,不如RSA广泛支持。
这是一些常见的加密算法,选择取决于具体的使用场景和安全需求。
四、说一下创建线程的方法有哪几种
创建线程的两种主要方法是:
- 继承Thread类:
- 创建一个新的类,继承Thread类。
- 重写run()方法,包含线程的逻辑。
- 创建线程对象,调用start()方法启动线程。
- 实现Runnable接口:
- 创建一个新的类,实现Runnable接口。
- 实现run()方法,定义线程的逻辑。
- 创建Thread对象,将实现了Runnable接口的对象传递给Thread的构造函数。
- 调用start()方法启动线程。
推荐使用实现Runnable接口的方式,因为它更灵活,允许一个类同时实现多个接口。这有助于避免Java的单继承限制。
五、Vue2和Vue3的区别是什么
Vue.js 3 相对于 Vue.js 2 的主要区别包括:
- 性能优化:
- Vue.js 3 使用 Proxy 替代 Object.defineProperty,提高了响应式系统的性能。
- 优化了虚拟 DOM 的算法,减少了不必要的 DOM 操作,提升整体性能。
- Composition API:
- 引入了 Composition API,允许更灵活地组织组件逻辑,提高了代码的可维护性。
- 模块化的代码结构:
- Vue.js 3 将代码拆分成更小的模块,使得代码更易维护和测试。
- Teleport 组件:
- 引入了 Teleport 组件,用于在 DOM 中的其他位置渲染组件的内容。
- 更好的 TypeScript 集成:
- 提供了更好的 TypeScript 支持,提供更好的类型推断。
- 自定义渲染器 API:
- 提供了更灵活的自定义渲染器 API,支持更多渲染目标。
- 其他改进和优化:
- 改进了组件实例初始化的性能。
- 提供了更好的错误处理和调试体验。
- 移除了一些不必要的特性和方法。
Vue.js 3 的这些改进使得它更适合构建现代化、高性能的Vue应用。
六、说一下你知道的日志框架
- Log4j:
- 开源日志框架,支持多种输出目标,配置灵活,丰富的日志级别和过滤器。
- Logback:
- Log4j 的继承者,性能更好,支持异步日志记录,适用于高并发环境。
- java.util.logging:
- Java标准库提供的日志框架,与Java平台集成紧密,适用于小型项目和基本日志需求。
- Slf4j (Simple Logging Facade for Java):
- 日志门面,允许应用程序使用不同的日志框架,提供了一致的接口。
七、说一下Map集合的的实现类
常见的Map
接口的实现类包括:
- HashMap:
- 基于哈希表,提供快速查找。
- 不保证顺序,允许
null
键和值。
- TreeMap:
- 基于红黑树,提供有序键值对。
- 不允许
null
键。
- LinkedHashMap:
- 基于哈希表,保持插入顺序或最近访问顺序。
- 允许
null
键和值。
- HashTable:
- 早期实现,线程安全但性能较差。
- 不允许
null
键和值,大多数情况下被ConcurrentHashMap
替代。
- 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
键和值。
十二、在后端用哪种方式去记住用户
在后端,常见的用户身份认证方式有:
- Session-Based Authentication:
- 使用会话追踪用户登录状态,通过会话标识识别用户。
- 安全性高,但需要服务器存储和管理会话信息。
- Token-Based Authentication (JWT):
- 使用令牌进行身份验证,减轻服务器存储压力。
- 生成令牌包含用户信息和签名,客户端携带令牌访问资源。
- OAuth 2.0:
- 用于授权的开放标准,支持用户通过第三方服务进行身份验证。
- 适用于需要与其他服务进行集成的场景。
- Remember Me Cookies:
- 通过持久性 Cookie 实现“记住我”功能,识别用户。
- 安全性相对较低,潜在风险是令牌被窃取。
选择方式取决于应用需求、安全性和用户体验。 Token-Based Authentication 或 OAuth 2.0 是现代应用中常见的方式。
十三、当查询数据库时数据量非常大时,如何提高数据库的查询效率
提高数据库查询效率的方法:
- 索引优化: 为经常查询的列创建索引。
- 分页查询: 将查询结果分页,避免一次性返回大量数据。
- 缓存: 使用缓存存储查询结果,减少对数据库的频繁访问。
- 数据类型优化: 使用最适合存储数据的数据类型,减小存储空间。
- 分库分表: 在数据量大时,考虑水平分库分表。
- 定期优化表结构: 删除不再需要的索引,优化查询语句。
- 连接池: 使用数据库连接池管理连接,减少连接创建销毁开销。
- 查询优化: 优化查询语句,确保使用了正确的JOIN、WHERE条件,避免全表扫描。
- 垂直分割: 将表按列进行垂直分割,分开存储常用和不常用的列。
- 异步处理: 对于不需要实时返回的查询,考虑使用异步处理。
- 全文搜索引擎: 对于全文搜索需求,考虑使用专门的搜索引擎如Elasticsearch。
十四、线程池除了能够执行定时任务,还有哪些作用
线程在多线程编程中有多种用途,除了执行定时任务,还有以下常见的作用:
- 并发执行: 允许程序同时执行多个任务,提高程序整体执行效率。
-
异步操作: 在程序执行中,某些操作可能是异步的,可以使用线程来处理这些异步任务,不阻塞主线程的执行。
-
响应性: 通过多线程,可以让程序更加响应用户的输入或事件,保持界面的活跃性。
-
任务分解: 将大任务拆分成多个子任务,由多个线程并行执行,提高任务执行速度。
-
资源共享: 不同线程可以共享相同的内存空间,使得资源更加高效地被利用。
-
实时性: 在实时系统中,线程可以用于满足对任务执行时间的实时性要求。
-
处理复杂计算: 对于复杂的计算任务,可以使用多线程来分担计算负担,提高计算速度。
-
处理IO操作: 在涉及IO操作的场景中,可以通过多线程并行处理IO任务,提高系统吞吐量。
-
服务器并发处理: 在服务器端,线程可以用于处理多个客户端请求,提高服务器的并发性能。
-
死锁避免: 合理使用线程可以减少死锁的概率,提高程序的稳定性。
-
实现并发控制: 多线程可以用于实现并发控制机制,如信号量、互斥锁等,确保对共享资源的安全访问。
总体而言,线程的多任务执行特性使其在各种场景中发挥重要作用,包括提高系统性能、改善用户体验、处理并发任务等。然而,多线程编程也涉及到一些并发控制和线程安全的问题,需要谨慎设计和管理。
十五、JDK17和JDK8相比做了哪些优化
JDK 17 相对于 JDK 8 的优化和改进包括:
- 新特性:
- 引入了 Project Panama 和 Project Loom。
- 性能改进:
- 优化了垃圾收集器和类加载器性能。
- JEP:
- JDK 17 包含多个 JEP(JDK Enhancement-Proposal),其中一些涉及性能和新功能。
- 其他改进:
- 强化了对 JDK 内部的封装性。
相较于 JDK 8,JDK 17 引入了更多现代化的特性和性能优化。
十六、说一下JDK17的垃圾回收机制和JDK8的垃圾回收进制有什么区别
JDK 17 相对于 JDK 8 在垃圾回收机制上引入了 ZGC 和 Shenandoah GC,并对 ZGC 进行了改进,专注于低停顿时间。JDK 8 引入了 G1 和 CMS,也关注低停顿时间。选择垃圾收集器需根据应用需求和性能特点。
十七、说一下数据库集群
数据库集群是多个数据库服务器合作的解决方案,提供高可用性、负载均衡和水平扩展。它能自动处理故障转移,确保系统可用性,同时通过复制和分片等技术来维护数据一致性。
Was this helpful?
0 / 0