当前位置: 首页 > news >正文

JAVA面经2

ConcurrentHashMap

image-20250219162344260

image-20250219162557714

image-20250219162636605

并发程序出现问题的根本原因

image-20250219162840806

image-20250219162917840

image-20250219163008721

image-20250219163036618

image-20250219163129216

image-20250219163215153

image-20250219163313877

线程池

线程池的执行原理(核心参数)

image-20250219165032705

image-20250220160440896

线程池的常见阻塞队列

image-20250220160807474

image-20250220161021564

  1. ArrayBlockingQueue插入和删除数据,只采用了一个lock,而LinkedBlockingQueue则是在插入和删除分别采用了putLocktakeLock,这样可以降低线程由于线程无法获取到lock而进入WAITING状态的可能性,从而提高了线程并发执行的效率。

如何确定核心线程数

image-20250220161517965

image-20250220161644473

线程池的种类

image-20250221135131008

image-20250221135253674

image-20250221135423904

不建议用Executors创建线程池

image-20250221135858525

线程池使用场景

image-20250221140127684

image-20250221140309603

image-20250221140424761

image-20250221144326872

image-20250221144647577

image-20250221144829288

image-20250221145124102

控制某个方法允许并发访问线程的数量

image-20250221145330969

image-20250221150723728

ThreadLocal的理解

image-20250221150847346

image-20250221151018164

image-20250221151113213

image-20250221151333816

JVM

介绍

image-20241216164541889

image-20241216164703763

image-20241216164803374

程序计数器

image-20241216165148096

image-20241216165214083

image-20241216165259601

Java堆

image-20241216165512548

image-20241216165607184

image-20241216165916319

虚拟机栈

  • 每个线程对应一个虚拟机栈

image-20241216170117907

image-20241216170207690

image-20241216170413033

image-20241216170456397

image-20241216170702535

方法区(元空间)

image-20241216170913816

  • 常量池

image-20241216171457747

image-20241216171611282

直接内存

image-20250221151958732

image-20250221152228456

image-20250221152356977

image-20250221152445043

类加载器

image-20250221152725580

image-20250221152818595

双亲委派模型

image-20250221153123030

image-20250221153451843

image-20250221153600637

类装载的执行过程

image-20250221153717253

image-20250221153955059

image-20250221154056050

image-20250221154117076

image-20250221154154969

image-20250221154213897

image-20250221154241042

image-20250221154305690

对象什么时候可以被垃圾回收器回收

image-20250221154508703

image-20250223150431866

image-20250223150547910

image-20250223150649368

image-20250223150808563

垃圾回收算法

image-20250223151231200

image-20250223151336991

image-20250223151415670

image-20250223151504163

image-20250223151533435

分代回收

image-20250223151815309

image-20250223152000316

image-20250223152134254

image-20250223152300347

垃圾回收器的种类

image-20250223152351694

image-20250223152439655

image-20250223152516569

image-20250223152717804

image-20250223152749472

G1垃圾回收器

image-20250223152930794

image-20250223153931914

image-20250223154024594

image-20250223154111760

image-20250223154209105

image-20250223154241367

image-20250223154256074

image-20250223154405253

强,弱,软,虚引用的区别

image-20250223154655846

image-20250223154751251

image-20250223154950299

image-20250223155028970

JVM调优的参数在哪里设置

image-20250223155145293

image-20250223155218120

image-20250223155306102

image-20250223155324141

JVM调优的参数有哪些

image-20250223155435899

image-20250223155545718

image-20250223155630176

image-20250223155732348

image-20250223155807875

JVM调优的工具

image-20250223155927753

Java内存泄漏的排查思路

image-20250223160147684

image-20250223160308533

image-20250223160358234

CPU飚高排查方案与思路

image-20250223160716825

image-20250223160753401

image-20250223160828909

image-20250223160847737

设计模式

image-20250217133422752

工厂方法模式

image-20250217133529774

image-20250217134016211

image-20250217134037770

  • 简单工厂模式

image-20250217134410816

  • 工厂方法模式

image-20250217135027503

image-20250217135237478

  • 抽象工厂模式

image-20250217135632610

image-20250217135906872

image-20250217140016172

  • 总结

工厂模式最大的作用就是解耦!

image-20250217140117098

策略模式

image-20250217140330339

