无经验计科应届生面试java开发岗遇到的问题整理【未完待续】

java基础

1、静态变量和实例变量的区别
存储位置:
静态变量(类变量):被所有类的对象共享,存储在方法区(Java 8之前)或者元空间(Java 8及以后)中。只有一份副本,无论创建了多少个对象。
实例变量(成员变量):每个对象都有一份实例变量的拷贝,存储在堆内存中,与对象的生命周期相关联。
内存分配:
静态变量在类加载时被初始化,并且可以通过类名直接访问。
实例变量则在对象被创建时被初始化,需要通过对象引用来访问。
生命周期:
静态变量的生命周期与类相同,当类被卸载时才会被销毁。
实例变量的生命周期与对象相同,当对象被销毁时,实例变量也会被销毁。
访问方式:
静态变量可以通过类名直接访问
实例变量需要通过对象引用来访问
共享性:
静态变量是所有对象共享的,当一个对象修改了静态变量,其他对象也会受到影响。
实例变量是每个对象独立拥有的,一个对象修改了实例变量,不会影响其他对象。
2、arraylist和linklist的区别
底层数据结构:
ArrayList:基于动态数组实现,内部使用数组来存储元素。当数组容量不足时,会自动进行扩容。
LinkedList:基于双向链表实现,每个元素都包含对前一个和后一个元素的引用。
插入和删除操作的效率:
ArrayList:随机访问效率高,因为可以通过索引直接访问元素,但在插入和删除元素时需要移动其他元素,效率较低,尤其是在数组末尾之外的位置。
LinkedList:插入和删除操作效率高,因为只需要调整相邻节点的引用,不需要移动大量元素。但是随机访问效率较低,因为需要从头或者尾节点开始遍历。
空间占用:
ArrayList:由于使用数组存储元素,所以需要连续的内存空间,当数组容量不足时需要进行扩容,可能会导致内存碎片。
LinkedList:每个元素都需要额外的空间来存储前后节点的引用,因此相比ArrayList,LinkedList需要更多的内存空间。
迭代器性能:
ArrayList:通过迭代器遍历时效率较高,因为可以通过索引直接访问元素。
LinkedList:虽然插入和删除操作的效率高,但是通过迭代器遍历时效率较低,因为需要从头或者尾节点开始遍历。
适用场景:
ArrayList:适用于频繁访问元素、较少进行插入和删除操作的场景。
LinkedList:适用于频繁进行插入和删除操作、不需要频繁随机访问元素的场景。
3、hashmap底层原理
HashMap是Java集合框架中的一个重要实现,它基于哈希表(Hash Table)实现。哈希表是一种高效的数据结构,通过将键(key)映射到值(value)的方式来存储和检索数据。
哈希函数:
当元素被添加到HashMap中时,HashMap会根据元素的键(key)计算出一个哈希码(hash code)。这个哈希码通常是一个整数,它的目的是将键映射到HashMap内部数组的索引位置上。
数组存储:
HashMap内部维护一个数组,称为哈希桶数组(hash bucket array)。数组的每个元素称为桶(bucket),每个桶可以存放一个链表(或者红黑树,在Java 8之后的版本中引入)。
解决哈希冲突:
当不同的键经过哈希函数计算后映射到了相同的索引位置上时,会发生哈希冲突。HashMap通过在每个桶中存储一个链表(或者红黑树)来解决哈希冲突。当多个键映射到同一个桶时,它们会被存储在同一个桶的链表中,从而形成一个链表结构。在Java 8之后的版本中,当链表的长度达到一定阈值时,链表会被转换成红黑树,以提高查找效率。
键值对存储:
每个桶中存储的是键值对(key-value pair),键值对以节点的形式存储在链表中。在Java 8之后的版本中,当链表转换成红黑树后,键值对会以红黑树节点的形式存储。
扩容和重新哈希:
当HashMap中的元素数量超过了负载因子(load factor)乘以数组大小时,HashMap会进行扩容操作。扩容会创建一个更大的数组,并将所有已有的键值对重新分配到新数组的桶中。扩容操作可能会导致哈希码重新计算,即重新哈希。这是因为扩容后,新数组的大小通常会改变,而哈希函数通常是将键映射到数组大小范围内的索引,因此需要重新计算哈希码以适应新的数组大小。
总的来说,HashMap通过哈希函数将键映射到数组的索引位置上,并通过解决哈希冲突和链表(或红黑树)存储键值对来实现高效的数据存储和检索。
4、equals和= =的区别
==运算符:
= =用于比较两个对象的引用是否相同,即它们是否指向内存中的同一个对象。
当使用= =比较基本数据类型时,比较的是它们的值。
当使用==比较引用类型时,比较的是它们在内存中的存储地址是否相同。
equals() 方法:
equals()方法用于比较两个对象的内容是否相同,即它们是否表示相同的数据。
equals()方法通常在Object类中被定义,子类可以重写该方法以实现自定义的相等比较逻辑。
5、this关键字的用处和底层原理
区分局部变量和实例变量:
在构造方法中调用其他构造方法:
返回当前对象的引用
底层上,编译器会在编译时将this关键字替换为对当前对象的引用。在Java虚拟机(JVM)运行时,this关键字被翻译成对当前对象的引用,这样代码就能够正确地引用到实例变量、构造方法等。
6、字符串的拼接在底层是怎么实现的
在底层,Java编译器会对字符串的拼接操作进行优化,尤其是使用加号(+)进行拼接时。一般来说,如果在代码中连续使用加号进行字符串拼接,编译器会将其优化为使用StringBuilder或StringBuffer来拼接字符串,然后再将结果转换为String对象。这是因为StringBuilder和StringBuffer是可变的,可以在内部进行高效的字符串拼接操作。

