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

参加面试被问到的面试题

1.在程序中如何开启事务?

在Java中,使用JDBC(Java Database Connectivity)与数据库交互时,你可以使用Connection对象的setAutoCommit方法来控制事务。默认情况下,autoCommit是开启的,这意味着每次执行SQL语句都会立即提交。为了开启一个事务,你需要关闭autoCommit,然后在完成所有操作后显式地调用commitrollback

在MySQL中是通过START TRANSACTION; 开启事务;

2.事务是什么,举个实际的例子?

事务(Transaction)是数据库管理系统执行过程中的一个逻辑单位,它是一个不可分割的工作单位。事务可以把一系列对数据库的多个操作当作一个单一的工作单元来执行,从而保证数据库从一个一致性状态转变到另一个一致性状态。

两个update操作就可以通过start transaction开启事务之后,然后都执行之后通过commit提交事务;

3.MySQL的存储过程是什么?

MySQL的存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字和参数(如果有的话)来调用并执行它。存储过程可以包含逻辑控制语句和数据操纵语句,并且可以接受参数、输出参数、返回单个或多个结果集以及返回值。

4.Java能否实现MySQL存储过程的功能?如果能,区别是什么?

  1. 封装数据库逻辑在Java方法中: 你可以将复杂的数据库操作逻辑封装在Java的方法中。这些方法可以包含多个SQL语句,并且可以使用JDBC或更高级的框架(如Hibernate, MyBatis等)来执行这些语句。这样,其他Java代码就可以像调用存储过程一样调用这些封装好的方法。

  2. 使用Spring框架的@Repository和@Service注解: Spring框架提供了一种声明式的方式来处理数据库操作。通过@Repository注解,你可以创建数据访问对象(DAO),这些对象封装了与数据库交互的逻辑。而@Service注解则用于创建服务层,这些服务层可以调用一个或多个DAO来执行复杂的业务逻辑。这样,业务逻辑就被封装在服务层的方法中,类似于存储过程。

5.axios的get请求和post请求的区别?

  1. 请求方式

  • axios.get用于发送GET请求,通常用于从服务器获取数据。

  • axios.post用于发送POST请求,通常用于向服务器提交数据进行处理请求,如提交表单或者上传文件。

  1. 参数传递方式

  • axios.get通过params属性传递参数,数据会附加在URL后面,因此数据在URL中可见。

  • axios.post则通过data属性传递参数,数据作为请求体发送,不会在URL中显示。

  1. 数据发送方式

  • axios.get请求没有请求体,只有请求头。

  • axios.post请求会把数据作为请求体发送。

  1. 安全性

  • 由于GET请求的数据会被附加到URL中,因此这些数据可能会被浏览器历史记录或服务器日志记录,存在数据泄露或篡改的风险。

  • POST请求的数据则作为请求体发送,不会被缓存到浏览器历史记录或服务器日志中,相对更为安全。

  1. 数据大小限制

  • GET请求提交的数据大小受到限制,通常不能大于2KB。

  • POST请求则没有这样的限制。

6.cookie和session的区别?

首先,从数据存放位置来看,Cookie数据存放在客户的浏览器上,而Session数据则放在服务器上。这意味着Cookie信息可以直接在客户端(如用户的浏览器)上访问和修改,而Session数据则必须通过服务器进行访问和管理。

其次,从安全性的角度考虑,Cookie相对不那么安全。因为Cookie数据存储在客户端,所以他人可以分析并可能进行Cookie欺骗。相比之下,Session数据存储在服务器端,因此更加安全。

再来看性能使用程度,Session会在一定时间内保存在服务器上。当访问量增大时,服务器需要处理更多的Session数据,这可能会增加服务器的负担。而Cookie则主要存储在客户端,对服务器性能的影响较小。因此,从减轻服务器性能负担的角度来看,使用Cookie可能更为合适。

最后,从数据存储大小来看,单个Cookie保存的数据不能超过4K,且很多浏览器都限制一个站点最多保存20个Cookie。而Session数据存储在服务器端,浏览器对其大小没有限制,因此可以存储更多的信息。

