大厂面试题分享第二期

news2024/12/25 23:42:53

大厂面试题分享第二期

  • 如果执行了一条命令,"select count(*)from…",使用哪个引擎更快,为什么?
  • 垃圾回收器 CMS 和 G1的区别
  • 介绍一下CMS和G1
    • CMS(并发)垃圾收集器
    • G1垃圾回收器
  • HTTPS和HTTP的区别主要如下:
    • HTTPS 解决了 HTTP 的哪些问题?
    • 主要介绍一下混合加密方式
    • 非对称加密算法
  • TCP和UDP区别是什么?
  • Leetcode25:K个一组翻转链表

如果执行了一条命令,“select count(*)from…”,使用哪个引擎更快,为什么?

EXPLAIN SELECT COUNT(*)FROM user;
EXPLAIN SELECT COUNT(列名) FROMuser;
EXPLAIN SELECT COUNT(1)FROM user;

执行效果上:

  1. count(*)包括了所有的列,在统计时 不会忽略列值为null的数据。
  2. count(1)用1表示代码行,在统计时,不会忽略列值为null的数据。
  3. count(列名)在统计时,会忽略列值为空的数据,就是说某个字段的值为null时不统计。

执行效率上:

  • InnoDB引擎:count(字段)<count(1)=count(*)
    • InnoDB通过遍历最小的可用二级索引来处理select count*)语句,如果二级索引不存在,则通过扫描(主键索引)聚集索引来处理。
    • InnoDB已同样的方式处理count(1)和count(*)·

InnoDB中索引分为聚簇索引(主键索引)和非聚簇索引(非主键索引),聚簇索引的叶子节点中保存的是整行记录,而非聚簇索引的叶子节点中保存的是该行记录的主键的值。所以,相比之下,非聚簇索引要比聚簇索引小很多,所以MySQL会优先选择最小的非聚簇索引来扫表。所以,当我们建表的时候,除了主键索引以外,创建一个非主键索引还是有必要的。

  • MyISAM引擎:count(字段)<count(1)<= count(*)。
    • MyISAM存储了数据的准确行数,使用 count(*)会直接读取该行数,只有当第一列定义为NOT NULL时,count(1),才会执行该操作,所以优先选择count(*)

count(列名)会遍历整个表,但不同的是,它会先获取列,然后判断是否为空,然后累加,因此count(列名)性能不如前两者。

垃圾回收器 CMS 和 G1的区别

在这里插入图片描述
区别一:使用的范围不一样:

  1. CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用
  2. G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用

区别二:STW的时间:

  1. CMS收集器以最小的停顿时间为目标的收集器。
  2. G1收集器可预测垃圾回收区 的停顿时间(建立可预测的停顿时间模型)

区别三: 垃圾碎片

  1. CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片·
  2. G1收集器使用的是“标记-整理”算法,进行了空间整合,没有内存空间碎片。

介绍一下CMS和G1

CMS(并发)垃圾收集器

CMS(Concurrent-Mark-Sweep),是一款并发的、使用标记-清除算法的垃圾回收器,该回收器是针对老年垃圾回收的。

  • CMS 收集器的关注点是尽可能缩短垃圾收集时用户线程的停顿时间。停顿时间越短(低延迟) 就越适合与用户交互的程序,良好的响应速度能提升用户体验

  • CMS 的垃圾收集算法采用 标记-清除算法,并且也会 “Stop-the-world”
    在这里插入图片描述

  • 初始标记(Initial-Mark) 阶段: 在这个阶段中,程序中所有的工作线程都将会因为 “Stop-the-World” 机制而出现短暂的暂停,这个阶段的主要任务仅仅只是标记出 GC Roots 能直接关联到的对象

  • 并发标记(Concurrent-Mark) 阶段: 从 GC Roots 的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行

  • 重新标记(Remark) 阶段: 由于在并发标记阶段中,程序的工作线程会和垃圾收集线程同时运行或者交叉运行,因此为了修正并发标记期间,因用户线程继续运作而导致标记产生变动的那一部分对象的标记记录,仍然需要暂停所有工作线程

  • 并发清除(Concurrent-Sweep) 阶段: 此阶段清理删除掉标记阶段判断已经死亡的对象,释放内存空间。由于不需要移动存活对象,所以这个阶段也可以与用户线程同时并发的
    在这里插入图片描述

