宜都网站制作,以公司做网站,ai可以用来做网站吗,wordpress怎么加标题堆和栈的区别#xff1f;
分配方式#xff1a;堆内存是由程序员手动分配和释放的#xff0c;而栈内存是由编译器自动分配和释放的。内存管理#xff1a;堆内存需要手动管理内存的分配和释放#xff0c;程序员需要显式地调用malloc()或new来分配内存#xff0c;并使用fre…堆和栈的区别
分配方式堆内存是由程序员手动分配和释放的而栈内存是由编译器自动分配和释放的。内存管理堆内存需要手动管理内存的分配和释放程序员需要显式地调用malloc()或new来分配内存并使用free()或delete来释放内存。而栈内存的分配和释放是由编译器自动完成的无需手动管理。存储内容堆内存主要用于存储动态分配的对象和数据结构它的生命周期可以长至整个程序的运行期间。而栈内存主要用于存储局部变量和函数调用的上下文它的生命周期随着函数的调用和返回而动态变化。内存结构堆内存是一个大的连续内存块它的分配和释放是比较灵活的可以动态增长或缩小。而栈内存是一个固定大小的内存区域它的大小在程序编译期间就已经确定。访问速度由于栈内存的分配和释放是由编译器自动完成的所以栈内存的访问速度比堆内存更快。而堆内存的分配和释放需要额外的时间开销。
Java对象存储在堆中还是栈中
存储在堆中堆内存用于存储动态分配的对象和数据结构
栈内存主要用于存储局部变量和方法调用的上下文
Java中基本类型和方法的局部变量存储在栈中它们的值存储在栈帧中不需要进行垃圾回收而对象的引用和实例变量则存储在堆内存中有垃圾回收机制进行自动回收。
写一个static main方法能调用非静态方法吗?
可以必须有类对象实例可以调用
静态方法和非静态方法的区别
调用方式静态方法可以直接通过类名调用而非静态方法需要通过对象实例来调用。内存分配静态方法在类加载时就已经被分配到方法区Method Area中而非静态方法在对象实例化时才被分配到堆Heap中。访问权限静态方法可以直接访问类的静态成员静态变量和静态方法而非静态方法可以访问类的静态成员和非静态成员实例变量和非静态方法。this关键字静态方法中不能使用this关键字因为this指向当前对象实例而静态方法没有对象实例。非静态方法可以使用this关键字可以引用当前对象实例。重写Override静态方法不能被重写因为静态方法是与类关联的而非静态方法可以被子类重写。静态绑定和动态绑定静态方法是静态绑定的即在编译时就确定了调用的方法而非静态方法是动态绑定的即在运行时根据对象实例的类型确定调用的方法。
说说hash冲突
哈希冲突是两个或多个不同的键值对被映射到了相同的哈希桶。因为哈希函数的映射范围有限而键的数量可能是无限的。
可能导致数据丢失性能下降(链表链化很长查找插入删除效率低)
解决方法1.链地址法将哈希桶冲突的键值对组织成链表每个哈希桶存储一个链表。当发生哈希冲突新的键值对会被插入到对应哈希桶的链表中
开发地址法当发生哈希冲突时通过一定的方法在哈希表中寻找下一个可用的位置来存储
再哈希法使用另一个哈希函数重新计算键的哈希值然后将键值对存储到新的哈希桶中。
CAS了解吗
比较并交换
CAS操作通常包含三个参数内存地址(或者变量的引用)、预期值和新值。
CAS操作的执行过程
1.读取内存中的值(旧值)
2.比较旧值与预期值是否相等。如果相等则执行第4步如果不相等则执行第三步。
3.重新读取内存中的值并重复第2步。
4.将新值写入内存。
特点
原子性CAS 是一种原子性操作执行完整个 CAS 操作过程不会被其他线程中断。比较并交换CAS 操作通过比较内存位置的值与预期值、然后交换新值来实现更新操作。避免锁竞争CAS 操作是无锁算法提供了一种无需使用互斥锁synchronized 或 Lock来同步访问共享资源的机制。乐观并发控制CAS 是一种乐观的并发控制机制它假设并发冲突很少发生减少了锁带来的开销。
AtomicInteger原子类
提供了一组线程安全的原子操作方法,保证对int值操作具有原子性,通过使用内部的 CASCompare and Swap操作保证了线程安全
having和where区别
where用于删选行级数据即select,delete之前对记录过滤
having用于对分组之后(group by)的数据筛选
如果让你设计数据库怎么优化
合理的表机构字段类型合理使用缓存
慢查询怎么实现
慢查询日志
http和tcp的区别分别在哪一层
http(超文本传输协议):
应用层协议,是网络协议栈的第七层
一种在客户端和服务器之间传输的超文本数据协议
HTTP是无状态的每个请求和响应都是独立的服务器不会保留之前的状态信息。
tcp(传输控制层协议)
是传输层协议位于网络协议栈的第四层
面向连接提供可靠的传输
三次握手
第一次握手
客户端发送一个带有SYN标志的TCP报文段给服务器表示客户端请求建立连接。
客户端选择一个随机的初始化序列号(ISN)并发送给服务器,用于后续数据传输的序列号标识。
第二次握手
服务器收到客户端的SYN报文段后如果同意建立则发送SYN和ACK(确认)报文段给客户端。
服务器也选择一个随机的初始化序列号并将确认序号设置为客户端的ISN1.
第三次握手
客户端收到服务器的SYNACK报文段然后向服务器发送一个ACK确认包进行确认客户端将确认序号设置为服务器的ISN1,同时将序列号设置为自己的ISN1;
如何使用HTTP向客户端推送消息
两种方法
长轮询 客户端发送一个HTTP请求到服务器请求中包含一个标识客户端的唯一标识符。服务器接收到请求后检查是否有新消息。如果有新消息服务器立即返回响应包含新消息内容。如果没有新消息服务器保持连接打开等待有新消息或者超时。客户端收到响应后处理接收到的消息并再次发送请求以便持续接收服务器的推送消息。 服务器推送 客户端发送一个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同时对表中的两行数据进行更新操作。
事务T1首先获取了行A的行级锁并且在更新行A的数据。同时事务T2也获取了行B的行级锁并且在更新行B的数据。事务T1在更新行A的过程中需要获取行B的行级锁才能继续执行后续操作。事务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 seqx
第二次握手: 服务端回应 SYN1 ACK1 seq y ackx1
第三次握手: 客户端回应 ACK1 seq x1 acky1
四次挥手
假设由客户端发送断开请求
第一次挥手 客户端发送 FIN1 sequ
第二次挥手 服务端发送 ACK1 seqv acku1
第三次挥手 服务端发送 FIN1 ACK1 seqw acku1
第四次挥手 客户端发送 ACK1 sequ1 ackw1