面试题

编程语言

深copy和浅copy的区别

浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。 深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。
在这里插入图片描述

Java 中的值传递和引用传递?==和equals的区别考察

“==”是比较两个对象是不是引用自同一个对象。 “equals()”是比较两个对象的内容。

Java堆和栈区别?

JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。

Integer缓存?Integer比较大小注意问题。

Integer是有缓冲池的,java.lang.Integer.valueOf(int)方法默认情况下如果参数在-128到127之间,则返回缓存中的对象,否则返回new Integer(int)。java使用该机制是为了达到最小化数据输入和输出的目的,这是一种优化措施,提高效率 其他的包装器: Boolean: (全部缓存) Byte: (全部缓存) Character ( <=127 缓存) Short (-128~127 缓存) Long (-128~127 缓存) Float (没有缓存) Doulbe (没有缓存) 可以设置系统属性 java.lang.Integer.IntegerCache.high 修改缓冲区上限,默认为127。参数内容应为大于127的十进制数形式的字符串,否则将被忽略。取值范围为127-Long.MAX_VALUE,但是用时将强转为int。当系统中大量使用Integer时,增大缓存上限可以节省小量内存。

在一个静态方法内调用一个非静态成员为什么是非法的?

这个需要结合 JVM 的相关知识,静态方法是属于类的,在类加载的时候就会分配内存,可以通过类名直接访问。而非静态成员属于实例对象,只有在对象实例化之后才存在,然后通过类的实例对象去访问。在类的非静态成员不存在的时候静态成员就已经存在了,此时调用在内存中还不存在的非静态成员,属于非法操作。

java反射机制介绍?原理?优缺点?应用场景?

如果说大家研究过框架的底层原理或者咱们自己写过框架的话,一定对反射这个概念不陌生。
反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。
通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。

反射机制优缺点

优点 : 可以让咱们的代码更加灵活、为各种框架提供开箱即用的功能提供了便利
缺点 :让我们在运行时有了分析操作类的能力,这同样也增加了安全问题。比如可以无视泛型参数的安全检查(泛型参数的安全检查发生在编译时)。另外,反射的性能也要稍差点,不过,对于框架来说实际是影响不大的。Java Reflection: Why is it so slow?

反射的应用场景

像咱们平时大部分时候都是在写业务代码,很少会接触到直接使用反射机制的场景。
但是,这并不代表反射没有用。相反,正是因为反射,你才能这么轻松地使用各种框架。像 Spring/Spring Boot、MyBatis 等等框架中都大量使用了反射机制。
这些框架中也大量使用了动态代理,而动态代理的实现也依赖反射。
另外,像 Java 中的一大利器 注解 的实现也用到了反射。
为什么你使用 Spring 的时候 ,一个@Component注解就声明了一个类为 Spring Bean 呢?为什么你通过一个 @Value注解就读取到配置文件中的值呢?究竟是怎么起作用的呢?
这些都是因为你可以基于反射分析类,然后获取到类/属性/方法/方法的参数上的注解。你获取到注解之后,就可以做进一步的处理。

如何拷贝数组,怎样效率最高?为什么?

(1)使用循环结构 这种方法最灵活。唯一不足的地方可能就是代码较多
(2)使用Object类的clone()方法, 这种方法最简单,得到原数组的一个副本。灵活形也最差。效率最差,尤其是在数组元素很大或者复制对象数组时。
(3) 使用Systems的arraycopy这种方法被告之速度最快,并且灵活性也较好,可以指定原数组名称、以及元素的开始位置、复制的元素的个数,目标数组名称、目标数组的位置。

浅拷贝和深拷贝得理解:定义一个数组int[] a={3,1,4,2,5}; int[] b=a; 数组b只是对数组a的又一个引用,即浅拷贝。如果改变数组b中元素的值,其实是改变了数组a的元素的值,要实现深度复制,可以用clone或者System.arrayCopyclone和System.arrayCopy都是对一维数组的深度复制;因为java中没有二维数组的概念,只有数组的数组。所以二维数组a中存储的实际上是两个一维数组的引用。当调用clone函数时,是对这两个引用进行了复制。 解题思路:基础知识考察点:数组拷贝,浅拷贝和深拷贝的区别

计算机网络

OSI七层协议?HTTP是网络七层协议中哪一层的协议?

学习计算机网络时我们一般采用折中的办法,也就是中和 OSI 和 TCP/IP 的优点,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚。
在这里插入图片描述
在这里插入图片描述

HTTP和 HTTPS的区别?

端口 :HTTP 的 URL 由“http://”起始且默认使用端口80,而HTTPS的URL由“https://”起始且默认使用端口443。

安全性和资源消耗: HTTP 协议运行在 TCP 之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源。

对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有 DES、AES 等;

非对称加密:密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有 RSA、DSA 等。

什么是分布式系统?它的主要优点是什么?

答案:分布式系统是由多个计算机节点组成的系统,这些节点通过网络连接,并协同工作以完成任务。它的主要优点包括:可扩展性、容错性、资源共享、以及提高性能。

什么是负载均衡?它的主要作用是什么?

