米哈游的春招实习面经,问的很基础

米哈游的春招实习面经,主要考察了java+操作系统+mysql+网络,这四个方面。

面试流程,共1小时,1min自我介绍,20min写题,剩下问题基础知识。

Java

String,StringBuilder, StringBuffer区别?单线程大量操作字符串用哪个?

回答:用StringBuilder

补充:

String、StringBuilder和StringBuffer都是Java中用于操作字符串的类。

String是不可变的字符序列,每次对String进行修改时都会创建一个新的String对象,因此在大量操作字符串时,使用String会频繁地创建对象,导致性能较低。

StringBuilder和StringBuffer都是可变的字符序列,可以对其进行多次修改而不创建新的对象。两者的区别在于线程安全性,StringBuffer是线程安全的,而StringBuilder是非线程安全的。因为StringBuffer的所有共有方法都是同步的,所以在多线程环境下使用StringBuffer可以保证线程安全,但是会降低性能。而StringBuilder没有同步方法,所以在单线程环境下使用StringBuilder性能更高。

因此,在单线程环境下进行大量的字符串操作时,应该使用StringBuilder,可以获得更好的性能。在多线程环境下,使用StringBuffer可以保证线程安全,但是会牺牲一定的性能。

综上所述,单线程大量操作字符串时应该使用StringBuilder,而在多线程环境下应该使用StringBuffer。

synchronized偏向锁直接升级为重量级锁吗?重量级锁怎么实现的?

回答:扯了一下synchronized四种锁

补充:

偏向锁不会直接升级为重量级锁,而是会先升级为轻量级锁,如果轻量级锁竞争失败,则再升级为重量级锁。

重量级锁的实现一般是通过操作系统的互斥量(mutex)来实现的。当一个线程获取重量级锁时,会将该线程挂起,直到锁被释放。这种锁的性能比较低,因为每次加锁和释放锁都需要涉及到操作系统的系统调用,会有较大的开销。因此,在实际应用中,要尽量避免使用重量级锁。

Java中的异常

回答:分类不大记得。讲了异常的捕获,from\to\target指针

补充:

当程序出现异常时,Java会抛出一个异常对象。Java中的异常可以分为三类:

1、Checked Exception(受检异常):这种异常在编译时就可以被检测出来,必须要在代码中进行处理或者声明抛出,否则编译不通过。这类异常主要是由程序的外部环境引起的,例如文件不存在、网络连接失败等。常见的Checked Exception包括IOException、SQLException等。

2、Unchecked Exception(非受检异常):这种异常通常是由程序内部错误引起的,例如NullPointerException、ArrayIndexOutOfBoundsException、IllegalArgumentException等。这类异常不需要在代码中声明抛出,也可以不进行处理,但是如果不进行处理,程序会崩溃。

3、Error:这种异常通常是由JVM或者硬件引起的,例如OutOfMemoryError、StackOverflowError等。这类异常也不需要在代码中声明抛出,也可以不进行处理,但是如果不进行处理,程序也会崩溃。

在Java中,异常处理通常包括try-catch语句和throw语句。try-catch语句可以捕获异常并进行处理,而throw语句可以手动抛出异常。

操作系统

进程间的通信方式?管道模型的分类?

最简单的方式就是管道,管道分为「匿名管道」和「命名管道」。

匿名管道顾名思义,它没有名字标识,匿名管道是特殊文件只存在于内存,没有存在于文件系统中,shell 命令中的「|」竖线就是匿名管道,通信的数据是无格式的流并且大小受限,通信的方式是单向的,数据只能在一个方向上流动,如果要双向通信,需要创建两个管道,再来匿名管道是只能用于存在父子关系的进程间通信,匿名管道的生命周期随着进程创建而建立,随着进程终止而消失。