7.localstorage和sessionstorage的区别?

  1. 生命周期:localStorage的生命周期是永久的,除非用户或脚本显式地删除数据,否则数据会一直保留在浏览器中。相比之下,sessionStorage的生命周期则与特定的浏览器会话或窗口/标签页相关联。当窗口或标签页被关闭时,sessionStorage中的数据就会被清除。

  2. 作用域:localStorage的作用域是全局的,只要同源(即协议、主机和端口相同),任何页面都可以访问和修改localStorage中的数据。而sessionStorage的作用域则限制在单个窗口或标签页内,不同的窗口/标签页无法共享相同的sessionStorage数据。

  3. 存储大小:localStorage和sessionStorage的存储大小都有限制,但具体大小取决于浏览器。一般来说,它们都能存储相当数量的数据,对于大多数应用来说应该足够了。

  4. 数据格式:localStorage和sessionStorage都只能存储字符串类型的数据。如果你需要存储其他类型的数据(如对象或数组),你需要先将其转换为字符串格式,然后再进行存储。在读取数据时,你需要将字符串转换回原始的数据类型。

8.reduce函数是干嘛用的?

reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。

这个函数的基本语法如下:

arr.reduce(function(accumulator, currentValue, currentIndex, array) {  // 你的代码  
}, initialValue);

参数说明:

  • accumulator(累加器累积器)是累积回调函数的返回值; 它是上一次调用回调时返回的累积值。

  • currentValue(当前值)是数组中正在处理的元素。

  • currentIndex(当前索引)是数组中正在处理的元素的索引。如果提供了 initialValue,则索引为0,否则为1。

  • array(数组)是调用 reduce() 的数组。

  • initialValue(初始值)作为第一次调用 callback 函数时的第一个参数的值。如果没有提供初始值,则将使用数组中的第一个元素。在没有初始值的空数组上调用 reduce 将报错。

    const numbers = [1, 2, 3, 4];  // 1 + 2 + 3 + 4  
    const sum = numbers.reduce((accumulator, currentValue) => accumulator + currentValue, 0);  console.log(sum); // 输出:10

    9.display几个常用的属性是什么?分别有什么作用?

  1. block:当元素的display属性设置为block时,元素会以块级元素的形式显示。块级元素会独占一行,并会在前后自动换行。例如,常见的块级元素有<div><p><h1>等,它们通常用于构建网页的结构。

  2. inline:将元素的display属性设置为inline时,元素会以内联元素的形式显示。内联元素不会独占一行,而是与其他内联元素在一行上显示。常见的内联元素有<span><a><strong>等,它们通常用于包裹文本或内联内容。

  3. inline-block:这个属性值结合了inline和block的特点。设置为inline-block的元素既可以在一行上显示,又能设置宽度和高度等属性。这使得inline-block在布局时具有更大的灵活性。

  4. none:将元素的display属性设置为none时,元素将不会被显示。同时,该元素不会占据页面上的任何空间,就像它从未存在过一样。这是控制元素显示和隐藏的一种方式。

  5. flex:使用flex属性值可以将元素设置为弹性盒模型布局。在这种布局中,子元素(弹性项)可以在父元素(弹性容器)中沿行或列方向进行灵活的排列和对齐。flex布局在现代网页设计中非常常用,它可以帮助开发者实现复杂的布局需求。

  6. grid:grid属性用于创建网格布局,这是一种二维布局系统,可以同时处理行和列。在网格布局中,元素被放置在由行和列创建的单元格中,提供了更大的布局灵活性和控制能力。