image-20250217140637166

  • 登录案例(没看太懂)

image-20250217140727740

image-20250217141106214

image-20250217141536407

image-20250217141632551

责任链设计模式

image-20250217141757145

image-20250217141950031

image-20250217142320336

image-20250217142426273

常见技术场景

image-20250217145149614

单点登录

image-20250217145412662

image-20250217145657419

image-20250217145756672

权限认证

image-20250217145926571

image-20250217150114986

image-20250217150450347

上传数据的安全性

image-20250217150836857

image-20250217150944463

image-20250217151016642

image-20250217151059653

遇到的棘手问题

image-20250217151449693

日志采集

image-20250217151747335

image-20250217151846008

image-20250217152220980

生产问题如何排查

image-20250217152551705

小林Coding

java基础

Java创建对象除了new还有别的什么方式?

  • 通过反射创建对象:通过 Java 的反射机制可以在运行时动态地创建对象。可以使用 Class 类的 newInstance() 方法或者通过 Constructor 类来创建对象。

  • 通过反序列化创建对象:通过将对象序列化(保存到文件或网络传输)然后再反序列化(从文件或网络传输中读取对象)的方式来创建对象,对象能被序列化和反序列化的前提是类实现Serializable接口。

  • 通过clone创建对象:所有 Java 对象都继承自 Object 类,Object 类中有一个 clone() 方法,可以用来创建对象的副本,要使用 clone 方法,我们必须先实现 Cloneable 接口并实现其定义的 clone 方法。

== 与 equals 有什么区别?

对于字符串变量来说,使用====和"equals"比较字符串时,其比较方法不同。====比较两个变量本身的值,即两个对象在内存中的首地址,"equals"比较字符串包含内容是否相同。

对于非字符串变量来说,如果没有对equals()进行重写的话,“==” 和 "equals"方法的作用是相同的,都是用来比较对象在堆内存中的首地址,即用来比较两个引用变量是否指向同一个对象。

==:比较的是两个字符串内存地址(堆内存)的数值是否相等,属于数值比较;
equals():比较的是两个字符串的内容,属于内容比较。

StringBuffer和StringBuild区别是什么?

区别:
StringBuffer 就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类。它提供了 append 和 add 方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列。在很多情况下我们的字符串拼接操作不需要线程安全,所以 StringBuilder 登场了。

StringBuilder 是 JDK1.5 发布的,它和 StringBuffer 本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。
线程安全:

StringBuffer:线程安全
StringBuilder:线程不安全

速度:

一般情况下,速度从快到慢为 StringBuilder > StringBuffer > String,当然这是相对的,不是绝对的。
使用场景:

操作少量的数据使用 String。

单线程操作大量数据使用 StringBuilder。

多线程操作大量数据使用 StringBuffer。

计算机网络

TCP/IP模型

TCP/IP 网络通常是由上到下分成 4 层,分别是应用层,传输层,网络层和网络接口层

应用层,负责给应用程序提供统一的接口;

传输层,负责端到端的数据传输;

网络层,负责数据的路由、转发、分片;

  • tcp 在传输层
  • ip 在网络层

HTTP和HTTPS 的区别?

区别主要有以下四点:

  • HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
  • HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
  • 两者的默认端口不一样,HTTP 默认端口号是 80,HTTPS 默认端口号是 443。
  • HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。

token,session,cookie的区别?

Cookie和Session都是Web开发中用于跟踪用户状态的技术。

  • session存储于服务器,可以理解为一个状态列表,拥有一个唯一识别符号sessionId,通常存放于cookie中。服务器收到cookie后解析出sessionId,再去session列表中查找,才能找到相应session,依赖cookie。
  • cookie类似一个令牌,装有sessionId,存储在客户端,浏览器通常会自动添加。
  • token也类似一个令牌,无状态,用户信息都被加密到token中,服务器收到token后解密就可知道是哪个用户,需要开发者手动添加。

Nginx有哪些负载均衡算法?

