JAVA面经2

embedded/2025/3/4 22:25:51/

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_434">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 状态;

http://www.ppmy.cn/embedded/170020.html

相关文章

C++20 标准化有符号整数:迈向更可预测的整数运算

文章目录 一、背景:为什么需要标准化?二、2 的补码:原理与优势(一)2 的补码原理(二)2 的补码的优势 三、C20 的变化:明确 2 的补码四、如何利用这一特性优化代码(一&…

私有化部署DeepSeek并SpringBoot集成使用(附UI界面使用教程-支持语音、图片)

私有化部署DeepSeek并SpringBoot集成使用(附UI界面使用教程-支持语音、图片) windows部署ollama Ollama 是一个开源框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计 下载ollama 下载地址(…

探秘基带算法:从原理到5G时代的通信变革【二】Viterbi解码

文章目录 二、关键算法原理剖析2.1 Viterbi 解码2.1.1 卷积码与网格图基础**卷积码****网格图****生成多项式****理想情况下解码过程** 2.1.2 Viterbi 算法核心思想2.1.3 路径度量与状态转移机制2.1.4 算法流程与关键步骤详解2.1.5 译码算法举例与复杂度分析2.1.6 算法代码示例…

基于 RBAC 的前端权限管理实现教程

基于 RBAC 的前端权限管理实现教程 1. 介绍 RBAC 及其在前端的应用 RBAC(基于角色的访问控制,Role-Based Access Control)是一种常见的权限管理方式,核心思想是 用户(User)通过角色(Role&…

Kafka面试题及原理

1. 消息可靠性(不丢失) 使用Kafka在消息的收发过程都会出现消息丢失,Kafka分别给出了解决方案 生产者发送消息到Brocker丢失消息在Brocker中存储丢失消费者从Brocker 幂等方案:【分布式锁、数据库锁(悲观锁、乐观锁…

【每日学点HarmonyOS Next知识】网络请求回调toast问题、Popup问题、禁止弹窗返回、navigation折叠屏不显示返回键、响应式布局

【每日学点HarmonyOS Next知识】网络请求回调toast问题、Popup问题、禁止弹窗返回、navigation折叠屏不显示返回键、响应式布局 1、HarmonyOS http请求回调后,showToast报错? 使用http.HttpRequest.request发起http请求后,在promise的then回…

sql学习笔记(二)

在 SQL 中,using 和 on 是用于连接(join)操作的关键字,它们都用于指定连接条件,但它们在语法和使用场景上有一些区别。以下是它们的详细对比: 一. on关键字 定义 on是最常用的连接条件关键字&#xff0c…

IP属地是通过卫星定位的吗?如何保护用户隐私

在数字时代,网络空间成为了人们日常生活不可或缺的一部分。随着社交媒体、在线服务等平台的兴起,用户IP属地信息的重要性日益凸显。然而,关于IP属地是如何确定的,尤其是是否通过卫星定位这一问题,却常常引发公众的疑问…