CMS垃圾收集器虽然减少了暂停应用程序的运行时间,但是它还是存在着内存碎片问题,于是为了去除内存碎片问题,同时有保留CMS垃圾收集器低暂停时间的优点,

G1垃圾回收器

G1垃圾回收器包括以下步骤:
在这里插入图片描述

  1. 初始标记(Initial Mark):这一步主要标记GC Roots引用的对象为存活。GCRoots是垃圾回收的起始点,通常是活跃的对象。
  2. 并发标记(Concurrent Mark):在这一阶段,垃圾回收器会并发地遍历堆中的对象图,将初始标记阶段标记为存活的对象引用的对象也标记为存活。
  3. 最终标记(Final Mark or Remark):此步骤会再次检查并标记在并发标记阶段可能被漏标的对象,确保所有存活的对象都被正确地标记。同时,任何不再关联的对象也会被标记。
  4. 并发清理(Cleanup):这一步骤将存活的对象复制到其他Region,确保没有内存碎片的产生。G1垃圾回收器通过这种方式优化内存使用,并提高后续的垃圾回收效率

G1垃圾回收器对老年代的清理策略是选择存活度最低的区域进行回收,这样可以高效地回收内存,这也是G1(Garbage first)名称的由来。在清理阶段,G1使用复制算法,确保内存碎片的最小化。

HTTPS和HTTP的区别主要如下:

由于HTTP协议传输的数据是明文格式的,因此发送隐私信息时存在着安全风险。为确保数据传输安全性,网景公司推出了SSL(Secure Sockets Layer)协议,并在其基础上创造出了HTTPS通信方式。简而言之,HTTPS是一种安全、支持加密传输和身份认证功能的网络通信方式,它是在SSL与HTTP结合后诞生的。

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

HTTPS 解决了 HTTP 的哪些问题?

HTTP 由于是明文传输,所以安全上存在以下三个风险:

  1. 窃听风险,比如通信链路上可以获取通信内容,用户号容易没
  2. 篡改风险,比如强制植入垃圾广告,视觉污染,用户眼容易瞎。
  3. 冒充风险,比如冒充淘宝网站,用户钱容易没,

HTTPS 是如何解决上面的三个风险的?

  1. 混合加密的方式实现信息的机密性,解决了窃听的风险。
  2. 摘要算法(哈希算法)的方式来实现完整性,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完整性 解决了算改的风险。
  3. 将服务器公钥放入到数字证书中,解决了冒充的风险。

主要介绍一下混合加密方式

在这里插入图片描述
HTTPS 采用的是对称加密和非对称加密结合的「混合加密」方式:

在通信建立前采用非对称加密的方式交换「会话秘钥」,后续就不再使用非对称加密。
在通信过程中全部使用对称加密的「会话秘钥」的方式加密明文数据。.采用「混合加密」的方式的原因:

  1. 对称加密只使用一个密钥,运算速度快,密钥必须保密,无法做到安全的密钥交换。
  2. 非对称加密使用两个密钥:公钥和私钥,公钥可以任意分发而私钥保密,解决了密钥交换问题但速度慢

通过混合加密的方式可以保证信息的机密性,解决了窃听的风险。

非对称加密算法

非对称加密算法中共有两个密钥:

  • 一个是公钥,这个是可以公开给所有人的;
  • 一个是私钥,这个必须由本人管理,不可泄露,

