[Java 后端日常实习生] 面试问题总结

[Java 后端日常实习生] 面试问题总结

Http/Https

一、Http

1、什么是HTTP?

HTTP(Hypertext Transfer Protocol)是一种用于在Web浏览器和Web服务器之间传输数据的协议。

2、HTTP的工作原理是什么?

HTTP使用客户端-服务器模型。客户端(通常是浏览器)向服务器发送请求,服务器处理请求并返回响应。

3、HTTP请求方法有哪些?

常见的HTTP请求方法包括GET、POST、PUT、DELETE、PATCH等。

4、HTTP状态码是什么?

HTTP状态码用于表示服务器对请求的响应状态。常见的状态码包括200 OK、404 Not Found、500 Internal Server Error等。

5、HTTP报文的结构是怎样的?

HTTP报文包括请求报文和响应报文。每个报文都包括起始行、头部(Headers)和主体(Body)三部分。

6、HTTP持久连接是什么?

TTP持久连接允许在单个TCP连接上传输多个HTTP请求和响应,减少了连接的建立和关闭开销。

7、什么是Cookie?

Cookie是服务器发送到浏览器并存储在本地的小数据片段,用于跟踪用户会话和状态。

8、什么是Session?

Session是服务器上存储用户数据的一种机制,通过Session ID来关联用户与存储的数据。

二、Https

1、什么是HTTPS?

HTTPS(Hypertext Transfer Protocol Secure)是在HTTP基础上添加了安全性功能的协议,通过加密数据传输来保护用户隐私。

2、HTTPS的工作原理是什么?

HTTPS使用SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议来建立安全的加密通道,确保数据在传输过程中不被窃取或篡改。

3、什么是SSL证书?

SSL证书是用于验证服务器身份的数字证书,包含了服务器公钥和一些相关信息。

4、为什么使用HTTPS?

HTTPS可以提供数据传输的机密性和完整性,防止敏感信息被窃取或篡改,并增加了用户对网站真实性的信任。

5、HTTPS握手过程是怎样的?

HTTPS握手包括客户端和服务器之间的一系列步骤,包括协商加密算法、交换密钥、验证证书等。

6、HTTPS相对于HTTP的性能影响是什么?

由于加密解密过程的开销,HTTPS可能会导致轻微的性能损失。但是现代硬件和优化的加密算法已经减小了这种影响。

7、如何部署HTTPS?

部署HTTPS需要获得SSL证书,可以通过付费证书颁发机构(CA)获得,也可以使用免费的Let’s Encrypt证书。然后在服务器上配置SSL证书并启用HTTPS。

三、HTTP和HTTPS性能与安全性问题

1、HTTP和HTTPS之间的主要区别是什么?

HTTP是不安全的传输协议,而HTTPS在HTTP基础上添加了安全性,通过加密保护数据传输。

2、HTTPS如何防止中间人攻击?

HTTPS通过使用SSL/TLS证书来验证服务器身份,并加密通信内容,从而防止中间人攻击。

四、网络协议和安全问题

1、除了HTTP和HTTPS,还有哪些常见的网络协议?

其他常见的网络协议包括FTP(文件传输协议)、SMTP(简单邮件传输协议)、POP3(邮局协议)、IMAP(互联网消息访问协议)等。

2、什么是跨站请求伪造(CSRF)攻击?

跨站请求伪造是一种攻击方法,攻击者通过伪装成合法用户的请求来执行未经授权的操作。

3、如何防止跨站请求伪造攻击?

可以使用随机生成的令牌来验证请求的合法性,以及对敏感操作要求用户进行二次确认。

Redis

1、什么是Redis?

Redis(Remote Dictionary Server)是一个开源的内存数据库,支持各种数据结构和高性能的键值存储。

2、Redis支持哪些数据结构?

Redis支持字符串、哈希、列表、集合、有序集合等多种数据结构。

3、Redis的特点有哪些?

Redis具有高性能、持久化、数据类型丰富、分布式、发布订阅、事务等特点。

4、Redis的应用场景有哪些?

Redis常用于缓存、排行榜、实时消息、会话存储、计数器等场景。

5、什么是哈希表(Hash)?

哈希表是Redis中的一种数据结构,类似于字典或映射,可以存储多个字段和对应的值。

6、Redis中的有序集合(Sorted Set)是如何工作的?

有序集合是一种集合,每个成员都关联着一个分数,可以根据分数进行排序。

7、常见的Redis命令有哪些?

例如:GET、SET、HGET、HSET、LPUSH、RPUSH、SADD、ZADD等。

8、如何实现分布式锁?

可以使用SETNX(SET if Not eXists)命令来创建一个具有过期时间的键,实现分布式锁。

9、Redis的持久化有哪两种方式?

Redis支持RDB快照和AOF日志两种持久化方式。

10、RDB和AOF的优缺点是什么?

RDB适合备份,占用较少磁盘空间;AOF适合恢复,记录每个写操作。