10.position的常用属性和作用?

  1. static:这是默认值。元素按照正常流进行布局,不进行任何特殊定位。它会出现在正常的文档流中,忽略任何top、bottom、left、right或者z-index声明。

  2. relative:生成相对定位的元素。这意味着元素会相对于它在正常流中的默认位置进行偏移。通过top、bottom、left、right的设置,可以调整元素的位置。同时,relative定位的元素不会脱离文档流,也不会对其他元素的位置产生影响。另外,relative定位的元素可以设置z-index来改变其层次关系。

  3. absolute:生成绝对定位的元素。这种定位方式会使元素脱离正常的文档流,其位置是相对于最近的已定位父元素(即position属性不是static的元素)进行定位的。如果没有已定位的父元素,那么它会相对于初始包含块进行定位。元素的位置可以通过left、top、right和bottom属性进行精确控制。absolute定位的元素同样可以通过z-index进行层次分级。

  4. fixed:这也是一种绝对定位,但与absolute不同,fixed定位的元素是相对于浏览器窗口进行定位的。无论页面如何滚动,它都会始终位于同一的位置。fixed定位的元素同样脱离文档流,并且其位置可以通过left、top、right和bottom属性进行规定。

  5. sticky:粘性定位,是相对于用户的滚动位置进行定位。一个sticky元素在滚动超过其滚动阈值之前为相对定位,之后为固定定位。目前大多数现代浏览器(除了IE)都支持这种定位方式。

11.盒子模型是什么?如何进行布局的?

盒子模型是CSS技术所使用的一种思维模型,它将网页设计页面中的内容元素看作一个个装了东西的矩形盒子。每个矩形盒子都由内容、内边距、边框和外边距4个部分组成。除去内容部分,其余每个部分又分别包含上、下、左和右4个方向,这些方向既可以分别定义也可以统一定义。

盒子模型的布局主要依赖于水平方向和垂直方向上的属性设置。在水平方向上,盒子的大小以及位置可以通过margin-left、border-left、padding-left、width、padding-right、border-right以及margin-right这7个值来调整。这7个值的总和必须等于其父元素内容区的宽度。当这7个值的和不等于父元素内容区宽度时,浏览器会自动调整某些值以满足这个条件。

12.静态变量和实例变量的区别是什么?

  1. 定义方式:静态变量在定义时前面需要加上static关键字,而实例变量则不需要。

  2. 存储位置:静态变量属于类,也称为类变量。只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间。因此,静态变量可以在不创建对象的情况下,通过类名直接引用。实例变量则属于某个对象的属性,必须创建了实例对象后,其中的实例变量才会被分配空间,才能使用这个实例变量。

  3. 共享性:静态变量是所有对象共有的,某一个对象将其值改变后,其他对象再去获取它,得到的是改变后的值。而实例变量则是每一个对象私有的,某一个对象将其值改变后,不影响其他对象的取值结果,得到的仍是实例变量一开始被赋予的值。

相关文章:

参加面试被问到的面试题

1.在程序中如何开启事务&#xff1f; 在Java中&#xff0c;使用JDBC&#xff08;Java Database Connectivity&#xff09;与数据库交互时&#xff0c;你可以使用Connection对象的setAutoCommit方法来控制事务。默认情况下&#xff0c;autoCommit是开启的&#xff0c;这意味着每…...

第29天:安全开发-JS应用DOM树加密编码库断点调试逆向分析元素属性操作

时间轴&#xff1a; 演示案例&#xff1a; JS 原生开发-DOM 树-用户交互 DOM&#xff1a;文档操作对象 浏览器提供的一套专门用来操作网页代码内容的功能&#xff0c;实现自主或用户交互动作反馈 安全问题&#xff1a;本身的前端代码通过 DOM 技术实现代码的更新修改&#xff…...

react 的路由功能

1. 安装依赖 pnpm add react-router-dom 2. 基本的路由设置&#xff08;BrowserRouter&#xff09; 在 main.tsx 入口文件中使用BrowserRouter组件来包裹整个应用。它会监听浏览器的 URL 变化。 import { StrictMode } from "react";import { createRoot } from …...

SurfaceFlinger学习之一:概览

SurfaceFlinger 是 Android 系统中负责合成和显示屏幕内容的关键系统服务&#xff0c;它运行在一个专用的进程中 (system/bin/surfaceflinger)。它的主要职责是将不同应用程序的绘制内容&#xff08;即窗口或表面&#xff09;组合起来&#xff0c;通过硬件抽象层&#xff08;HA…...

Qt关于窗口一直调用paintEvent的踩坑实录

首先看以下代码&#xff1a; void ItemBlockWidget::paintEvent(QPaintEvent *ev) {// 先调用父类的 paintEvent 以执行默认绘制行为QWidget::paintEvent(ev);qDebug()<<"ItemBlockWidget重绘";QStyleOption opt;opt.initFrom(this);QPainter p(this);style()…...

