• 9月9日扒面经


    堆和栈的区别?
    1. 分配方式:堆内存是由程序员手动分配和释放的,而栈内存是由编译器自动分配和释放的。
    2. 内存管理:堆内存需要手动管理内存的分配和释放,程序员需要显式地调用malloc()或new来分配内存,并使用free()或delete来释放内存。而栈内存的分配和释放是由编译器自动完成的,无需手动管理。
    3. 存储内容:堆内存主要用于存储动态分配的对象和数据结构,它的生命周期可以长至整个程序的运行期间。而栈内存主要用于存储局部变量和函数调用的上下文,它的生命周期随着函数的调用和返回而动态变化。
    4. 内存结构:堆内存是一个大的连续内存块,它的分配和释放是比较灵活的,可以动态增长或缩小。而栈内存是一个固定大小的内存区域,它的大小在程序编译期间就已经确定。
    5. 访问速度:由于栈内存的分配和释放是由编译器自动完成的,所以栈内存的访问速度比堆内存更快。而堆内存的分配和释放需要额外的时间开销。
    Java对象存储在堆中还是栈中?

    存储在堆中,堆内存用于存储动态分配的对象和数据结构

    栈内存主要用于存储局部变量和方法调用的上下文

    Java中基本类型和方法的局部变量存储在栈中,它们的值存储在栈帧中,不需要进行垃圾回收,而对象的引用和实例变量则存储在堆内存中,有垃圾回收机制进行自动回收。

    写一个static main方法,能调用非静态方法吗?

    可以,必须有类对象实例可以调用

    静态方法和非静态方法的区别
    1. 调用方式:静态方法可以直接通过类名调用,而非静态方法需要通过对象实例来调用。
    2. 内存分配:静态方法在类加载时就已经被分配到方法区(Method Area)中,而非静态方法在对象实例化时才被分配到堆(Heap)中。
    3. 访问权限:静态方法可以直接访问类的静态成员(静态变量和静态方法),而非静态方法可以访问类的静态成员和非静态成员(实例变量和非静态方法)。
    4. this关键字:静态方法中不能使用this关键字,因为this指向当前对象实例,而静态方法没有对象实例。非静态方法可以使用this关键字,可以引用当前对象实例。
    5. 重写(Override):静态方法不能被重写,因为静态方法是与类关联的,而非静态方法可以被子类重写。
    6. 静态绑定和动态绑定:静态方法是静态绑定的,即在编译时就确定了调用的方法,而非静态方法是动态绑定的,即在运行时根据对象实例的类型确定调用的方法。
    说说hash冲突?

    哈希冲突是两个或多个不同的键值对被映射到了相同的哈希桶。因为哈希函数的映射范围有限,而键的数量可能是无限的。

    可能导致:数据丢失,性能下降(链表链化很长,查找,插入删除效率低)

    解决方法:1.链地址法:将哈希桶冲突的键值对组织成链表,每个哈希桶存储一个链表。当发生哈希冲突,新的键值对会被插入到对应哈希桶的链表中

    开发地址法:当发生哈希冲突时,通过一定的方法,在哈希表中寻找下一个可用的位置来存储

    再哈希法:使用另一个哈希函数重新计算键的哈希值,然后将键值对存储到新的哈希桶中。

    CAS了解吗?

    比较并交换

    CAS操作通常包含三个参数:内存地址(或者变量的引用)、预期值和新值。

    CAS操作的执行过程:

    1.读取内存中的值(旧值)

    2.比较旧值与预期值是否相等。如果相等,则执行第4步;如果不相等,则执行第三步。

    3.重新读取内存中的值,并重复第2步。

    4.将新值写入内存。

    特点:
    • 原子性:CAS 是一种原子性操作,执行完整个 CAS 操作过程不会被其他线程中断。
    • 比较并交换:CAS 操作通过比较内存位置的值与预期值、然后交换新值来实现更新操作。
    • 避免锁竞争:CAS 操作是无锁算法,提供了一种无需使用互斥锁(synchronized 或 Lock)来同步访问共享资源的机制。
    • 乐观并发控制:CAS 是一种乐观的并发控制机制,它假设并发冲突很少发生,减少了锁带来的开销。
    AtomicInteger原子类

    提供了一组线程安全的原子操作方法,保证对int值操作具有原子性,通过使用内部的 CAS(Compare and Swap)操作保证了线程安全

    having和where区别

    where用于删选行级数据,即select,delete之前对记录过滤

    having用于对分组之后(group by)的数据筛选

    如果让你设计数据库,怎么优化

    合理的表机构,字段类型,合理使用缓存

    慢查询怎么实现

    慢查询日志

    http和tcp的区别,分别在哪一层
    http(超文本传输协议):

    应用层协议,是网络协议栈的第七层

    一种在客户端和服务器之间传输的超文本数据协议

    HTTP是无状态的,每个请求和响应都是独立的,服务器不会保留之前的状态信息。

    tcp(传输控制层协议):

    是传输层协议,位于网络协议栈的第四层

    面向连接,提供可靠的传输

    三次握手

    第一次握手:

    客户端发送一个带有SYN标志的TCP报文段给服务器,表示客户端请求建立连接。

    客户端选择一个随机的初始化序列号(ISN)并发送给服务器,用于后续数据传输的序列号标识。

    第二次握手:

    服务器收到客户端的SYN报文段后,如果同意建立,则发送SYN和ACK(确认)报文段给客户端。

    服务器也选择一个随机的初始化序列号,并将确认序号设置为客户端的ISN+1.

    第三次握手

    客户端收到服务器的SYN+ACK报文段,然后向服务器发送一个ACK确认包进行确认,客户端将确认序号设置为服务器的ISN+1,同时将序列号设置为自己的ISN+1;

    如何使用HTTP向客户端推送消息?

    两种方法:

    1. 长轮询:
      • 客户端发送一个HTTP请求到服务器,请求中包含一个标识客户端的唯一标识符。
      • 服务器接收到请求后,检查是否有新消息。
      • 如果有新消息,服务器立即返回响应,包含新消息内容。
      • 如果没有新消息,服务器保持连接打开,等待有新消息或者超时。
      • 客户端收到响应后,处理接收到的消息,并再次发送请求,以便持续接收服务器的推送消息。
    2. 服务器推送:
      • 客户端发送一个HTTP请求到服务器,请求中包含一个标识客户端的唯一标识符。
      • 服务器接收到请求后,检查是否有新消息。
      • 如果有新消息,服务器主动推送消息给客户端,不需要客户端发起新的请求。
      • 客户端收到推送的消息后,处理接收到的消息。
    IOC的基本功能?

    对象的创建和管理

    依赖注入:解决对象与对象之间的依赖关系,通过构造函数注入、属性注入或者方法注入来实现。

    IOC的基本功能是通过将对象的创建、管理和依赖注入的控制权交给容器中,从而降低应用程序的耦合度,提高代码的可维护性和可测试性。

    从用户输入url到前端显示,经历了哪些步骤?

    DNS解析;客户端三次握手与服务端建立TCP连接;客户端发起HTTP请求;服务器处理请求并响应,接收响应,渲染页面。

    类加载过程?

    加载、验证、准备、解析、初始化、使用

    Java比C能实现跨平台的原因?

    Java程序在运行时,会先将java执行为.class的字节码文件,字节码是一种与具体平台无关的中间代码,它可以在任何支持Java虚拟机(JVM)的平台上运行。

    平台无关的API ,内存管理

    双亲委派机制,作用?

    需要子类处理的任务,子类把它交给父类去处理,父类处理不了,子类再去处理。

    同一个类只加载一个,避免被重复加载

    可以防止恶意伪装或篡改核心库的类API

    抽象类和接口的区别?

    抽象类中可以有具体方法和抽象方法,而接口中只能有抽象方法,在JDK1.8后有默认方法

    抽象类只能单继承,接口可以多实现

    抽象类可以有构造方法,接口不行

    方法修饰可以除private都可

    乐观锁和悲观锁区别?

    乐观锁是认为其他线程不会修改资源,不会加锁,但在更新数据时检查数据使用版本号或者CAS(Compare and Swap)操作来保证数据的一致性。才会去加锁。

    悲观锁是认为每个线程都会对共享资源进行修改,所以在访问共享资源前,会先加锁,其他线程就无法修改,知道线程完成操作。悲观锁的经典应用是数据库中的行锁和表锁,以及Java中的synchronized关键字。

    悲观锁适用于并发写操作较多的场景,乐观锁适用于并发读操作较多的场景。

    ??行级锁的死锁场景?

    假设有两个事务T1和T2,同时对表中的两行数据进行更新操作。

    1. 事务T1首先获取了行A的行级锁,并且在更新行A的数据。
    2. 同时,事务T2也获取了行B的行级锁,并且在更新行B的数据。
    3. 事务T1在更新行A的过程中,需要获取行B的行级锁才能继续执行后续操作。
    4. 事务T2在更新行B的过程中,需要获取行A的行级锁才能继续执行后续操作。

    在这个场景中,事务T1持有行A的行级锁并等待行B的行级锁,而事务T2持有行B的行级锁并等待行A的行级锁。由于两个事务互相等待对方持有的行级锁,导致两个事务都无法继续执行,形成死锁。

    TCP、UDP的区别和各自的使用场景?

    TCP 面向连接、需要可靠性和完整性的数据传输

    UDP 无连接、需要低延迟的应用,如实时视频、音频通话等

    项目中有没有用到多态?你是怎么用到的,详细讲讲?

    电商系统,产品类(产品打折的方法),继承产品类的图书类,手机类,子类(重新产品打折的方法,不同的折扣)

    在购物车计算商品价格时,根据子类对象的不同来计算每个商品的价格。

    进程和线程的区别?

    进程是系统资源分配的单位,线程是Cpu调度的单位,

    线程是进程的一个执行单元,一个进程中有很多线程。

    实现线程的方式?

    继承Thread类;实现Runnable接口,Callable接口,线程池

    Runnable和callable的区别?

    Runnable中的run方法没有返回值,不能抛出受检查异常,通过Thread类来创建线程

    callable中的call方法有返回值,可以抛出授检查异常,通过ExecutorService的submit()方法来提交任务,并一个Future对象

    三次握手

    SYN: 建立连接的标识

    seq; 序列号 用于标识数据流的顺序和完整性

    ACK: 应答标识 表示对另一端点的连接请求的确认

    ACKnum: 确认号

    第一次握手: 客户端发出 SYN seq=x

    第二次握手: 服务端回应 SYN=1 ACK=1 seq =y ack=x+1

    第三次握手: 客户端回应 ACK=1 seq =x+1 ack=y+1

    四次挥手

    假设由客户端发送断开请求

    第一次挥手 客户端发送 FIN=1 seq=u

    第二次挥手 服务端发送 ACK=1 seq=v ack=u+1

    第三次挥手 服务端发送 FIN=1 ACK=1 seq=w ack=u+1

    第四次挥手 客户端发送 ACK=1 seq=u+1 ack=w+1

  • 相关阅读:
    【无人机路径规划】基于改进差分算法实现三维多无人机协同航迹规划附matlab代码
    设计模式之观察者模式
    Python问答题(更新中)
    Android Theme主题属性资源定义说明及示例
    Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、等业务的企业
    Apache Commons Configuration远程代码执行漏洞(CVE-2022-33980)分析&复现
    Relational Triplet Extraction(RTE)
    LeetCode 2731. 移动机器人:脑筋急转弯
    三、go微服务项目“商城项目实战开发”用户管理user-web端编写和登录校验
    内存卡里的照片删了怎么恢复?
  • 原文地址:https://blog.csdn.net/m0_61943950/article/details/132782809