11、什么是缓存穿透和缓存击穿?

缓存穿透指查询不存在的数据,缓存中没有,每次都访问数据库;缓存击穿指一个热点键过期,导致大量请求直接访问数据库。

12、Redis如何处理并发访问?

Redis是单线程模型,通过事件循环和非阻塞IO来处理并发请求。

13、Redis的数据一致性如何保证?

Redis提供了多种持久化方式和复制机制来保证数据的一致性和可靠性。

14、如何实现Redis的高可用?

可以通过Redis Sentinel进行监控和故障转移,或者使用Redis Cluster进行分布式部署。

15、Redis为什么被称为“内存数据库”?

Redis的数据存储在内存中,因此具有非常高的读写性能。然而,数据也可以通过持久化方式存储在磁盘上以防止数据丢失。

16、Redis如何处理内存不足的情况?

Redis提供了多种内存管理策略,如LRU(最近最少使用)、LFU(最不经常使用)等,可以根据情况选择合适的策略。

17、如何监控和优化Redis的性能?

可以使用命令行工具如redis-cli,以及工具如Redis的性能监控工具、AOF重写、合理设置缓存过期时间等来优化性能。

18、Redis的事务是如何实现的?

Redis的事务使用MULTI、EXEC、WATCH等命令来实现,将一系列命令包裹在一个事务中,确保这些命令的原子性执行。

19、什么是Redis的乐观锁?

乐观锁是一种并发控制机制,基于假设在事务执行期间不会发生冲突。在Redis中,可以使用版本号或时间戳来实现乐观锁。

20、什么是Redis的WATCH命令?

WATCH命令用于在事务执行期间监视一个或多个键,如果被监视的键在事务执行期间被修改,事务会被取消。

21、Redis如何实现多个客户端的并发执行?

Redis通过单线程模型和非阻塞IO,在事件循环中处理多个客户端请求,实现并发执行。

22、如何进行Redis的数据备份和恢复?

可以通过执行SAVE或BGSAVE命令创建RDB快照,也可以设置AOF持久化来记录每个写操作,以实现数据备份和恢复。

23、Redis的RDB和AOF持久化的工作原理是什么?

RDB通过创建数据库快照来保存数据,AOF通过追加写操作日志来记录数据更改。

24、Redis中的数据淘汰策略有哪些?

Redis支持多种数据淘汰策略,如LRU、LFU、随机等。

25、如何设置Redis的数据过期时间?

可以使用EXPIRE命令为键设置过期时间,也可以通过SET命令的EX参数直接设置过期时间。

线程池

1、什么是线程池?

线程池是一种用于管理和重用线程的机制,它能够有效地管理线程的创建、销毁和调度,以提高应用程序的性能和资源利用率。

2、线程池的优势是什么?

节省了线程创建和销毁的开销,减少了资源浪费。
控制并发线程数量,防止线程数量过多导致系统资源耗尽。
提供了线程复用,减少线程创建和销毁的频率,提高了系统的响应速度。
能够提供线程的调度和管理,优化任务的执行顺序,提高系统的整体性能。

3、线程池有哪些常见的参数?

核心线程数:线程池中始终保持存活的线程数量。
最大线程数:线程池允许的最大线程数量,包括核心线程和非核心线程。
线程存活时间:非核心线程的空闲时间超过这个时间将被回收。
阻塞队列:用于存放待执行任务的队列。
拒绝策略:当线程池无法接受新任务时,如何处理新提交的任务。

4、线程池的工作原理是什么?

当有任务提交时,线程池会首先检查核心线程是否都在执行任务,若有空闲核心线程,则立即分配任务给它们。
若核心线程都在忙碌,任务将被放入阻塞队列中等待执行。
若阻塞队列已满,且当前线程数未达到最大线程数,则会创建新的非核心线程来执行任务。
若非核心线程数已达到最大,且阻塞队列已满,根据拒绝策略来处理新提交的任务。

5、如何防止线程池中的线程资源被耗尽?

通过适当设置最大线程数来限制线程的数量,防止过多的线程占用系统资源。
使用合适的阻塞队列来平衡任务提交速度和处理速度,避免过多的任务排队。

6、什么是拒绝策略?有哪些常见的拒绝策略?

拒绝策略定义了当线程池无法接受新任务时的处理方式。常见的拒绝策略包括:
AbortPolicy(默认):抛出RejectedExecutionException异常。
CallerRunsPolicy:由提交任务的线程来执行被拒绝的任务。
DiscardPolicy:直接丢弃被拒绝的任务,不抛出异常也不执行。
DiscardOldestPolicy:丢弃队列中最旧的任务,然后尝试提交新任务。

7、线程池在哪些场景中会被使用?

网络服务器:处理客户端请求。
并发任务处理:如多线程爬虫、数据处理等。
GUI应用程序:避免UI线程阻塞。
批处理任务:优化大量的任务处理。

