2025全新 Java 面经:字节飞书实习一面真实复盘,附答案整理+ Java 题库!

你用过哪些Linux命令?

文件与目录操作

lscdmkdir,rmcpmv

文件内容查看

catmore/lesstailhead

系统管理

pstop/htopkill/killalldfdu

网络配置与调试

pingifconfig/ipnetstat/sscurl/wget

文件权限与用户管理

chmodchownuseradd/userdelpasswd

如何根据进程名字搜进程ID?

使用 pgrep 命令来根据进程名称(进程的名字)查找进程的 PID(进程 ID)

xml 复制代码
▼bash
​
pgrep <进程名称>

比如查找 nginx 的进程ID

复制代码
▼bash
​
pgrep nginx

如何查看服务器的负载情况,使用什么命令?

可以使用 top 命令,输出的结果如下

yaml 复制代码
▼yaml
​
top - 12:36:29 up 10 days, 3:19, 3 users, load average: 0.05, 0.08, 0.01
Tasks: 147 total,   1 running, 146 sleeping,   0 stopped,   0 zombie
%Cpu(s):  3.2 us, 1.5 sy, 0.0 ni, 95.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem :  16000.0 total,   1200.0 free,   8000.0 used,   4800.0 buff/cache
MiB Swap:   4000.0 total,   2000.0 free,   2000.0 used. 6000.0 avail Mem

load average: 0.05, 0.08, 0.01 就是负载平均值,表示过去 1 分钟、5 分钟、15 分钟内的平均负载。

0.05 表示在过去 1 分钟内,平均有 0.05 个进程正在等待 CPU 或执行中。这个值很低,说明在过去 1 分钟内,系统几乎没有负载。

假设当前服务器有 4 个 CPU 核心,那么负载为 4.0 说明系统刚好处于满载状态。

Linux进程和线程有什么区别?

进程: 是资源分配的基本单位,

线程: 是 CPU 调度的基本单位,属于进程,一个进程中可以包含多个线程。

二者资源消耗不同,通信方式也不一样。

逻辑地址和物理地址的区别是什么?为什么要使用逻辑地址和物理地址?

物理地址是计算机内存中真正的内存单元地址,由内存管理单元(MMU)直接访问。它表示数据在物理内存中的实际存储位置,是由硬件层面决定的。逻辑地址是程序在运行时看到的地址空间,由CPU生成。

使用逻辑地址和物理地址,有历史发展的因素,也可以保障安全性。操作系统中使用分段(Segmentation)分页(Paging) 管理内存,提高内存利用率并简化程序的管理。

在Java中,数组和链表有什么区别?

在存储结构方面

数组基于连续的内存块,大小是固定的,需要重新分配内存来改变数组大小,内存使用紧凑但容易浪费空间。

链表是基于节点的结构,在内存中不需要连续存储,可以动态变化大小和插入删除节点,内存不连续但可以动态扩展。

在访问速度方面

数组支持 O(1) 时间的随机访问,可以通过索引直接访问任何元素。

lua 复制代码
▼text
​
复制代码+----+----+----+----+----+----+
| 10 | 20 | 30 | 40 | 50 | 60 |
+----+----+----+----+----+----+
^
|
Index

而链表访问特定元素需要线性时间O(n),因为节点在内存中不一定连续,访问效率受限于链表的结构。

lua 复制代码
▼text
​
复制代码Head
|
v
+----+----+     +----+----+     +----+----+
| 10 | *----> | 20 | *----> | 30 | *----> NULL
+----+----+     +----+----+     +----+----+
    ^               ^               ^
    |               |               |
  Node             Node             Node

在操作方面

数组插入和删除需要移动数据,时间复杂度为 O(n),而链表则很灵活,可在 O(1) 时间插入和修改指定位置元素。

在适用场景方面

数组适合需要快速随机访问且大小固定的场景,如实现缓存、表格等数据结构。

链表适合需要频繁插入和删除操作且大小不确定的场景,如队列、栈、链表等

Java中的HashMap是怎么实现的?