答案:负载均衡是一种技术,通过分配网络流量到多个服务器,来提高网站、应用、数据库等的性能、可靠性和可扩展性。它的主要作用是防止任何单一服务器承受过多的负载,以及在服务器出现故障时保证服务的可用性。

TCP的可靠性如何保证?怎么保证错误重传?

应用数据被分割成 TCP 认为最适合发送的数据块。

TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。

校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。

TCP 的接收端会丢弃重复的数据。

流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)

拥塞控制: 当网络拥塞时,减少数据的发送。

ARQ 协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。

超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

HTTPS加密过程和原理?

在这里插入图片描述

什么是DNS?它是如何工作的?

DNS(域名系统)是一种用于将域名转换为IP地址的服务。当你在浏览器中输入一个URL时,DNS服务会将URL中的域名转换为对应的IP地址,然后浏览器才能通过IP地址访问网站。

DNS的工作过程包括:解析器向根服务器发送查询请求,根服务器将请求转发给顶级域服务器,顶级域服务器将请求转发给权威服务器,权威服务器返回对应的IP地址。

什么是NAT?它是如何工作的?

NAT(网络地址转换)是一种用于在局域网和互联网之间转换IP地址的技术。它可以使多个设备共享一个公网IP地址,从而节省IP地址资源。

NAT的工作过程包括:当内部网络的设备向外部网络发送数据时,NAT设备会将数据包中的源IP地址和端口号替换为公网IP地址和端口号,然后将数据包发送到外部网络;当外部网络的数据返回时,NAT设备会将数据包中的目的IP地址和端口号替换回原来的内部网络IP地址和端口号,然后将数据包发送到内部网络

什么是CAP定理?请解释每个字母的含义

CAP定理是分布式计算中的一个重要理论,它指出在一个分布式系统中,一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三个基本需求,无法同时满足。也就是说,最多只能满足其中的两项。

什么是RESTful API?它的主要优点是什么?

RESTful API是一种基于HTTP协议的API设计风格,它使用标准的HTTP方法,如GET、POST、PUT和DELETE。RESTful API的主要优点包括:简单易用、可扩展性强、性能好、适合于云计算等。

客户端为什么需要在 TIME-WAIT 状态等待 2MSL 时间才能进入 CLOSED 状态?

按照常理,在网络正常的情况下,四个报文段发送完后,双方就可以关闭连接进入 CLOSED 状态了,但是网络并不总是可靠的,如果客户端发送的 ACK 报文段丢失,服务器在接收不到 ACK 的情况下会一直重发 FIN 报文段,这显然不是我们想要的。因此客户端为了确保服务器收到了 ACK,会设置一个定时器,并在 TIME-WAIT 状态等待 2MSL 的时间,如果在此期间又收到了来自服务器的 FIN 报文段,那么客户端会重新设置计时器并再次等待 2MSL 的时间,如果在这段时间内没有收到来自服务器的 FIN 报文,那就说明服务器已经成功收到了 ACK 报文,此时客户端就可以进入 CLOSED 状态了。

TCP 粘包与拆包原因和解决方案?

1、 TCP 粘包和拆包的原因

我们知道 TCP 是以字节流的方式传输数据,传输的最小单位为一个报文段(segment)。TCP 首部 中有个选项 (Options)的字段,常见的选项为 MSS (Maximum Segment Size最大消息长度),它是收发双方协商通信时每一个报文段所能承载的最大有效数据的长度。数据链路层每次传输的数据有个最大限制MTU (Maximum Transmission Unit),一般是1500字节,超过这个量要分成多个报文段,MSS 则是这个最大限制减去 TCP 的首部,光是要传输的数据的大小,一般为1460字节。MSS = MTU - Header

TCP 为提高性能,发送端会将需要发送的数据发送到发送缓存,等待缓存满了之后,再将缓存中的数据发送到接收方。同理,接收方也有接收缓存这样的机制,来接收数据。

上面这些是发生 TCP 粘包和拆包的前提,下面是具体的原因:

要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。

待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。

应用程序写入数据小于剩余缓存大小,网卡将应用多次写入的数据先缓存起来,然后一起发送到网络上,这将会发生粘包。

接收数据端的应用层没有及时读取接收缓存中的数据,将发生粘包。

1、 TCP 粘包和拆包的解决方案

设置定长消息,服务端每次读取既定长度的内容作为一条完整消息。

设置消息边界,数据结尾尾增加特殊字符分割。

使用带消息头的协议,消息头存储消息开始标识及消息长度信息,接收方获取消息头的时候解析出消息长度,然后向后读取该长度的内容。

什么是ARP协议?它是如何工作的?

ARP(地址解析协议)是一种用于将IP地址转换为物理地址(如MAC地址)的协议。当主机需要将数据发送到另一台主机时,如果知道目标主机的IP地址,但不知道其物理地址,就需要使用ARP协议来获取物理地址。