8、常见的线程池实现有哪些?

Java中的ThreadPoolExecutor(JDK内置的线程池实现)。
Java 5+ 提供的 Executors 工厂类提供了一些预定义的线程池。
第三方库如Apache的Commons ThreadPool等。

9、如何避免线程池中的线程资源泄漏?

使用适当的线程存活时间来回收空闲的非核心线程。
注意任务提交速度,避免过多的任务排队。
在不需要线程池时,及时关闭线程池,释放资源。

10、线程池的任务调度策略是怎样的?

线程池的任务调度是通过阻塞队列来实现的。当有任务提交时,线程池首先尝试将任务分配给空闲的核心线程,如果核心线程都在忙碌,任务会被放入阻塞队列。如果队列已满,而线程池的线程数还未达到最大线程数,那么会创建新的非核心线程来执行任务。如果队列已满且线程数已达到最大,则会根据拒绝策略来处理新任务。

11、你能描述一下线程池的拒绝策略选择时的考虑因素吗?

选择拒绝策略时需要考虑系统的容忍度、任务的重要性和是否需要执行失败任务的后续处理。比如,AbortPolicy可能适合在任务失败时让系统崩溃,而CallerRunsPolicy可能适合保证所有任务被执行,但会影响提交任务的线程。

12、如何避免线程池中出现死锁?

死锁通常发生在多个线程之间相互等待对方释放资源的情况下。为避免线程池中出现死锁,需要注意在任务中避免对共享资源的过度竞争,并合理设计任务之间的依赖关系。

13、在什么情况下会发生线程饥饿?如何防止线程饥饿?

线程饥饿指的是某些线程由于调度策略或其他原因,长时间得不到执行的情况。线程饥饿可能会导致任务迟迟无法得到处理。为避免线程饥饿,可以使用公平调度策略,保证每个线程都有公平的执行机会。

14、线程池如何处理异常?

线程池在执行任务时如果出现异常,默认情况下会捕获异常并记录日志,然后继续执行其他任务。但这可能会导致异常被忽略,因此在任务中应该适当地处理异常,以便及时发现问题。

15、如果需要自定义线程池,你会怎么做?

首先,你可以使用ThreadPoolExecutor类来自定义线程池,设置合适的参数,如核心线程数、最大线程数、队列类型等。然后,你可以根据业务需求自定义拒绝策略、线程工厂、线程存活时间等。最后,你可以监控线程池的性能和状态,确保线程池在运行时表现良好。

16、如何优化线程池的性能?

通过调整线程池的参数,如核心线程数、最大线程数和队列类型,以适应任务负载。
使用合适的拒绝策略,以避免任务因无法执行而被丢弃。
注意任务的调度顺序,优化任务执行的顺序,提高系统的吞吐量。
定期监控线程池的状态,检测可能的性能问题并及时调整。

17、如何监控和调优线程池的性能?

使用工具和库,如JConsole、VisualVM、Prometheus等来监控线程池的指标,如线程数、任务队列长度、任务执行时间等。
根据监控数据,调整线程池的参数,以保持适当的性能水平。

18、在Java中,有哪些内置的线程池实现?它们之间有什么区别?

Java中提供了 Executors 类来创建内置的线程池,如newFixedThreadPool、newCachedThreadPool等。这些线程池的差异在于其核心线程数、最大线程数、队列类型等参数的配置。

19、如何处理线程池中的长时间运行的任务?

对于长时间运行的任务,可以考虑使用自定义的线程池,并设置较大的核心线程数和最大线程数,以避免任务被阻塞。

20、如果一个任务在执行过程中被取消,线程池会怎么处理?

线程池通常会调用任务的 interrupt() 方法来中断任务的执行。但是具体的行为取决于任务的实现,需要确保任务能够正确处理中断信号。

21、在多线程环境下,如何保证共享资源的线程安全?

可以使用同步机制,如 synchronized 块或 Lock 接口来控制对共享资源的访问。
也可以使用线程安全的数据结构,如 ConcurrentHashMap,来避免在多线程环境下的竞争问题。

22、如何实现一个带有定时任务的线程池?

可以使用 ScheduledThreadPoolExecutor 类来实现带有定时任务的线程池。通过调用其 schedule() 或 scheduleAtFixedRate() 方法,可以让线程池定期执行任务。

23、如何避免线程池中的线程局部变量泄漏?

如果在线程池中使用了线程局部变量,必须确保在任务执行完毕后清除这些变量,以避免泄漏。

24、线程池是否适合在所有情况下使用?

不是的。线程池适用于需要管理多个任务执行的情况,但对于一些特定的任务,如IO密集型任务,可能更适合使用异步非阻塞的方式来处理。

25、在分布式系统中,如何跨节点实现任务调度和管理?

可以使用分布式任务调度框架,如Quartz、Spring Cloud Task等,来在不同节点之间协调任务的调度和执行。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Key-Key

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值