C++11: STL之bind

C11: STL之bind 引言可调用对象的绑定绑定普通函数绑定静态函数绑定类成员函数绑定仿函数绑定Lambda 占位符std::placeholders的应用嵌套绑定参数重排序结合 STL 算法占位符传递到嵌套函数混合占位符与默认值复杂占位符组合 std::bind的原理std::bind 的设计思路简化实现示例 B…...

在线音乐播放器 —— 测试报告

自动化脚本源代码&#xff1a;Java: 利用Java解题与实现部分功能及小项目的代码集合 - Gitee.com 目录 前言 一、项目简介 1.项目背景 2.应用技术 &#xff08;1&#xff09;后端开发 &#xff08;2&#xff09;前端开发 &#xff08;3&#xff09;数据库 二、项目功能…...

等保测评讲解:安全管理中心

在数字化转型的背景下&#xff0c;网络安全的重要性愈发凸显&#xff0c;而作为中国边疆大省的黑龙江&#xff0c;其网络安全建设更是不可忽视。等保测评&#xff0c;即信息安全等级保护测评&#xff0c;是确保信息系统安全的关键环节。本文将详细讲解黑龙江等保测评中的安全管…...

vue3表单输入相关修饰符使用

在 Vue 3 中&#xff0c;.lazy、.number 和 .trim 是用于 v-model 指令的修饰符&#xff0c;它们可以帮助你在双向绑定时进行特定的处理。 1. .lazy 修饰符 .lazy 修饰符表示只在 input 事件之后触发更新&#xff0c;即输入框的内容发生变化后&#xff0c;只有在用户**失去焦…...

CSS笔记(二)类名复用