HashMap 是基于哈希表的数据结构,用于存储键值对key-value)。其核心是将键的哈希值映射到数组索引位置,通过数组 + 链表 (在 Java 8 及之后是数组 + 链表 + 红黑树)来处理哈希冲突。

HashMap 使用键的 hashCode() 方法计算哈希值,并通过 indexFor 方法(JDK 1.7 及之后版本移除了这个方法,直接使用 (n - 1) & hash)确定元素在数组中的存储位置。哈希值是经过一定扰动处理的,防止哈希值分布不均匀,从而减少冲突。

HashMap 的默认初始容量为 16,负载因子为 0.75。也就是说,当存储的元素数量超过 16 × 0.75 = 12 个时,HashMap 会触发扩容操作,容量x2并重新分配元素位置。这种扩容是比较耗时的操作,频繁扩容会影响性能。

在多线程编程中,你用过哪些工具?

可以举例,比如:ConcurrentHashMap、AtomicInteger、Semaphore、CyclicBarrier、CountDownLatch、BlockingQueue 等等。

具体的并发类分析,可以登陆面试鸭查看扩展知识。

你了解HTTPS吗?它是如何交互来实现"安全"的?

HTTPS 是 HTTP 的安全版本,它通过 SSL/TLS 协议进行加密,确保数据在传输过程中是安全的,不能被轻易截获或篡改。

HTTPS 使用 TLS 协议进行握手,而 TLS 的握手根据密钥交互算法的不同,可以分为两种,一种是 RSA 算法另一种是 ECDHE 算法。

HTTPS RSA 算法握手流程

一共需要四次握手:

  1. 客户端问候(ClientHello)
  2. 服务器问候(ServerHello)
  3. 客户端密钥交换(Client Key Exchange) + 开始使用加密(Change Cipher Spec) + 客户端完成(Client Finished)
  4. 服务器发送开始使用加密(Change Cipher Spec) + 服务器完成(Server Finished)

HTTPS ECDHE 算法握手流程

同样也需要四次握手,大致步骤和 RSA 是一致的,主要区别在第二步:

  1. 客户端问候(ClientHello)
  2. 服务器问候(ServerHello)+ 服务器密钥交换(Client Key Exchange)
  3. 客户端密钥交换(Client Key Exchange) + 开始使用加密(Change Cipher Spec) + 客户端完成(Client Finished)
  4. 服务器发送开始使用加密(Change Cipher Spec) + 服务器完成(Server Finished)

算法

题目:给定一个非递减排序数组 a,请从中删除重复项,使得每个元素只出现一次,并输出新的数组长度。

输入格式

  • a:一个排序整数数组 a(1 ≤ a.length ≤ 10^4^, -10^9^ ≤ a[i] ≤ 10^9^)。

输出格式

  • 输出新的数组长度。

输入样例

arduino 复制代码
▼text
​
1 1 2 2

输出样例

arduino 复制代码
▼text
​
2

更多大厂面经、25春招热题、真实高频面试题,就来面试鸭

相关推荐
Kookoos13 分钟前
ABP VNext + Orleans:Actor 模型下的分布式状态管理最佳实践
分布式·后端·c#·.net·.netcore·abp vnext
PWRJOY16 分钟前
Flask 会话管理:从原理到实战,深度解析 session 机制
后端·python·flask
Uranus^20 分钟前
使用Spring Boot和Spring Security结合JWT实现安全的RESTful API
java·spring boot·spring security·jwt·restful api
FAQEW25 分钟前
介绍一下什么是反射(面试题详细讲解)
java·开发语言·反射
是三好1 小时前
并发容器(Collections)
java·多线程·juc
jian110581 小时前
java项目实战、pom.xml配置解释、pojo 普通java对象
java·开发语言·python
述雾学java2 小时前
Spring Boot是什么?MybatisPlus常用注解,LambdaQueryWrapper常用方法
java·spring boot·后端
jinhuazhe20132 小时前
maven 3.0多线程编译提高编译速度
java·maven
xosg2 小时前
HTMLUnknownElement的使用
java·前端·javascript
黎明smaly2 小时前
【C语言】复习~动态内存管理
c语言·开发语言·c++·面试