这两个密钥可以双向加解密的,比如可以用公钥加密内容,然后用私钥解密,也可以用私钥加密内容,公钥解密内容。流程的不同,意味着目的也不相同:

  1. 公钥加密,私钥解密,目的是为了保证内容的传输安全,因为被公钥加密的内容,其他人是无法解密的,只有持有私钥的人,才能解密出实际的内容【客户端向服务器发送消息,但可能存在中间人伪造了一份公钥私钥
  2. 私钥签名,公钥验签,目的是为了保证消息不回被冒充,因为私钥不可泄露的,如果公钥能正常解密出私钥加密的内容,就能证明这个消息是来源于持有私钥身份的人发送的。【CA证书机构,确保客户端拿到的是服务器的公钥,而不是中间人的公钥

数字证书认证机构工作流程

在计算机里,这个权威的机构就是 CA(数字证书认证机构),将服务器公钥放在数字证书(由数字证书认证机构颁发)中,只要证书是可信的,公钥就是可信的。数字证书的工作流程如下:
在这里插入图片描述

TCP和UDP区别是什么?

  • 连接:TCP 是面向连接的传输层协议,传输数据前先要建立连接;UDP 是不需要连接,即刻传输数.据。
  • 服务对象:TCP是一对一的两点服务,即一条连接只有两个端点。UDP 支持一对一、一对多、多对多的交互通信
  • 可靠性:TCP是可靠交付数据的,数据可以无差错、不丢失、不重复、按序到达。UDP 是尽最大努力交付,不保证可靠交付数据。但是我们可以基于 UDP传输协议实现一个可靠的传输协议,比如 QUIC协议
  • 拥塞控制、流量控制:TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。UDP则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。
  • 首部开销:TCP首部长度较长,会有一定的开销,首部在没有使用「选项」字段时是 20 个字节,如果使用了「选项!字段则会变长的。UDP首部只有8个字节,并且是固定不变的,开销较小。
  • 传输方式:TCP是流式传输,没有边界,但保证顺序和可靠。UDP报文传输,是一个包一个包的发送,是有边界的,但可能会丢包和乱序。