Nginx支持的负载均衡算法包括:

  • 轮询:按照顺序依次将请求分配给后端服务器。这种算法最简单,但是也无法处理某个节点变慢或者客户端操作有连续性的情况。
  • IP哈希:根据客户端IP地址的哈希值来确定分配请求的后端服务器。适用于需要保持同一客户端的请求始终发送到同一台后端服务器的场景,如会话保持。
  • URL哈希:按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。
  • 最短响应时间:按照后端服务器的响应时间来分配请求,响应时间短的优先分配。适用于后端服务器性能不均的场景,能够将请求发送到响应时间快的服务器,实现负载均衡。
  • 加权轮询:按照权重分配请求给后端服务器,权重越高的服务器获得更多的请求。适用于后端服务器性能不同的场景,可以根据服务器权重分配请求,提高高性能服务器的利用率。

TCP三次握手过程说一下

TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手来进行的。三次握手的过程如下图:

  • 一开始,客户端和服务端都处于 CLOSE 状态。先是服务端主动监听某个端口,处于 LISTEN 状态

  • 客户端会随机初始化序号(client_isn),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。

  • 服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1, 接着把 SYN 和 ACK 标志位置为 1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。

  • 客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答号」字段填入 server_isn + 1 ,最后把报文发送给服务端,这次报文可以携带客户到服务端的数据,之后客户端处于 ESTABLISHED 状态。
    服务端收到客户端的应答报文后,也进入 ESTABLISHED 状态。
    从上面的过程可以发现第三次握手是可以携带数据的,前两次握手是不可以携带数据的,这也是面试常问的题。

    一旦完成三次握手,双方都处于 ESTABLISHED 状态,此时连接就已建立完成,客户端和服务端就可以相互发送数据了。

TCP四次挥手

具体过程:

  • 客户端主动调用关闭连接的函数,于是就会发送 FIN 报文,这个 FIN 报文代表客户端不会再发送数据了,进入 FIN_WAIT_1 状态;
  • 服务端收到了 FIN 报文,然后马上回复一个 ACK 确认报文,此时服务端进入 CLOSE_WAIT 状态。在收到 FIN 报文的时候,TCP 协议栈会为 FIN 包插入一个文件结束符 EOF 到接收缓冲区中,服务端应用程序可以通过 read 调用来感知这个 FIN 包,这个 EOF 会被放在已排队等候的其他已接收的数据之后,所以必须要得继续 read 接收缓冲区已接收的数据;
  • 接着,当服务端在 read 数据的时候,最后自然就会读到 EOF,接着 read() 就会返回 0,这时服务端应用程序如果有数据要发送的话,就发完数据后才调用关闭连接的函数,如果服务端应用程序没有数据要发送的话,可以直接调用关闭连接的函数,这时服务端就会发一个 FIN 包,这个 FIN 报文代表服务端不会再发送数据了,之后处于 LAST_ACK 状态;
  • 客户端接收到服务端的 FIN 包,并发送 ACK 确认包给服务端,此时客户端将进入 TIME_WAIT 状态;
  • 服务端收到 ACK 确认包后,就进入了最后的 CLOSE 状态;
  • 客户端经过 2MSL 时间之后,也进入 CLOSE 状态;

相关文章:

  • webpack一篇
  • Java 大视界 -- Java 大数据在智能医疗远程诊断中的技术支撑与挑战(106)
  • Linux虚拟机网络配置-桥接网络配置
  • 一篇文章说清楚OKR
  • 4G工业路由器在公交充电桩中的应用与优势
  • 【三.大模型实战应用篇】【3.智能学员辅导系统:docx文档处理技巧】
  • Tauri跨平台应用开发深度解析与实战指南
  • arm | lrzsz移植记录
  • 多线程学习之路
  • 阿里云服务器部署项目笔记 实操 centos7.9
  • 《C++ primer》第二章
  • 一、C++上岸教程—C语言基础
  • CentOS 7 IP 地址设置保姆级教程
  • playbin之Source插件加载流程源码剖析
  • 2024_BUAA数据结构上机题解分享
  • 03.03 QT
  • Android开发Android调web的方法
  • Feign 深度解析
  • 火语言RPA--PDF提取表格
  • 详解LSM树
  • 《一鸣惊人》五一特别节目:以戏曲为桥梁,展现劳动者的坚守
  • 停电催生商机,中国品牌 “照亮” 西班牙
  • 中国强镇密码丨洪泽湖畔的蒋坝,如何打破古镇刻板印象
  • 平安资管总经理罗水权因个人工作原因辞职
  • 医学统计专家童新元逝世,终年61岁
  • 体重管理门诊来了,瘦不下来的我们有救了?|健康有方FM