ARP的工作过程包括:发送主机向网络广播一个ARP请求包,包含目标主机的IP地址;所有收到ARP请求的主机都会检查ARP请求中的IP地址,如果IP地址与自己的IP地址匹配,就会向发送主机发送一个ARP响应包,包含自己的物理地址;发送主机收到ARP响应后,就可以知道目标主机的物理地址,然后就可以将数据发送到目标主机。

操作系统

进程和线程的区别?

调度:进程是资源管理的基本单位,线程是程序执行的基本单位。

切换:线程上下文切换比进程上下文切换要快得多。

拥有资源: 进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的资源。

系统开销: 创建或撤销进程时,系统都要为之分配或回收系统资源,如内存空间,I/O设备等,OS所付出的开销显著大于在创建或撤销线程时的开销,进程切换的开销也远大于线程切换的开销。

并发和并行有什么区别?

并发就是在一段时间内,多个任务都会被处理;但在某一时刻,只有一个任务在执行。单核处理器可以做到并发。比如有两个进程A和B,A运行一个时间片之后,切换到B,B运行一个时间片之后又切换到A。因为切换速度足够快,所以宏观上表现为在一段时间内能同时运行多个程序。

并行就是在同一时刻,有多个任务在执行。这个需要多核处理器才能完成,在微观上就能同时执行多条指令,不同的程序被放到不同的处理器上运行,这个是物理上的多个进程同时进行。

什么是死锁?死锁产生的条件?

什么是死锁:

在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的讲就是两个或多个进程无限期的阻塞、相互等待的一种状态。

死锁产生的四个必要条件:(有一个条件不成立,则不会产生死锁)

互斥条件:一个资源一次只能被一个进程使用

请求与保持条件:一个进程因请求资源而阻塞时,对已获得资源保持不放

不剥夺条件:进程获得的资源,在未完全使用完之前,不能强行剥夺

循环等待条件:若干进程之间形成一种头尾相接的环形等待资源关系

如何处理死锁问题:

忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。

检测死锁并且恢复。

仔细地对资源进行动态分配,以避免死锁。

通过破除死锁四个必要条件之一,来防止死锁产生。

进程间通信方式有哪些

管道:管道这种通讯方式有两种限制,一是半双工的通信,数据只能单向流动,二是只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

管道可以分为两类:匿名管道和命名管道。匿名管道是单向的,只能在有亲缘关系的进程间通信;命名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。

信号 : 信号是一种比较复杂的通信方式,信号可以在任何时候发给某一进程,而无需知道该进程的状态。

信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

消息队列:消息队列是消息的链接表,包括Posix消息队列和System V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

Socket:与其他通信机制不同的是,它可用于不同机器间的进程通信。

优缺点:

管道:速度慢,容量有限;

Socket:任何进程间都能通讯,但速度慢;

消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题;

信号量:不能传递复杂消息,只能用来同步;

共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存。

进程有哪些状态?对应APP的生命周期?

进程一共有5种状态,分别是创建、就绪、运行(执行)、终止、阻塞。在这里插入图片描述
运行状态就是进程正在CPU上运行。在单处理机环境下,每一时刻最多只有一个进程处于运行状态。

就绪状态就是说进程已处于准备运行的状态,即进程获得了除CPU之外的一切所需资源,一旦得到CPU即可运行。

阻塞状态就是进程正在等待某一事件而暂停运行,比如等待某资源为可用或等待I/O完成。即使CPU空闲,该进程也不能运行

运行态→阻塞态:往往是由于等待外设,等待主存等资源分配或等待人工干预而引起的。阻塞态→就绪态:则是等待的条件已满足,只需分配到处理器后就能运行。运行态→就绪态:不是由于自身原因,而是由外界原因使运行状态的进程让出处理器,这时候就变成就绪态。例如时间片用完,或有更高优先级的进程来抢占处理器等。就绪态→运行态:系统按某种策略选中就绪队列中的一个进程占用处理器,此时就变成了运行态。

为什么虚拟地址空间切换会比较耗时?

进程都有自己的虚拟地址空间,把虚拟地址转换为物理地址需要查找页表,页表查找是一个很慢的过程,因此通常使用Cache来缓存常用的地址映射,这样可以加速页表查找,这个Cache就是TLB(translation Lookaside Buffer,TLB本质上就是一个Cache,是用来加速页表查找的)。

由于每个进程都有自己的虚拟地址空间,那么显然每个进程都有自己的页表,那么当进程切换后页表也要进行切换,页表切换后TLB就失效了,Cache失效导致命中率降低,那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢,而线程切换则不会导致TLB失效,因为线程无需切换地址空间,因此我们通常说线程切换要比较进程切换块,原因就在这里。

什么是内存分页?内存分页的作用?

为什么要分页

分段的内存碎片太大,是计算中发展过程中尝试过的方案,现在的方案是内存分页,通过某种方式,将虚拟地址映射到物理地址,映射的关系是通过一张表实现的,也就是页表。

在这里插入图片描述
分页机制

分页机制的思想是:通过映射,可以使连续的线性地址与物理地址相关联,逻辑上连续的线性地址对应的物理地址可以不连续。 分页的作用 - 将线性地址转换为物理地址 - 用大小相同的页替换大小不同的段

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值