Leetcode25:K个一组翻转链表

  1. 链表分区为已翻转部分+待翻转部分+未翻转部分
  2. 每次翻转前,要确定翻转链表的范围,这个必须通过 k 此循环来确定
  3. 需记录翻转链表前驱和后继,方便翻转完成后把已翻转部分和未翻转部分连接起来
  4. 初始需要两个变量 pre 和 end,pre代表待翻转链表的前驱,end 代表待翻转链表的末尾
  5. 经过k此循环,end 到达末尾,记录待翻转链表的后继 next = end.next
  6. 翻转链表,然后将三部分链表连接起来,然后重置 pre 和 end 指针,然后进入下一次循环
  7. 特殊情况,当翻转部分长度不足 k 时,在定位end 完成后,end==null,已经到达末尾,说明题目已完成,直接返回即可
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        //每次开始前 pre start end都在翻转链表的前驱节点
        ListNode pre = dummy;
        ListNode start = dummy;
        ListNode end = dummy;
        while(end.next!=null){
            for(int i=0;i<k&&end!=null;i++) end = end.next;
            if(end == null) break;
            start = pre.next;
            ListNode next = end.next;
            end.next = null;
            pre.next = reverse(start);
            //start此时在翻转链表的前驱  pre和end不在
            start.next = next;
            pre = start;
            end = pre;
        }
        return dummy.next;
    }
    public ListNode reverse(ListNode start){
        ListNode dummy = new ListNode(-1);
        ListNode cur = dummy;
        while(start!=null){
            ListNode next = start.next;
            start.next = cur.next;
            cur.next = start; 
            start = next;
        }
        return dummy.next;

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2033566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网站谷歌SEO优化要注意什么?

就最近我们接触的客户而言&#xff0c;有不少客户连最基本的seo常识都没有&#xff0c;他们固然可能是技术大咖&#xff0c;但如果你还是期望从谷歌seo获取流量&#xff0c;那么&#xff0c;最基本的源代码输出必须要有&#xff0c;正常情况下&#xff0c;整个页面除了动画交互…

windows10和linux(debian12)设置静态ip————附带详细过程

文章目录 0 背景1 linux&#xff08;debian&#xff09;1.1 查看网络配置1.2 获取ip动态分配下的配置1.3 打开网络配置文件1.4 重新启动网络服务1.5 验证设置 2 windows2.1 查看自动获取ip地址下的配置2.2 进行设置 0 背景 因为下位机只能获取固定的ip&#xff08;ip池很小&am…

递归 与 dfs 综合练习(一)

目录 一、找出所有子集的异或总和再求和 1.题目链接&#xff1a;1863. 找出所有子集的异或总和再求和 2.题目描述&#xff1a; 3.解法&#xff08;递归&#xff09; &#x1f335;算法思路&#xff1a; &#x1f335;算法代码&#xff1a; 二、全排列 II 1.题目链接&…

“低代码技术:数字化工厂的加速器与智能制造的桥梁“

引言 随着工业4.0和智能制造的快速发展&#xff0c;数字化工厂成为了现代制造业的核心概念。这一转型不仅依赖于物联网、人工智能、大数据等新兴技术&#xff0c;也需要软件开发的支持。然而&#xff0c;传统的软件开发模式由于其复杂性和周期长&#xff0c;难以快速适应数字化…

案例-华东某财险公司:引入监控易一体化运维软件

在华东这片经济活跃、金融繁荣的热土上&#xff0c;某财险公司作为行业内的佼佼者&#xff0c;始终致力于通过科技创新提升业务运营效率与服务品质。随着公司业务规模的不断扩大&#xff0c;IT基础设施的复杂性和重要性日益凸显&#xff0c;如何实现对庞大IT基础资源的实时监控…

从概念到现实:手机设计可视化如何重塑科技美学

在这个日新月异的数字时代&#xff0c;手机已不仅仅是通讯工具&#xff0c;它更是我们生活方式的延伸&#xff0c;是连接世界的窗口&#xff0c;是创意与科技的完美结晶。 想象一下&#xff0c;在浩瀚的数字海洋中&#xff0c;一款尚未面世的手机&#xff0c;通过高精度的3D建模…

在亚马逊云科技上安全、合规、私密地调用生成式AI大模型

项目简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何安全、合规、私密地调用亚…

2024最全最新VMWare以及Linux配置(含yum失效解决方案)

血泪教训浓缩的精华配置、报错解决&#xff08;解决99%问题&#xff09; 目录 1.Linux环境搭建 1.1安装VMWare 1.1.1卸载老版本VMWare&#xff08;如果有的话&#xff09; 1.1.2开始安装VMware 1.2创建虚拟机 1.3安装Centos7 1.4设置虚拟机快照 1.5安装远程连接SSH客户…

AI换脸模型(384-448模型430万底丹)

模型训练素材19万张来自于 1、香港中文大学CelebA预训练集-WF512版-量大角度全-11万5千张 2、DST全角度训练图集V3.1 WF512【2.6W张 6GB 】 3、女性人脸数据&#xff0c;预训练炼丹专用 4、补全SRC极限角度 5、全角度512分辨率7万张素材 下载地址&#xff1a; 链接&#xf…

day09——集合ArrayList

ArrayList类 ArrayList表示一种集合&#xff0c;它是一个容器&#xff0c;用来存储数据的&#xff0c;类似于数组。但不同于数组&#xff0c;数组一旦创建大小不变&#xff0c;而集合大小是可变的。 ArrayList常用方法 ArrayList是泛型类&#xff0c;可以约束存储的数据类型…

TLE8386-2EL:汽车级DC-DC转换器中文资料书

描述 TLE8386-2EL是一款具有内置保护功能的低端感应升压控制器。该器件的主要功能是将输入电压升高&#xff08;升压&#xff09;到更大的输出电压。开关频率可从100kHz调整至700kHz&#xff0c;并可与外部时钟源同步。 TLE8386-2EL的独特功能可将关断电流消耗降至 <2μA。该…

Python 如何进行静态代码分析(pylint, flake8)

Python 的静态代码分析是一种在不执行代码的情况下&#xff0c;对代码进行检查的技术。其主要目的是在代码运行前发现潜在的错误、风格问题以及其他代码质量问题。静态代码分析在提高代码的可维护性、可读性和可靠性方面发挥着重要作用。常用的静态代码分析工具包括 Pylint 和 …

观测云突变告警,精准预测云原生的系统异常

背景 观测云 DataKit 是一个强大的数据采集工具&#xff0c;能够收集和监控容器化环境和 Kubernetes 集群的指标、对象和日志数据。通过灵活使用 DataKit 收集的数据&#xff0c;可以对 Kubernetes 集群进行深入的监控和分析&#xff0c;从而实现更好的运维和优化。以下是一些…

如何使用yolov5-master进行训练

主要记录配置完成的yolov5-master如何进行自定义数据集训练。 本人使用的设备是jetson-orin AGX&#xff0c;系统是英伟达官方魔改过的ubuntu18.04.。 一、修改配置 首先观察train.py的__main__部分&#xff0c;我们发现训练程序接受很多个参数。 其中我们必须要关注的参数包括…

【网络编程】UDP实现网络通信(C语言、Ubuntu实现)

代码实现&#xff1a;分为udpSer.c(服务器端)和udpCli.c(客户端) //udpSer.c #include <myhead.h>#define SER_PORT 9999 #define SER_IP "192.168.83.128"int main(int argc, const char *argv[]) {//1、创建用于通信的服务器套接字文件描述符int sfd sock…

AI大模型学习之白话笔记(三) -- Assistants API入门

经过上面两篇文章的学习&#xff0c;恭喜你开始进入了人工智能的世界&#xff01;在这篇文章中&#xff0c;你将跟我一起学习如何使用Assistants API快速构建一个针对特定领域的人工智能助手。 我们从基础开始&#xff0c;一步步带你用Assistants API完成一个应用的整个过程。…

智能分析/视频汇聚EasyCVR安防视频融合管理云平台技术优势分析

安防行业的发展历程主要围绕视频监控技术的不断改革升级&#xff0c;从最初的模拟监控到数字监控&#xff0c;再到高清化、网络化监控&#xff0c;直至现在的智能化监控&#xff0c;每一次变革都推动了行业的快速发展。特别是近年来&#xff0c;随着AI、大数据、物联网等技术的…

Proxmox LXC 部署ubuntu,centos

前言CT 在 Proxmox VE 中,“CT”是 Container(容器)的缩写。PVE 支持两种主要类型的容器:LXC 和 OpenVZ(针对较旧的 Linux 内核)。这些容器提供了一种轻量级的虚拟化方式,允许用户在一个操作系统实例上运行多个隔离的系统环境。 PVE CT 特别是指在 Proxmox 平台上创建…

深入探索MySQL C API:使用C语言操作MySQL数据库

目录 引言 一. MySQL C API简介 二. MySQL C API核心函数 2.1 初始化和连接 2.2 配置和执行 2.3 处理结果 2.4 清理和关闭 2.5 错误处理 三. MySQL使用过程 四. 实现CRUD操作 4.1 创建数据库并建立表 ​编辑 4.2 添加数据&#xff08;Create&#xff09; ​编辑 …

idea git 重新登录

&#xff08;切换本地项目绑定的git账户&#xff09; git config --system --unset credential.helper git config user.name git pull &#xff08;然后输入用户名&#xff08;输绑定邮箱&#xff09;&#xff0c;密码&#xff09;