面试一轮
3.无重复字符的最长子串
滑动窗口
给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。
1234567891011121314class Solution3AAA{ public int lengthOfLongestSubstring(String s){ Map<Character,Integer> cnt = new HashMap<>(); int left = -1,res = 0,n = s.length(); for (int right = 0;right<n;right++){ if (cnt.containsKey(s.charAt(right))){ left = Math.max(left,cnt.get(s.charAt(right))); } cnt.put(s.charAt(right),right); ...
项目结构
123456789101112131415161718historical-voting-web/├── user-service/ # 用户服务模块│ ├── src/main/java/│ │ └── com/historical/voting/user/│ │ ├── annotation/ # 自定义注解│ │ ├── config/ # 配置类│ │ ├── controller/ # 控制器│ │ ├── entity/ # 实体类│ │ ├── exception/ # 异常处理│ │ ├── Factory/ # 工厂类│ │ ├── interceptor/ # 拦截器│ │ ├── mapper/ # MyBatis映射│ │ ├── repository/ ...
身份认证与权限校验
使用令牌技术实现身份验证,用自定栏截器完成用户认证,并结合 ThreadLocal进行截器校验,保障系统安全访间。
基于Spring Boot + JWT的完整身份认证示例,包含:
JWT生成和解析工具类
认证拦截器(拦截请求验证JWT)
ThreadLocal存储当前用户信息
配置拦截器注册
简单的用户控制器示例
问题解析
1.JWT的组成
Header(头部):描述签名的元数据,包含alg(签名算法) HS256,RS256,typ(令牌的类型)通常为JWT,base64URL编码作为一个片段
Payload:存放业务数据和标准声明(Claims),
RFC定义:iss(签发者)、sub(主题)、aud(受众)、exp(过期时间)、iat(签发时间)
Public Claims:用户自定义,但要避免冲突
Private Claims:双方约定的自定义字段(如 userId、roles)
Signature(签名):
用 Base64Url(Header) + "." + Base64Url(Payload),再加上密钥,通过指定算法(如 ...
Controller
1.写一个简单的登录接口的Controller,包含用户ID和密码字段。
123456789101112131415161718192021222324252627282930@RestController@RequestMapping("/api/auth")public class AuthController { @Autowired private UserService userService; @PostMapping("/login") public ResponseEntity<?> login(@RequestBody LoginRequest request) { User user = userService.findByUserId(request.getUserId()); if (user == null) { return ResponseEntity.status(HttpSta ...
java
未读爬楼梯
70. 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
按着数学来看的话,就是如果是1阶梯的话,就是1
大于等于2的有两种,是i-1+(i-2)
然后我们使用记忆数组来记忆之前算过的
然后使用递归
12345678910111213141516class Solution70A{ public int climbStairs(int n ){ int[] memo = new int[n+1]; return dfs(n,memo); } private int dfs(int i,int[] memo){ if (i<=1){ return 1; } if (memo[i]!=0){ return memo[i]; } return memo[i] ...
名词解释
1.ARP**
ARP(地址解析协议)用于根据 IP 地址获取对应的 MAC 地址,是主机通信前必须完成的地址解析步骤;RARP(逆地址解析协议)则相反,用于根据已知的 MAC 地址获取 IP 地址,常用于无盘工作站启动时向网络请求 IP。ARP 常见于局域网通信,RARP 已被 DHCP 等协议取代。
其中的单播和广播
2.CDN*
内容分发网络,用于将内容缓存至离用户更近的节点,提高访问速度、降低延迟。
3.CSMA
载波监听多路访问,用于以太网的介质访问控制方式,通过“监听-发送”机制减少冲突。
4.CRC*
循环冗余校验,链路层常用的差错检测机制,能发现传输过程中的数据错误。
5.CSP
内容安全策略,用于防止 XSS 等网页攻击,浏览器通过该策略限制网页资源加载来源。
6.MAC*
媒体访问控制地址,是网卡的物理地址,也指链路层控制子层,用于网络访问管理。
7.MAN
城域网,覆盖城市范围的计算机网络,规模介于局域网(LAN)和广域网(WAN)之间。
8.MTU*
最大传输单元,指网络层一次能够传输的最大数据报长度,影响分片与传输效率。
9.NAT*
网络地址转换, ...
基本介绍
JVM 是 Java Virtual Machine 的缩写,它是一个虚构出来的计算机,一种规范。通过在实际的计算机上仿真模拟各类计算机功能实现···
JVM 其实就类似于一台小电脑运行在 windows 或者 linux 这些操作系统环境下即可。它直接和操作系统进行交互,与硬件不直接交互,而操作系统可以帮我们完成和硬件进行交互的工作。
那我们的 JVM 是不认识文本文件的,所以它需要一个 编译 ,让其成为一个它会读二进制文件的 HelloWorld.class
如果 JVM 想要执行这个 .class 文件,我们需要将其装进一个 类加载器 中,它就像一个搬运工一样,会把所有的 .class 文件全部搬进 JVM 里面来。
方法区 是用于存放类似于元数据信息方面的数据的,比如类信息,常量,静态变量,编译后代码···等
类加载器将 .class 文件搬过来就是先丢到这一块上
堆 主要放了一些存储的数据,比如对象实例,数组···等,它和方法区都同属于 线程共享区域 。也就是说它们都是 线程不安全 的
栈 这是我们的代码运行空间。我们编写的每一个方法都会放到 栈 里面运行。
我 ...
内存模型
1.JVM的内存模型介绍一下
根据 JDK 8 规范,JVM 运行时内存共分为虚拟机栈、堆、元空间、程序计数器、本地方法栈五个部分。还有一部分内存叫直接内存,属于操作系统的本地内存,也是可以直接操作的。
JVM的内存结构主要分为以下几个部分:
程序计数器:可以看作是当前线程所执行的字节码的行号指示器,用于存储当前线程正在执行的 Java 方法的 JVM 指令地址。相当于指针,如果线程执行的是 Native 方法,计数器值为 null。是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域,生命周期与线程相同。
Java 虚拟机栈:每个线程都有自己独立的 Java 虚拟机栈,生命周期与线程相同。每个方法在执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。可能会抛出 StackOverflowError 和 OutOfMemoryError 异常。
本地方法栈:与 Java 虚拟机栈类似,主要为虚拟机使用到的 Native 方法服务,在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。本地方法执行时也 ...
概念
1.数组与集合区别,用过哪些?
数组和集合的区别:
数组是固定长度的数据结构,一旦创建长度就无法改变,而集合是动态长度的数据结构,可以根据需要动态增加或减少元素。
数组可以包含基本数据类型和对象,而集合只能包含对象。
数组可以直接访问元素,而集合需要通过迭代器或其他方法访问元素。
我用过的一些 Java 集合类:
ArrayList: 动态数组,实现了List接口,支持动态增长。
LinkedList: 双向链表,也实现了List接口,支持快速的插入和删除操作。
HashMap: 基于哈希表的Map实现,存储键值对,通过键快速查找值。
HashSet: 基于HashMap实现的Set集合,用于存储唯一元素。
TreeMap: 基于红黑树实现的有序Map集合,可以按照键的顺序进行排序。
LinkedHashMap: 基于哈希表和双向链表实现的Map集合,保持插入顺序或访问顺序。
PriorityQueue: 优先队列,可以按照比较器或元素的自然顺序进行排序。
2.说说Java中的集合?
List是有序的Collection,使用此接口能够精确的控制每个元素的插入位置,用户 ...
线程池
1.线程池用过没有? 说说他的核心参数?
线程在正常执行或者异常中断时会被销毁,如果频繁的创建很多线程,不仅会消耗系统资源,还会降低系统的稳定性,一不小心把系统搞崩了。
使用线程池可以带来以下几个好处:
线程池内部的线程数是可控的,可以灵活的设置参数;
线程池内会保留部分线程,当提交新的任务可以直接运行;
方便内部线程资源的管理,调优和监控;
为了减少频繁的创建线程和销毁线程带来的性能损耗
首先,所有任务的调度都是由execute方法完成的,这部分完成的工作是:检查现在线程池的运行状态、运行线程数、运行策略,决定接下来执行的流程,是直接申请线程执行,或是缓冲到队列中执行,亦或是直接拒绝该任务。其执行过程如下:
首先检测线程池运行状态,如果不是RUNNING,则直接拒绝,线程池要保证在RUNNING的状态下执行任务。
如果workerCount < corePoolSize,则创建并启动一个线程来执行新提交的任务。
如果workerCount >= corePoolSize,且线程池内的阻塞队列未满,则将任务添加到该阻塞队列中。
如果workerCount > ...
1、 课程设计目的
本课程设计旨在实现一个基于 TCP 协议 的文件传输系统,模拟实际网络传输过程,并结合多种文件存储方案,完成文件接收与保存的后端处理。通过该系统,学生能深入理解:
基于 Socket 的 TCP 通信原理;
文件传输协议的设计与实现;
网络编程中数据流的处理方式;
结合 Spring Boot 完成服务模块封装;
将传输后的文件按需保存至本地或云存储系统。
使用git进行代码的版本管理和代码托管
项目的github地址:https://github.com/mengnankkkk/tcp-file-transfer
2、课程设计要求
实现 TCP Server,持续监听客户端连接,接收文件数据流;
设计传输协议,确保文件名、大小、内容等完整接收;
实现服务端文件保存功能,支持多种存储后端(本地 / 腾讯云 / 阿里云 / MinIO);
文件传输完成后记录文件元信息(文件名、时间);
提供文件列表接口(/files)供前端查看已上传文件;
使用 Java + Spring Boot 构建后端服务,模块清晰,便于扩展;
3、相关知识
Socket 编程:Java 中 ...
sql
未读主从同步
1.MySQL 主从架构有什么优缺点?
MySQL Replication 是 MySQL 官方提供的主从同步方案,用于将 MySQL 主库的数据同步到从库中,从库可以供应用程序读取数据。
Replication 是目前 MySQL 使用最多的灾备方案,主要有 3 个作用:
读写分离,写主库读从库。这样大大降低主库的负载,即使主库出现类似锁表之类的情况,也不影响应用读取数据。
实现灾备,当主库发生故障时,可以方便地把从库切换成主库,实现高可用(HA)。
水平扩展,当应用访问量导致数据库 I/O 高时,可以通过水平扩展的方式将降低单机负载,降低磁盘 I/O。
同步原理:
MySQL 通过 binlog 实现同步过程中,会用到 3 个线程:
IO thread: 从库执行 START SLAVE 语句时,会创建一个 IO thread,负责连接主节点,请求更新的 binlog**,接收到 binlog 后写入 relaylog;**
dump thread:主库接收到从库的 binlog 请求后,创建一个 dump thread,把 binlog 同步给从库;
sql th ...