这里我通过两张不同位置的卡片来实现效果 代码 <!DOCTYPE html> <html><head><style>/*设置画布*/body{/* 方便排列与对齐*/display: flex; /*画布布满整个窗口*/height: 100vh;/*水平居中*/justify-content: center;/*垂直居中*/align-items: cente…...

TCP三次握手与四次挥手(TCP重传机制,2MSL)超详细!!!计算机网络

本篇是关于3次握手和四次挥手的详细解释~ 如果对你有帮助&#xff0c;请点个免费的赞吧&#xff0c;谢谢汪。&#xff08;点个关注也可以&#xff01;&#xff09; 如果以下内容需要补充和修改&#xff0c;请大家在评论区多多交流~。 目录 1. TCP头部&#xff1a; 2. 三次握手…...

LCR 006. 两数之和 II - 输入有序数组

一.题目&#xff1a; LCR 006. 两数之和 II - 输入有序数组 - 力扣&#xff08;LeetCode&#xff09; 二.我的原始解法-暴力解法超时&#xff1a; class Solution: def twoSum(self, numbers: List[int], target: int) -> List[int]: # 暴力解法 result [] for i in rang…...

网络安全在现代企业中的重要作用

网络安全是这个数字时代最令人担忧的事情之一。对技术的依赖性越来越强&#xff0c;使其同时面临多种网络威胁。其声誉和法律后果的大幅下降可能归因于一次妥协。 这使得良好的网络安全成为所有企业的选择和必需品。本文介绍了网络安全的重要性、企业中常见的网络威胁以及公司…...

关于 EKS Bottlerocket AMI 版本与 Karpenter 配置的说明

问题1: Bottlerocket AMI 版本问题 之前,后端团队发现在使用 Bottlerocket v1.26.2 AMI 版本时,存在某些问题。经过 Bottlerocket 团队调查,此行为是罕见的 race condition 导致的结果。 我们在环境中重现了此状况,并且关注到由于 kubelet device manager 的启动时间晚于 NVI…...

Python实现人生重开模拟器

目录 人生重开模拟器介绍 代码实现 打印初始界面 设置初始属性 设置角色性别 设置角色出生点 针对每一岁&#xff0c;生成人生经历 完整代码 人生重开模拟器介绍 人生重开模拟器 是之前比较火的一个小游戏&#xff0c;我们这里使用 Python 实现一个简化版的 人生重开模…...

java——Spring Boot的配置加载顺序和优先级

Spring Boot的配置加载顺序和优先级是确定应用程序如何读取和应用配置的关键。以下是对Spring Boot配置加载顺序和优先级的详细解释&#xff1a; 一、配置加载顺序 命令行参数&#xff1a; Spring Boot会首先加载命令行中指定的参数。这些参数可以通过在命令行中使用--keyval…...

【21-30期】Java技术深度剖析:从分库分表到微服务的核心问题解析

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Java &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 文章题目&#xff1a;Java技术深度剖析&#xff1a;从分库分表到微服务的核心问题解析 摘要&#xff1a; 本…...

CSS:怎么把网站都变成灰色

当大家看到全站的内容都变成了灰色&#xff0c;包括按钮、图片等等。这时候我们可能会好奇这是怎么做到的呢&#xff1f; 有人会以为所有的内容都统一换了一个 CSS 样式&#xff0c;图片也全换成灰色的了&#xff0c;按钮等样式也统一换成了灰色样式。但你想想这个成本也太高了…...

开发一个基于MACOS M1/2芯片的Android 12的模拟器

产品需求&#xff1a;MuMu模拟器Pro_率先适配Apple M系列芯片的安卓模拟器 苹果M芯片专属&#xff1a;产品专为苹果M系列芯片设计&#xff0c;意味着它需要能够充分利用M系列芯片的性能优势。 安卓模拟器&#xff1a;产品是一个安卓模拟器&#xff0c;允许用户在Mac设备上运行…...

Flink 中 JDBC Connector 使用详解

1. 背景 在实时计算或离线任务中&#xff0c;往往需要与关系型数据库交互&#xff0c;例如 MySQL、PostgreSQL 等。Apache Flink 提供了 JDBC Connector&#xff0c;可以方便地将流式数据写入或读取数据库。 本文将介绍 Flink JDBC Connector 的基础用法、配置方法以及注意事…...

【Linux打怪升级记 | 报错02】-bash: 警告:setlocale: LC_TIME: 无法改变区域选项 (zh_CN.UTF-8)

&#x1f5fa;️博客地图 &#x1f4cd;1、报错发现 &#x1f4cd;2、原因分析 &#x1f4cd;3、解决办法 &#x1f4cd;4、测试结果 1、报错发现 装好了CentOS操作系统&#xff0c;使用ssh远程登陆CentOS&#xff0c;出现如下告警信息&#xff1a; bash: 警告:setlocale…...

未来已来?AI技术革新改变我们的生活

在21世纪的今天&#xff0c;人工智能&#xff08;AI&#xff09;不再是一个遥远的概念&#xff0c;而是逐渐渗透到我们生活的方方面面。从智能家居到自动驾驶汽车&#xff0c;从个性化推荐系统到医疗诊断辅助&#xff0c;AI技术正在以惊人的速度发展&#xff0c;并深刻地影响着…...

【Linux】进程的生命之旅——诞生、消逝与守候(fork/exit/wait)

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 一念既出&#xff0c;万山无阻 目录 &#x1f4d6;一、进程创建 1.fork函数 &#x1f4da;高层封装特性 &#x1f4da;fork返回值 2.写时拷…...

使用vcpkg自动链接tinyxml2时莫名链接其他库(例如boost)

使用vcpkg自动链接tinyxml2时莫名链接其他库&#xff08;例如boost&#xff09; vcpkg的自动链接功能非常方便&#xff0c;但在某些情况下会出现过度链接的问题。 链接错误症状 以tinyxml2为例&#xff0c;程序中调用tinyxml2的函数后&#xff0c;若vcpkg中同时存在opencv和…...

【去毛刺】OpenCV图像处理基础:腐蚀与膨胀操作入门

在数字图像处理中&#xff0c;形态学操作是一种常用的技术&#xff0c;用于提取图像中的特定形状或特征。其中&#xff0c;腐蚀&#xff08;Erosion&#xff09;和膨胀&#xff08;Dilation&#xff09;是两种基本的形态学运算。本文将通过一个简单的例子来演示如何使用Python中…...

道可云人工智能元宇宙每日资讯|第三届京西地区发展论坛成功召开

道可云元宇宙每日简报&#xff08;2024年11月27日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 工信部等十二部门印发《5G规模化应用“扬帆”行动升级方案》 11月25日&#xff0c;工业和信息化部等十二部门印发《5G规模化应用“扬帆”行动升级方案》。《方案》…...

若依框架部署在网站一个子目录下(/admin)问题(

部署在子目录下首先修改vue.config.js文件&#xff1a; 问题一&#xff1a;登陆之后跳转到了404页面问题&#xff0c;解决办法如下&#xff1a; src/router/index.js 把404页面直接变成了首页&#xff08;大佬有啥优雅的解决办法求告知&#xff09; 问题二&#xff1a;退出登录…...

【ue5】UE5运行时下载视频/UE5 runtime download video(MP4)

插件还是老朋友。 节点的content type要打对。 &#xff08;参照表&#xff1a;MIME 类型&#xff08;MIME Type&#xff09;完整对照表 - 免费在线工具&#xff09; 结果展示&#xff1a;...

对比C++,Rust在内存安全上做的努力

简介 近年来&#xff0c;越来越多的组织表示&#xff0c;如果新项目在技术选型时需要使用系统级开发语言&#xff0c;那么不要选择使用C/C这种内存不安全的系统语言&#xff0c;推荐使用内存安全的Rust作为替代。 谷歌也声称&#xff0c;Android 的安全漏洞&#xff0c;从 20…...

如何利用 Qt 的模块化架构组织大型项目

目录 1. 大型项目的架构设计 1.1 分层架构 1.2 事件驱动与异步架构 2. 模块划分与职责分离 2.1 功能模块划分 2.2 模块之间的依赖管理 3. 跨平台开发与模块复用 在大型软件项目中&#xff0c;随着代码量的增加和功能的扩展&#xff0c;项目的复杂度会显著提升。没有良好…...

重庆市建设和交通委员会网站/百度百度网址大全

误删了在Linux虚拟机中写的程序文件&#xff0c;谷歌度娘数据恢复方法失败&#xff0c;使昨天的工作功亏一篑&#xff0c;幸好程序改动不多。现准备在所有服务器用机制来解决误删问题。这样总比花时间恢复付出的代价小得多把。1、编写回收站脚本程序[rootSlaveA data]# cat /bi…...

企业模板网站/百度网址是多少

当前Activity&#xff1a;包含一个Button和一个TextView&#xff0c;用于启动另一个Activity和显示传回的数据&#xff0c;这里重写了onActivityResult()方法。 public class MainActivity extends AppCompatActivity {private TextView textView;Overrideprotected void onCre…...

懒设计app/seo网站推广经理招聘

摘录于 CSDN.NET 全球最大中文IT社区 (内容已和谐)社区之星&#xff1a;业界知名程序员架构师 —— 钟 声文章没有涉及任何教学知识&#xff0c;纯生存技能的解析&#xff0c;望对各位在将来的应聘和工作能有一个小小的帮助&#xff01;Java程序员&#xff0c;上班那点事儿CSDN…...

网站怎么做要钱吗/长尾关键词挖掘站长工具

图像处理之霍夫变换(直线检測算法)霍夫变换是图像变换中的经典手段之中的一个&#xff0c;主要用来从图像中分离出具有某种同样特征的几何形状(如&#xff0c;直线&#xff0c;圆等)。霍夫变换寻找直线与圆的方法相比与其他方法能够更好的降低噪声干扰。经典的霍夫变换经常使用…...

wordpress防攻击代码/seo优化检测

转自&#xff1a;https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 建立struts2wildcard项目&#xff0c;此实例基本仿照前面前面第7点的实例改写而成。为了使用通配符&#xff0c;只需要改写配置文件即可。此实例未使用通配时的配置文件如下&#xff1a; <acti…...

求做图的网站/百度图片搜索引擎

一 ArrayList ArrayList结构为动态数组&#xff0c;当元素数量达到一定规模&#xff0c;将发生扩容操作&#xff0c;时间复杂度为O(N) 和Vector不同&#xff0c;ArrayList中的操作不是线程安全的&#xff01;所以&#xff0c;建议在单线程中才使用ArrayList&#xff0c;而在多…...