springMVC、spring、springboot

1、什么是springMVC
MVC 架构:
Model(模型):代表应用程序的数据模型或业务逻辑。通常包括实体对象、服务和数据访问对象(DAO)等。
View(视图):用于渲染用户界面的部分,通常是 HTML 页面或者模板。
Controller(控制器):接受用户的请求,并将请求转发给适当的处理程序(如服务类或数据访问对象)。控制器还负责将处理程序返回的数据传递给视图进行渲染。
核心组件:
DispatcherServlet:是 Spring MVC 的前端控制器,负责接收所有的客户端请求,并将请求分发给适当的处理程序。
HandlerMapping:用于将请求映射到适当的处理程序(Controller)。
HandlerAdapter:负责将请求委派给处理程序,并处理适当的参数绑定、数据验证等任务。
ViewResolver:用于将逻辑视图名称解析为实际的视图对象,以便进行渲染。
2、session和cookie的区别
存储位置:
Cookie:存储在客户端(浏览器)中,以文本文件的形式保存在客户端的文件系统中。
Session:存储在服务器端,通常存储在服务器的内存中,也可以选择存储在数据库或者文件系统中。
安全性:
Cookie:相对不安全,因为它存储在客户端,用户可以查看和修改Cookie的内容。
Session:相对安全,因为数据存储在服务器端,用户无法直接查看或修改会话数据。
容量限制:
Cookie:每个Cookie的大小通常受到浏览器的限制,一般为4KB左右。每个域名下的Cookie数量也有限制。
Session:由于存储在服务器端,理论上没有容量限制,但是实际上会受到服务器内存的限制。
生命周期:
Cookie:可以设置Cookie的过期时间,可以是会话级的(浏览器关闭时失效)或持久性的(在指定的时间之后失效)。
Session:通常与用户的会话期间相关联,当用户关闭浏览器或超过一定时间没有活动时会话会过期并被销毁。
使用方式:
Cookie:可以通过JavaScript或服务器端设置响应头来创建、读取和删除Cookie。
Session:通常由服务器端的代码创建和管理,可以通过Web框架提供的API来访问和操作Session对象。
综上所述,Session通常比Cookie更安全,且可以存储更多的数据,但它需要占用服务器资源。在选择使用哪种机制时,需要根据具体的需求和安全要求进行权衡。通常情况下,Session适用于需要保密性较高的敏感数据,而Cookie适用于跟踪用户状态和提供个性化服务。

