2023-12-05 15:26:46
携程实习一面(线下)主要涉及Shiro、RSA、加密算法、Java基础、Java多线程、计算机网络、MySQL、Redis、SpringBoot、操作系统等多个技术领域的问题。具体内容如下:
项目相关
Shiro:需阐述Shiro框架的核心功能(如认证、授权、加密、会话管理)、架构组件(SecurityManager、Realm、Subject等)及工作流程(如用户登录时Subject提交凭证,SecurityManager协调Realm验证身份并返回权限信息)。
RSA的实现流程:需说明密钥生成(选择两个大素数p和q,计算n=pq及欧拉函数φ(n),选择公钥e与私钥d满足ed≡1 mod φ(n))、加密(使用公钥e对明文m加密,c=m^e mod n)和解密(使用私钥d对密文c解密,m=c^d mod n)的核心步骤。
非对称加密和对称加密:需对比两者特点,如对称加密(如AES)使用相同密钥,加密解密速度快但密钥传输风险高;非对称加密(如RSA)使用公私钥对,安全性高但效率低,常用于密钥交换或数字签名。
Java基础
Random如何实现随机:需解释其基于伪随机数生成算法(如线性同余法),通过种子值初始化状态,每次调用next()方法根据当前状态计算下一个随机数并更新状态,最终通过范围映射返回结果。
LinkedList、ArrayList及其区别:需对比两者底层数据结构(LinkedList为双向链表,ArrayList为动态数组)、操作效率(LinkedList插入删除快但随机访问慢,ArrayList反之)、内存占用(LinkedList节点额外存储前后指针,ArrayList需预留扩容空间)。
手写个单例模式:需展示双重检查锁定(DCL)实现,如使用volatile修饰静态变量,通过同步锁控制实例化过程,确保线程安全且高效。
判断Spring a="1"和Spring b= new String("1")是否相等:需说明前者通过字符串常量池直接引用已存在的"1",后者在堆中新建对象,两者地址不同,故a==b为false;若使用equals()方法比较内容则结果为true。
判断int a 和Integer b 相等吗,赋值的,未赋值的:需分情况讨论,若b已赋值(如Integer b=1),自动拆箱后a==b比较数值(结果为true);若b未赋值(默认null),拆箱时抛NullPointerException;若使用equals()需注意Integer需先拆箱或重写比较逻辑。
Java多线程
volatile:需解释其保证可见性(修改后立即刷新到主内存,其他线程可见)和有序性(禁止指令重排序),但不保证原子性,常用于修饰状态标志位。
CopyOnWrite:需说明其读写分离机制(写操作时复制新数组并替换旧引用,读操作直接读取旧数组),适用于读多写少场景,但内存占用高且写操作实时性差。
Syn和Lock区别:需对比两者特性,如synchronized是Java关键字,基于JVM实现,作用于代码块或方法;Lock是接口,需手动释放锁,支持超时、公平性等高级功能。
计算机网络
从Url到网页展示:需描述完整流程,包括DNS解析(查询域名对应IP)、TCP连接(三次握手建立连接)、HTTP请求(发送请求头及数据)、服务器处理(解析请求并返回响应)、TCP断开(四次挥手释放连接)、浏览器渲染(解析HTML/CSS/JS并渲染页面)。
MySQL
主从:需说明主库负责写操作,从库通过复制主库binlog实现数据同步,常用于读写分离、数据备份及高可用场景。
索引数据结构:需解释B+树(多路平衡查找树,层数少、查询稳定、范围查询高效)和哈希索引(基于哈希表,仅支持等值查询但无法排序)的特点及适用场景。
引擎介绍和区别:需对比InnoDB(支持事务、行级锁、外键,默认引擎)和MyISAM(不支持事务、表级锁,查询速度快但并发性差)的核心差异。
为啥用B+:需强调其查询效率稳定(所有查询均需到达叶子节点)、范围查询高效(叶子节点通过指针连接)及适合磁盘存储(节点大小可配置为页大小,减少IO次数)。
Redis
数据结构:需列举常用类型(如String、Hash、List、Set、ZSet)及其应用场景(如缓存、计数器、消息队列、去重、排序)。
持久化:需说明RDB(定时全量快照,适合备份但可能丢失数据)和AOF(记录写操作命令,支持三种写入策略,数据安全性高但文件体积大)的机制及优缺点。
为啥快:需从内存存储(数据在内存中操作,避免磁盘IO)、单线程模型(避免多线程竞争)、高效数据结构(如跳表、压缩列表)及非阻塞IO(基于事件驱动)等角度分析。
SpringBoot
生命周期:需描述从实例化(构造方法调用)、属性设置(依赖注入)、初始化(@PostConstruct方法、InitializingBean接口)到销毁(@PreDestroy方法、DisposableBean接口)的完整过程。
常用注解、如何自己写个注解:需列举@SpringBootApplication、@RestController、@RequestMapping等常用注解,并说明自定义注解需使用@interface定义,可通过元注解(如@Target、@Retention)指定作用目标及保留策略。
自动装配:需解释@Autowired按类型自动注入依赖,@Resource按名称或类型注入,及Spring通过扫描组件(如@Component、@Service)并注册到Bean容器实现依赖管理。
操作系统
进程和线程区别:需对比两者特性,如进程是资源分配的基本单位(拥有独立内存空间),线程是CPU调度的基本单位(共享进程资源);进程切换开销大(需保存/恢复完整上下文),线程切换开销小;进程间通信需IPC,线程间可直接共享内存。