命名管道突破了匿名管道只能在亲缘关系进程间的通信限制,因为使用命名管道的前提,需要在文件系统创建一个类型为 p 的设备文件,那么毫无关系的进程就可以通过这个设备文件进行通信。另外,不管是匿名管道还是命名管道,进程写入的数据都是缓存在内核中,另一个进程读取数据时候自然也是从内核中获取,同时通信数据都遵循先进先出原则。

消息队列克服了管道通信的数据是无格式的字节流的问题,消息队列实际上是保存在内核的「消息链表」,消息队列的消息体是可以用户自定义的数据类型,发送数据时,会被分成一个一个独立的消息体,当然接收数据时,也要与发送方发送的消息体的数据类型保持一致,这样才能保证读取的数据是正确的。消息队列通信的速度不是最及时的,毕竟每次数据的写入和读取都需要经过用户态与内核态之间的拷贝过程。

共享内存可以解决消息队列通信中用户态与内核态之间数据拷贝过程带来的开销,它直接分配一个共享空间,每个进程都可以直接访问,就像访问进程自己的空间一样快捷方便,不需要陷入内核态或者系统调用,大大提高了通信的速度,享有最快的进程间通信方式之名。但是便捷高效的共享内存通信,带来新的问题,多进程竞争同个共享资源会造成数据的错乱。

那么,就需要信号量来保护共享资源,以确保任何时刻只能有一个进程访问共享资源,这种方式就是互斥访问。信号量不仅可以实现访问的互斥性,还可以实现进程间的同步,信号量其实是一个计数器,表示的是资源个数,其值可以通过两个原子操作来控制,分别是 P 操作和 V 操作。

与信号量名字很相似的叫信号,它俩名字虽然相似,但功能一点儿都不一样。信号可以在应用进程和内核之间直接交互,内核也可以利用信号来通知用户空间的进程发生了哪些系统事件,信号事件的来源主要有硬件来源(如键盘 Cltr+C )和软件来源(如 kill 命令),一旦有信号发生,进程有三种方式响应信号 1. 执行默认操作、2. 捕捉信号、3. 忽略信号。有两个信号是应用进程无法捕捉和忽略的,即 SIGKILL 和 SIGSTOP,这是为了方便我们能在任何时候结束或停止某个进程。

前面说到的通信机制,都是工作于同一台主机,如果要与不同主机的进程间通信,那么就需要 Socket 通信了。Socket 实际上不仅用于不同的主机进程间通信,还可以用于本地主机进程间通信,可根据创建 Socket 的类型不同,分为三种常见的通信方式,一个是基于 TCP 协议的通信方式,一个是基于 UDP 协议的通信方式,一个是本地进程间通信方式。

内核态和用户态区别?内核态的底层操作有什么?为什么要分两个不同的态?

内核态和用户态是操作系统中的两种运行模式。它们的主要区别在于权限和可执行的操作:

1、内核态(Kernel Mode):在内核态下,CPU可以执行所有的指令和访问所有的硬件资源。这种模式下的操作具有更高的权限,主要用于操作系统内核的运行。

2、用户态(User Mode):在用户态下,CPU只能执行部分指令集,无法直接访问硬件资源。这种模式下的操作权限较低,主要用于运行用户程序。

内核态的底层操作主要包括:内存管理、进程管理、设备驱动程序控制、系统调用等。这些操作涉及到操作系统的核心功能,需要较高的权限来执行。

分为内核态和用户态的原因主要有以下几点:

1、安全性:通过对权限的划分,用户程序无法直接访问硬件资源,从而避免了恶意程序对系统资源的破坏。

2、稳定性:用户态程序出现问题时,不会影响到整个系统,避免了程序故障导致系统崩溃的风险。

3、隔离性:内核态和用户态的划分使得操作系统内核与用户程序之间有了明确的边界,有利于系统的模块化和维护。

内核态和用户态的划分有助于保证操作系统的安全性、稳定性和易维护性。

mysql

一条语句,问怎么加索引比较好?

在MySQL中,创建索引可以提高查询性能。为了给某个列添加索引,我们可以使用以下语句:

CREATE INDEX index_name ON table_name(column_name);

在这里,index_name是你为索引指定的名称,table_name是你要添加索引的表名,而column_name是你要添加索引的列名。

在选择要添加索引的列时,请考虑以下几点:

1、对于经常用于查询条件的列,添加索引可以提高查询速度。

2、对于具有许多重复值的列,添加索引的性能提升可能不明显。

3、尽量避免在非常大的表上创建过多索引,因为这会影响插入和更新操作的性能。

什么是联合索引 ?

通过将多个字段组合成一个索引,该索引就被称为联合索引。

比如,将商品表中的 product_no 和 name 字段组合成联合索引(product_no, name),创建联合索引的方式如下:

CREATE INDEX index_product_no_name ON product(product_no, name);

联合索引(product_no, name) 的 B+Tree 示意图如下(图中叶子节点之间我画了单向链表,但是实际上是双向链表,原图我找不到了,修改不了,偷个懒我不重画了,大家脑补成双向链表就行)。

联合索引

可以看到,联合索引的非叶子节点用两个字段的值作为 B+Tree 的 key 值。当在联合索引查询数据时,先按 product_no 字段比较,在 product_no 相同的情况下再按 name 字段比较。

也就是说,联合索引查询的 B+Tree 是先按 product_no 进行排序,然后再 product_no 相同的情况再按 name 字段排序。

因此,使用联合索引时,存在最左匹配原则,也就是按照最左优先的方式进行索引的匹配。在使用联合索引进行查询的时候,如果不遵循「最左匹配原则」,联合索引会失效,这样就无法利用到索引快速查询的特性了。

mysql的四种隔离级别?

  • 读未提交(read uncommitted),指一个事务还没提交时,它做的变更就能被其他事务看到;

  • 读提交(read committed),指一个事务提交之后,它做的变更才能被其他事务看到;

  • 可重复读(repeatable read),指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,MySQL InnoDB 引擎的默认隔离级别

  • 串行化(serializable);会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;

针对不同的隔离级别,并发事务时可能发生的现象也会不同。

图片

也就是说:

  • 在「读未提交」隔离级别下,可能发生脏读、不可重复读和幻读现象;

  • 在「读提交」隔离级别下,可能发生不可重复读和幻读现象,但是不可能发生脏读现象;

  • 在「可重复读」隔离级别下,可能发生幻读现象,但是不可能脏读和不可重复读现象;

  • 在「串行化」隔离级别下,脏读、不可重复读和幻读现象都不可能会发生。

什么是脏读、幻读、不可重复读?

  • 脏读:如果一个事务「读到」了另一个「未提交事务修改过的数据」,就意味着发生了「脏读」现象。

  • 不可重复读:在一个事务内多次读取同一个数据,如果出现前后两次读到的数据不一样的情况,就意味着发生了「不可重复读」现象。

  • 幻读:在一个事务内多次查询某个符合查询条件的「记录数量」,如果出现前后两次查询到的记录数量不一样的情况,就意味着发生了「幻读」现象。

mysql的innodb如何避免不可重复读?

mysql的默认隔离级别是可重复读,可重复读隔离级别在开启事务后,执行第一个selete 语句的时候,会生成一个 Read View,后面整个事务期间的selete都在用这个 Read View,所以事务期间上读取的数据都是一致的,不会出现前后读取的数据不一致的问题,所以避免了不可重复读。

网络

输入网址后发生了什么?

回答:应用层DNS解析,传输层TCP连接,网络层IP,数据链路MAC,真实物理层,接收到之后再一层层扒皮。

DNS解析的具体过程

DNS 域名解析,简单地说就是把域名翻译成 IP 地址。例如:把 www.baidu.com 这个域名翻译成对应 IP 220.181.38.251,这里只是举个例子。

 

域名解析流程