计算机网络

1、计算机网络模型(七层&四层)
osi七层
物理层(Physical Layer):负责传输比特流,定义了物理介质、电信号和传输速率等物理特性。
数据链路层(Data Link Layer):提供了数据传输的可靠性和错误检测,将数据分割成帧并添加地址,实现了点对点的数据传输。
网络层(Network Layer):负责在不同的网络之间进行路由选择和转发,实现了不同网络之间的通信。
传输层(Transport Layer):负责端到端的数据传输,提供了数据传输的可靠性和流量控制,如 TCP 和 UDP 协议。
会话层(Session Layer):负责建立、管理和终止会话连接,实现了不同应用程序之间的通信。
表示层(Presentation Layer):负责数据的格式转换、加密和压缩等操作,实现了数据的语法和语义转换。
应用层(Application Layer):提供了各种网络应用服务,如 HTTP、FTP、SMTP 等。

TCP/IP 模型(Transmission Control Protocol/Internet Protocol Model,传输控制协议/互联网协议模型):
TCP/IP 模型是实际网络中使用最广泛的模型,由美国国防部(DoD)在 1970 年代提出,分为四层。
应用层(Application Layer):对应 OSI 模型的应用层、表示层和会话层,提供了各种网络应用服务。
传输层(Transport Layer):对应 OSI 模型的传输层,提供了端到端的数据传输服务,如 TCP 和 UDP 协议。
网络层(Internet Layer):对应 OSI 模型的网络层,负责在不同的网络之间进行路由选择和转发。
链路层(Link Layer):对应 OSI 模型的数据链路层和物理层,负责实现数据帧的传输和物理介质的控制。

2、http和https的区别
HTTP(Hypertext Transfer Protocol)和HTTPS(Hypertext Transfer Protocol Secure)是用于在客户端和服务器之间传输数据的两种协议,它们之间有以下主要区别:

安全性:
HTTP:是一种不安全的传输协议,所有传输的数据都是明文的,容易被中间人攻击者截取、窃取和篡改。
HTTPS:是在HTTP基础上使用SSL/TLS协议进行加密的安全传输协议,可以保护传输的数据安全性,防止中间人攻击和窃取信息。
加密方式:
HTTP:数据在传输过程中是明文的,不进行加密处理。
HTTPS:使用SSL/TLS协议对数据进行加密处理,通过证书验证服务器的身份,并加密传输数据,确保数据的完整性和安全性。
端口号:
HTTP:默认使用端口号80进行通信。
HTTPS:默认使用端口号443进行通信。
性能:
HTTP:由于不涉及加密解密的过程,通常比HTTPS传输速度快。
HTTPS:由于需要进行加密解密的过程,传输速度相对较慢,尤其是在大量并发请求的情况下会有一定的性能损耗。
信任度:
HTTP:不提供身份验证和数据加密,无法验证服务器的真实性,容易遭受中间人攻击。
HTTPS:通过SSL/TLS协议进行加密传输,能够验证服务器的身份,提供更高的信任度和安全性。

3、tcp udp的区别
TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种不同的传输层协议,它们之间有以下主要区别:

连接性:
TCP:提供面向连接的服务。在数据传输之前,需要先建立连接,然后进行数据传输,最后再释放连接。
UDP:属于无连接的协议。在数据传输之前不需要建立连接,可以直接发送数据包,每个数据包都是独立的,不依赖于之前的数据包。
可靠性:
TCP:提供可靠的数据传输服务。通过序列号、确认应答、重传机制等保证数据的可靠性和顺序性,确保数据不丢失、不重复、不损坏。
UDP:不提供可靠性保证。由于无连接的特性,UDP不进行数据重传或确认应答,因此数据传输可能会丢失、重复或损坏。
传输方式:
TCP:提供面向字节流的传输方式。数据被分割成 TCP 数据段(segment)进行传输,保证了数据的顺序性。
UDP:提供面向数据包的传输方式。每个数据包(datagram)都是独立的,不依赖于之前的数据包,因此无法保证数据的顺序性。
头部开销:
TCP:头部开销较大,包含序列号、确认应答、窗口大小等字段,用于实现可靠的数据传输。
UDP:头部开销较小,只包含源端口、目标端口、长度和校验和等字段,用于实现数据传输的基本功能。
适用场景:
TCP:适用于要求可靠数据传输和顺序传输的应用场景,如网页浏览、文件传输、邮件发送等。
UDP:适用于对传输速度要求较高、数据丢失不敏感的应用场景,如实时音视频传输、在线游戏等。

4、三次握手四次挥手
三次握手和四次挥手是TCP协议中用于建立和断开连接的过程,具体如下:

三次握手(Three-Way Handshake)
客户端向服务器端发送连接请求:
客户端发送一个带有SYN(同步)标志的数据包给服务器,请求建立连接。
服务器响应:
服务器收到客户端的连接请求后,会发送一个带有SYN/ACK标志的数据包给客户端,表示接受连接请求,并请求确认客户端的请求。
客户端确认:
客户端收到服务器的响应后,会发送一个带有ACK标志的数据包给服务器,表示确认服务器的请求。
这样,客户端和服务器之间的连接就建立起来了,可以开始进行数据传输。

四次挥手(Four-Way Handshake)
客户端发送断开连接请求:
客户端发送一个带有FIN(结束)标志的数据包给服务器,表示请求断开连接。
服务器收到断开请求:
服务器收到客户端的断开请求后,会发送一个带有ACK标志的数据包给客户端,表示确认收到客户端的断开请求。
服务器向客户端发送断开连接请求:
服务器发送一个带有FIN标志的数据包给客户端,表示服务器也请求断开连接。
客户端确认断开请求:
客户端收到服务器的断开请求后,会发送一个带有ACK标志的数据包给服务器,表示确认收到服务器的断开请求。

操作系统

1、内核是什么
内核通常指的是操作系统的核心部分,是操作系统的主要组成部分之一。内核负责管理计算机的硬件资源,并提供各种系统调用接口,使用户程序能够访问硬件资源和执行特权操作。
内核的功能包括但不限于以下几个方面:

进程管理:负责创建、调度和管理进程(程序的执行实例),包括进程的创建、销毁、调度、同步和通信等。
内存管理:管理计算机的内存资源,包括内存的分配、释放、地址映射和虚拟内存等。
文件系统:负责管理计算机上的文件和目录,包括文件的创建、删除、读写和权限控制等操作。
设备管理:管理计算机的硬件设备,包括设备的驱动程序管理、设备的访问控制和设备的中断处理等。
系统调用接口:提供给用户程序访问内核功能的接口,用户程序可以通过系统调用接口请求内核执行特定的操作,如文件操作、进程管理和网络通信等。

总的来说,内核是操作系统的核心部分,负责管理计算机的各种硬件资源和提供系统调用接口,是操作系统与硬件之间的桥梁,为用户程序提供了一个统一的、安全的和易于使用的环境。

2、死锁是什么
死锁(Deadlock)是指在并发系统中,两个或多个进程或线程互相持有对方所需要的资源,导致它们都无法继续执行,从而陷入了一种僵局状态。

死锁通常发生在多个进程或线程相互竞争有限资源的情况下,它们都在等待对方释放资源,但同时又不释放自己持有的资源,因此无法继续执行。典型的死锁情况包括以下几个条件:

互斥条件:进程或线程对资源的访问是排他性的,即同一时刻只能有一个进程或线程访问资源。
持有和等待条件:进程或线程至少持有一个资源,并且在等待获取另一个资源时继续持有已有的资源。
非抢占条件:资源不能被强制性地从持有者手中夺取,只能在持有者主动释放时才能被其他进程或线程获取。
循环等待条件:存在一个进程或线程的资源请求链形成一个循环,其中每个进程或线程都在等待下一个进程或线程所持有的资源。

3、如何解决死锁问题
预防死锁:
破坏互斥条件:允许多个进程或线程同时访问资源,而不是排他性地访问资源。
破坏持有和等待条件:要么一次性获取所有需要的资源,要么释放已持有的资源再重新申请。
破坏非抢占条件:允许操作系统强制地从进程或线程手中夺取资源。
破坏循环等待条件:规定资源的获取顺序,按照统一的顺序请求资源,从而避免循环等待。
避免死锁:
银行家算法:通过合理地分配资源,确保在任何时刻都不会出现死锁的发生。
资源分配图:维护资源分配图,并根据图的状态判断是否有可能发生死锁,若有则采取相应的措施避免死锁。
检测与恢复:
死锁检测:周期性地检查系统的资源分配情况,判断是否发生了死锁。
死锁恢复:一旦发现死锁,采取相应的措施解除死锁,如终止死锁进程、回滚操作、撤销资源分配等。
避免资源独占:
资源共享:尽量使用共享资源,减少独占资源的情况。
资源复制:对于只读的资源,可以复制多份,每个进程或线程都有自己的一份副本,从而避免竞争和死锁。

4、线程的生命周期
新建状态(New):
当一个线程对象被创建时,它处于新建状态。此时线程已经被创建,但尚未启动。
就绪状态(Runnable):
当一个线程处于就绪状态时,表示线程已经准备好运行,但由于其他线程正在执行,因此当前线程暂时无法执行。处于就绪状态的线程会进入线程调度器的等待队列,等待获取CPU时间片。
运行状态(Running):
当线程获取到CPU时间片并开始执行时,处于运行状态。此时线程正在执行其任务代码。
阻塞状态(Blocked):
当线程因为某些原因(如等待I/O操作、等待获取锁、等待条件满足等)暂时无法执行时,会进入阻塞状态。在阻塞状态下,线程不会占用CPU资源,也不会参与调度。
等待状态(Waiting):
当线程因为某些条件(如调用了Object.wait()方法、Thread.join()方法、LockSupport.park()方法等)而进入等待状态时,会等待其他线程的通知或条件满足后再继续执行。
超时等待状态(Timed Waiting):
与等待状态类似,但超时等待状态在等待一定时间后会自动返回,而不需要其他线程的通知。
终止状态(Terminated):
当线程执行完其任务代码或发生了未捕获的异常导致线程异常终止时,线程进入终止状态。处于终止状态的线程不再运行,并且不可再次启动。

5、进程的上下文切换

进程之间的上下文切换是指在操作系统中,CPU从一个进程切换到另一个进程时,需要保存当前进程的上下文(包括寄存器状态、程序计数器、内存映射表等信息),并加载下一个进程的上下文,以便下一个进程继续执行。
上下文切换是操作系统进行多任务处理的基本机制,它可以实现多个进程之间的轮流执行,从而实现并发执行的效果。上下文切换通常发生在以下几种情况下:

时间片用尽:当前进程的时间片已经用尽,需要切换到下一个进程执行。
等待I/O完成:当前进程发起了I/O操作,需要等待I/O操作完成后再继续执行。
进程调度:操作系统的调度算法决定了下一个应该执行的进程。
中断处理:处理器接收到了硬件中断或软件中断信号,需要切换到相应的中断处理程序执行。
在上下文切换过程中,需要保存当前进程的上下文信息到内存中的进程控制块(Process Control Block,PCB)中,然后加载下一个进程的上下文信息到CPU中,使其开始执行。上下文切换的开销是比较大的,因为需要保存和恢复大量的上下文信息,包括寄存器状态、内存映射表等,因此需要尽量减少上下文切换的次数,以提高系统的性能和效率。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值