上图中分 8 个步骤介绍了域名解析的流程,但在此之前会先检查本机的缓存配置+ hosts 解析,然后才真正执行上图的流程:

首先,再进行dns服务器解析之前,会查缓存,总共有两次缓存的查询:

浏览器缓存检查:浏览器会首先搜索浏览器自身的 DNS 缓存,缓存时间比较短,大概只有1分钟,且只能容纳 1000 条缓存,看自身的缓存中是否有对应的条目,而且没有过期,如果有且没有过期则解析到此结束。

操作系统缓存检查 + hosts 解析:如果浏览器的缓存里没有找到对应的条目,操作系统也会有一个域名解析的过程,那么浏览器先搜索操作系统的 DNS 缓存中是否有这个域名对应的解析结果,如果找到且没有过期则停止搜索,解析到此结束。在 Linux 中可以通过 /etc/hosts 文件来设置,可以将任何域名解析到任何能够访问的IP 地址。如果在这里指定了一个域名对应的 IP 地址,那么浏览器会首先使用这个 IP地址。当解析到这个配置文件中的某个域名时,操作系统会在缓存中缓存这个解析结果,缓存的时间同样是受这个域名的失效时间和缓存的空间大小控制的。

接着就进行dns解析:

第一步:客户端通过浏览器访问域名为 www.baidu.com (http://www.baidu.com) 的网站,发起查询该域名的 IP 地址的 DNS 请求。该请求发送到了本地 DNS 服务器上。本地 DNS 服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果。如果没有,本地 DNS 服务器还要向 DNS 根服务器进行查询。

第二步:本地 DNS 服务器向根服务器发送 DNS 请求,请求域名为 www.baidu.com (http://www.baidu.com) 的 IP 地址。

第三步:根服务器经过查询,没有记录该域名及 IP 地址的对应关系。但是会告诉本地 DNS 服务器,可以到域名服务器上继续查询,并给出域名服务器的地址(.com 服务器)。

第四步:本地 DNS 服务器向 .com 服务器发送 DNS 请求,请求域名 www.baidu.com (http://www.baidu.com) 的 IP 地址。

第五步:com 服务器收到请求后,不会直接返回域名和 IP 地址的对应关系,而是告诉本地DNS 服务器,该域名可以在 baidu.com 域名服务器上进行解析获取 IP 地址,并告诉 baidu.com 域名服务器的地址。

第六步:本地 DNS 服务器向 baidu.com 域名服务器发送 DNS 请求,请求域名 www.baidu.com (http://www.baidu.com) 的 IP 地址。

第七步:baidu.com 服务器收到请求后,在自己的缓存表中发现了该域名和 IP 地址的对应关系,并将 IP 地址返回给本地 DNS 服务器。

第八步:本地 DNS 服务器将获取到与域名对应的 IP 地址返回给客户端,并且将域名和 IP 地址的对应关系保存在缓存中,以备下次别的用户查询时使用。

最后引用大佬的一张图做下总结:

 

TCP拆包沾包原因

TCP拆包和沾包现象是由于TCP协议的特性以及网络传输过程中的各种因素所导致的。

1、TCP协议是基于字节流的传输层协议,没有固定的分包边界。发送方将数据分成多个小的数据包进行传输,接收方再将这些数据包组合成完整的数据。在这个过程中,可能会出现拆包和沾包现象。

2、网络传输中的延迟和拥塞会影响数据包发送的速度和到达接收方的顺序。这可能导致数据包的拆分和组合不规律,从而出现拆包和沾包现象。

3、接收方的缓冲区大小限制。当接收方的缓冲区不足以容纳一个完整的数据包时,可能会将数据包拆分成多个部分,导致拆包现象。

为了解决TCP拆包和沾包的问题,可以采用以下方法:

4、在应用层实现数据包的边界识别,例如通过添加包头,包头中包含数据包长度等信息,使得接收方能够准确地将数据包进行拼接。

5、使用固定长度的数据包或者特殊的分隔符,以便于接收方识别数据包的边界。

6、使用更高级的传输层协议,如WebSocket,它在TCP基础上增加了数据帧的概念,可以更好地解决拆包和沾包问题。

算法

手写LRU

面试感受

照着简历模块挑八股问,八股也很基础,没问项目,进入二面了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工控机All In One——篇1,pve安装(必读)

工控机All In One——篇1,pve安装 1、背景 满足家庭一机多用,同时满足软路由(主旁路由)、远程控制、NAS(个人存储)等功能 2、准备 硬件 1、J4125工控机 2、一个usb分线器 3、鼠标键盘 4、带HDMI或VGA接…

Android编译优化之混淆配置

Android编译优化之混淆配置 背景 为了使用java8及后续java新版本的特性,Google增加了一步编译过程—脱糖(desugaring),但这一步会导致更长的编译时间,这也是为什么Google会推出D8和R8编译器来优化编译速度。 什么是脱…

网安笔记 09 PKI PMI

PKI PMI PKI 公钥基础设施 public key infrastructure 遵循标准的,利用公钥理论和技术建立的提供安全服务的基础设施 **目的:**身份认证,点滴信息不完整,不可抵赖,提供可靠安全服务 **任务:**可信任数字…

使用@Autowired、@Qualifier、@Primary注解自动装配组件

1.Autowired、Qualifier、Primary注解 1.1.Autowired注解 Autowired注解可以对类成员变量、方法和构造函数进行标注,完成自动装配的工作。 package org.springframework.beans.factory.annotation;import java.lang.annotation.Documented; import java.lang.ann…

数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)

目录 什么是哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 图解操作 代码实现 代码解析 哈夫曼树的特点 哈夫曼编码 不等长编码 二叉树用于编码 哈夫曼编码实例 什么是哈夫曼树 我们先举个例子&#xff1a; 要将百分制的考试成绩转化成五分制的成绩 if(score < …

固态继电器的优点

固态继电器的优点包括紧凑性、抗冲击性和长寿命。以下是这些 SSR 优势中最重要的优势&#xff0c;让您了解为什么这项技术最适合您的应用&#xff1a; 开关速度快 固态继电器器件的主要优点之一是其开关速度。由于无需移动机械部件&#xff0c;SSR 可以在几微秒内切换。这是对…

【Java笔试强训 35】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;年会抽奖…

小红书达人等级有哪些,达人种草力度判断

小红书对于产品及品牌的传播作用&#xff0c;来自于达人自身的分享。以笔记为媒介&#xff0c;对产品进行情景化展示&#xff0c;从而吸引消费&#xff0c;就被称作是种草。而种草力度的强弱&#xff0c;则与达人等级息息相关。下面&#xff0c;就来跟详细为大家解读。 一、小红…

设计模式——适配器模式(类适配器、对象适配器)

是什么&#xff1f; 我们平时的有线耳机接口分为USB的和Type-C的接口&#xff0c;但是手机的耳机插口却只有一个&#xff0c;像华为的耳机插口现在基本都是Type-c的&#xff0c;那如果我们现在只有USB接口的耳机怎么办呢&#xff0c;这个时候就需要使用到一个转换器&#xff0c…

公路交通气象站——提供及时的交通气象信息服务

我国幅员辽阔&#xff0c;跨经纬度广&#xff0c;气候多样。从气候类型划分&#xff1a;可以分为季风气候、温带大陆性气候和高寒气候。 气象的变化也在直接影响着我国各个地区的道路建设及通行&#xff0c;由于部分路段地势险峻伴随恶劣的气象变化&#xff0c;会直接影响驾驶人…

Java 10 字符串

1.API 1.1API 概述 什么是API ​ API (Application Programming Interface) &#xff1a;应用程序编程接口 java 中的 API ​ 指的就是 JDK 中提供的各种功能的 Java 类&#xff0c;这些类将底层的实现封装了起来&#xff0c;我们不需要关心这些类是如何实现的&#xff0c;只…

LeetCoed 2, 23, 25, 112, 113

文章目录 1. 两数相加2. K 个一组翻转链表3. 合并 K 个升序链表4. 路径总和I5. 路径总和II 1. 两数相加 题目详情见: LeetCode2. 两数相加 题目描述相对来说比较绕, 我们可以直接理解为两个多位的整数相加, 只不过整数的每一位都是通过链表进行存储; 比如, 整数 342, 通过链表…

三分钟教你Mac下安装VmWare虚拟机

大数据课程课前环境准备&#xff1a;mac中安装三台linux服务器 一、课前准备 准备一台内存最少8G&#xff08;建议16G&#xff09;、cpu i7 4核的电脑 二、课堂主题 安装虚拟化软件VMware准备3台linux虚拟机 三、课堂目标 完成mac下3个虚拟机的安装 四、知识要点 文档说…

浅析智慧充电桩云平台的技术设计方案

自从我国提出“新基建”以来&#xff0c;充电基础设施产业也成为行业的话题与关注焦点。据数据统计&#xff0c;2021年&#xff0c;中国新能源汽车保有量达到784万辆&#xff0c;预计2025年&#xff0c;中国新能源汽车保有量达到2672万辆&#xff0c;2025年充电桩数量将达到654…

【沐风老师】一步一步教你在3dMax中进行UVW贴图和展开UVW的方法

将简单或程序材质应用于对象并不难。但是当表面需要在其上显示某种纹理时&#xff0c;它会变得更加复杂。任何纹理贴图都放在材质的 Diffuse 插槽中&#xff0c;但渲染的结果可能无法预测。这就是为什么我们需要了解 3DMAX 如何将纹理应用于 3D 对象&#xff0c;什么是 UVW 贴图…

weblogic ssrf 漏洞复现

一.前言 Weblogic中存在一个SSRF漏洞&#xff0c;利用该漏洞可以发送任意HTTP请求&#xff0c;进而攻击内网中redis、fastcgi等脆弱组件。 二.环境搭建 在docker中开启环境 sudo docker-compose up -d sudo docker-compose ps #查看状态访问http://your-ip:7001/uddiexpl…

【数码】收音机,德生PL380使用教程与注意事项

文章目录 1、主界面功能介绍&#xff08;注意闹钟和自动关机&#xff09;2、电池和电池模式的匹配3、收音机天线与信号&#xff0c;耳机与噪音F、参考资料 1、主界面功能介绍&#xff08;注意闹钟和自动关机&#xff09; 红色的按钮&#xff1a;power 按一下开机&#xff0c;按…

25个著名的WordPress网站案例

想创建免费网站吗&#xff1f;从易服客建站平台开始 500M免费空间&#xff0c;可升级为20GB电子商务网站 创建免费网站 WordPress 内容管理系统为全球35%的网站提供支持。鉴于目前有 17 亿个站点&#xff0c;并且还在增加&#xff0c;您可以算出每秒向网站访问者提供内容的W…

牛客网剑指offer|中等题day2|JZ22链表中倒数最后k个结点(简单)、JZ35复杂链表的复制(复杂)、JZ77按之字形顺序打印二叉树(中等)

JZ22链表中倒数最后k个结点(简单) 链接&#xff1a;链表中倒数最后k个结点_牛客题霸_牛客网 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ class Solution { public:/*** 代码中的类名、方法名、参数名已经指…

一、PEMFC基础之热力学

一、PEMFC基础之热力学 1.内能U、焓H、熵S、吉布斯自由能G、赫姆霍兹自由能F关系图2.可逆电压与温度和压力的关系3.能斯特方程4.燃料电池效率 1.内能U、焓H、熵S、吉布斯自由能G、赫姆霍兹自由能F关系图 2.可逆电压与温度和压力的关系 标准状态可逆电压Er计算&#xff1a; E …
最新文章