自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 收藏
  • 关注

原创 过滤器和拦截器有什么区别?

拦截器只能拦截请求到达Controller之前,或者响应返回视图之前的处理。过滤器(filter)是基于servlet容器回调实现的,可以拦截请求和响应的所有内容,包括静态资源和动态资源。拦截器可以进行更复杂的业务逻辑处理,例如权限控制、日志记录、性能监控、事务控制等。拦截器是SpringIOC容器管理,可以获取到spring容器的bean。过滤器主要用于过滤请求和响应,例如字符编码处理、安全控制、日志记录等。过滤器是基于servlet规范中的Filter接口实现的。拦截器通过动态代理(反射)的方式实现。

2024-05-31 20:20:25 409

原创 看看Java基础

HashMap在底层数据结构上采用了数组+链表+红黑树,通过散列映射来存储键值对数据。默认的负载因子是0.75,如果数组中已经存储的元素个数大于数组长度的75%,将会引发扩容操作。【1】创建一个长度为原来数组长度两倍的新数组。【2】1.7采用Entry的重新hash运算,1.8采用高于运算。1、判断数组是否为空,为空进行初始化;2、不为空,则计算 key的hash值,通过(n - 1) & hash计算应当存放在数组中的下标 index;

2024-05-31 11:28:56 1082

原创 动态SQL语句

底层的JDBC的prepareStatement中的sql语句是预编译的,sql语句使用了占位符规定了sql语句的结构,并且在设置参数的时候,如果有特殊字符还会进行自动的转义,#占位符可以预防sql注入。: 使用#{}可以有效防止SQL注入,因为它会将传入的参数都当作一个字符串来处理,并且自动进行转义,即使参数中含有SQL特殊字符也不会影响SQL的执行。两者都是动态SQL的一部分,用于在编写MyBatis的映射文件时动态地构造SQL语句,根据传入的参数改变查询条件或SQL结构。

2024-05-30 16:30:18 469

原创 Spring MVC 启动流程?

在 web.xml 文件中给 Spring MVC 的 Servlet 配置了 load-on-startup,所以程序启动的时候会初始化 Spring MVC,在 HttpServletBean 中将配置的 contextConfigLocation属性设置到 Servlet 中,然后在FrameworkServlet 中创建了 WebApplicationContext,DispatcherServlet 根据 contextConfigLocation 配置的classpath 下的 xml 文件初始

2024-05-30 13:42:47 296

原创 Spring MVC 运行流程?

1.spring mvc 将所有的请求都提交给 DispatcherServlet,它会委托应用系统的其他模块负责对请求 进行真正的处理工作。5.Dispathcher 查询一个或多个 ViewResolver 视图解析器,找到 ModelAndView 对象指定的视图对象。2.DispatcherServlet 查询一个或多个 HandlerMapping,找到处理请求的 Controller。3.DispatcherServlet 请请求提交到目标 Controller。

2024-05-30 09:10:13 313

原创 如何防止重复提交请求?

在搜索框输入内容时,可能需要在用户停止输入一段时间后才发送请求,以减少请求的次数。在用户连续按键时,例如在输入密码时,可以限制按键事件的处理频率。在用户点击提交按钮后,使用防抖或节流的技术延迟发送请求,确保只发送一次请求。对于下单流量不算高的系统,可以采用这种请求唯一ID+数据表增加唯一索引约束的方式,来防止接口重复提交!1. 唯一ID机制:生成一个唯一的ID,并在客户端提交时一并发送,服务器验证ID后进行处理。在登录界面,用户点击登录按钮,请求登录接口后,出现加载动画,防止用户重复点击。

2024-05-29 07:51:18 509

原创 要不优化一下代码

业务场景:在需要频繁查找、添加、删除操作的场景中,选择合适的数据结构可以提高效率。业务场景:正则表达式是强大的字符串处理工具,但过于复杂的正则表达式会严重影响性能。业务场景:在字符串拼接频繁的场景中,使用StringBuilder可以提高性能。业务场景:频繁的类型转换会影响性能,特别是涉及到基础数据类型和包装类之间的转换。业务场景:在需要处理大量并发请求的场景中,合理使用线程池可以提高系统响应速度。业务场景:在处理大量数据的业务场景中,频繁创建对象会增加垃圾收集的负担。首先关注代码的清晰性和正确性。

2024-05-29 00:17:00 589

原创 总结一点sql优化

优化背景sql优化是程序员必备的技能之一,无论是在面试还是实际工作中都是不可或缺的。sql优化同时又是需要持续学习的一件事情,在工作中必然会遇到性能的瓶颈,比如服务器cpu持续90%多,网页加载速度超慢等等这些性能问题,首先想到的是进行sql优化,因为相比于其他优化方式来说,sql优化更直接,成本更小。 1)在查询中避免用到select * from反例:select * from user where id=100;在实际的业务场景中,我们可能只需要1、2列就可以,*是查询出所有的列,这样白白浪费

2024-05-28 17:04:54 829

原创 了解缓存预热

预热一般指缓存预热,一般用在高并发系统中,为了提升系统在高并发情况下的稳定性的一种手段。缓存预热是指在系统启动之前或系统达到高峰期之前,通过预先将常用数据加载到缓存中,以提高缓存命中率和系统性能的过程。缓存预热的目的是尽可能地避免缓存击穿和缓存雪崩,还可以减轻后端存储系统的负载,提高系统的响应速度和吞吐量。:当系统重启或新启动时,缓存是空的,这被称为冷启动。冷启动可能导致首次请求处理缓慢,因为数据需要从慢速存储(如数据库)检索。:通过预先加载常用数据到缓存中,可以确保数据快速可用,从而加快数据访问速度。

2024-05-28 12:43:58 547

原创 为什么MySQL需要binlog、undo log、redo log 3种日志?

为了防止断电导致数据丢失的问题,当有一条记录需要更新的时候,InnoDB 引擎就会先更新内存(同时标记为脏页),然后将本次对这个页的修改以 redo log 的形式记录下来,这个时候更新就算完成了。当系统崩溃时,虽然脏页数据没有持久化,但是 redo log 已经持久化,接着 MySQL 重启后,可以根据 redo log 的内容,将所有数据恢复到最新的状态。在事务提交之前,MySQL 会将更新前的数据记录到 undo log 日志文件里,当事务回滚时,可以利用 undo log 来进行回滚。

2024-05-28 08:18:06 736

原创 前后端联调小细节

前端向后端发数据,有时候前端和后端的字段是一样的,字段没有问题,前端发过来的载荷也没有问题,但后端接收到的字段是null的,这时候可以排查前端发过来的数据是不是多嵌套了一层,比如发过来的是。使用@RequestBody注解接收的实例对象对应不上前端发过来的数据。多嵌套了一层导致后端对应的controller的方法的方法形参。

2024-05-28 08:17:39 481

原创 Arrays.sort 和 Collections.sort 实现原理和区别?

然后还有混排(Shuffling)、反转(Reverse)、替换所有的元素(fill)、拷贝(copy)、返回Collections中最小元素(min)、返回Collections中最大元素(max)、返回指定源列表中最后一次出现指定目标列表的起始位置( lastIndexOfSubList )、返回指定源列表中第一次出现指定目标列表的起始位置( IndexOfSubList )、根据指定的距离循环移动指定列表中的元素(Rotate);java.util.Collection 是一个集合接口。

2024-05-27 08:38:50 318

原创 分段和分页的本质,它们是如何产生的,以及它们在内存管理中的作用。比较这两种机制的异同,在实际应用中的优势和局限

分段:分段将逻辑地址空间划分为若干个不同长度的段(segments),每个段代表程序中的一个逻辑单元,例如代码段、数据段、堆栈段等。分页:分页将逻辑地址空间和物理内存空间划分为固定大小的页(pages),通常为连续的 2 的幂大小,如 4 KB或 4 MB。1)内存碎片:分段可能导致内存碎片,因为每个段的大小可以不同,随着时间的推移,内存中可能会出现许多无法被有效利用的小块内存。2)内存浪费:如果一个段中的某些部分未被使用,这部分内存仍然会被分配给该段,造成内存浪费。3)分页的大小固定,由操作系统决定;

2024-05-27 08:36:08 325

原创 Redis常用作MySQL等数据库的缓存层,如何保证Redis缓存和数据库数据的一致性?

更新缓存会有并发问题,可能会导致缓存与数据库数据不一致,这对大多数业务场景来说是不能接受的。如线程1和2都是写操作,线程1先完成数据库写操作,然后线程2完成了数据库和缓存的写操作,之后线程1完成缓存写操作,那么此时缓存和数据库的数据就不一致了。另外,先删除缓存,由于缓存中数据缺失,加剧数据库的请求压力,可能会增大缓存穿透出现的概率。如果需要强一致性,也是需要加分布式锁的,但是这样的话,方案的复杂性就会大大增加了。2、读操作:读取缓存,存在则直接返回,不存在则读取数据库,之后更新到缓存。

2024-05-27 08:35:14 387

原创 刚上手Java会踩的坑

其它的包装类型Integer, Byte, Boolean, Short, Character Long, Float, Double 这些是对基本数据类型的包装类型。我们做项目的时候,保存数据类型一般都使用Integer这类包装数据类型,因为它们的默认值为null,而不是基本数据类型例如int的默认值是0。像String,数组,类的实例对象或者基本数据类型的包装类这类进行比较是否相等要使用equals(),因为它们是引用类型的数据。其根本原因是:过滤后的集合中,保存的是对象的引用,该引用只有一份数据。

2024-05-26 09:14:34 1092

原创 window好用的网速工具

这是一个用于显示当前网速、CPU及内存利用率的桌面悬浮窗软件,并支持任务栏显示,支持更换皮肤。github链接如下。

2024-05-26 09:14:00 337

原创 好用的window粘贴板

可以设置指定的快捷键,在需要使用最近复制的记录时快速的复用 -> Ditto。

2024-05-25 12:34:43 464

原创 MySQL什么时候 锁表?如何防止锁表?

总的来说,MySQL 使用页级锁的情况相对较少,因为页级锁通常会导致锁的粒度过大,影响并发性能。在设计数据库和应用程序时,通常会尽量避免使用页级锁,而是优先使用行级锁或其他更细粒度的锁。每次锁定相邻的一组记录,锁定粒度界于表锁和行锁之间,加锁开销和加锁时间界于表锁和行锁之间,并发度一般。MySQL 使用页级锁的情况相对较少,因为 MySQL 默认使用的是行级锁。锁定粒度大,发生锁冲突的概率最高,并发度最低。锁表会带来一系列问题,影响数据库的性能和系统的稳定性。从操作的粒度可分为表级锁、行级锁和页级锁。

2024-05-25 10:24:47 332

原创 SpringBoot之@Builder 注解

(2)有时候将@Builder 和 @Data 搭配使用,以为是一个很好的搭配,导致生成的构造器是可变的,它允许使用 setter 方法修改构造器的状态。不了解底层的@Builder而去使用可能会出现奇奇怪怪的问题,使用大神封装好的东西是这样子的,在出现问题时我们就可能回去分析源码,故而知道问题所在,大家加油学习,这个内容我也是学习了大神的作品才知道的。(1)@Builder 生成的构造器不是完美的,如果没有提供必须的参数,构造器可能会创建出不完整或者不合法的对象,导致代码报错。

2024-05-24 20:30:45 393

原创 sql小总结

1. null我们在进行=//in/not in等判断时,null会不包含在这些判断条件中,所以在对null的处理时可以使用nvl或者coalesce函数对null进行默认转换。尽可能提前对列进行剪裁,即使是全表字段都需要,也尽可能的把字段都写出来,一是减少了数据运算中不必要的数据读取,二是避免后期因为原表或者目标表字段增加,导致报错。3. limit的使用临时查询或者数据探查时,养成习惯加上limit,会快速的查询出你想要的数据,且消耗更少的资源。4. 关联。

2024-05-24 13:04:19 815

原创 Spring、SpringMVC、SpringBoot 三者之间是什么关系

3. SpringBoot是基于Spring框架的一个开发框架,用于快速构建独立的、生产级别的Spring应用程序。它通 过自动配置和约定优于配置的方式,简化了 Spring 应用程序的配置和开发过程。Spring有多 个模块,包括 Spring Core、Spring Context、Spring JDBC、Spring Web 等,每个模块提供了不同的功 能。因此,SpringBoot 可以看作是在 Spring 的基础上,通过自动配置和约定优于配置的方式,提供了更加简单、快速 的开发体验。

2024-05-24 12:28:23 464

原创 mybatis报错之SQL语句

我自己踩过的一个坑就是使用mybatis-plus的根据id进行更新时出现过问题:updateById(),有时候我们要根据其他条件进行修改数据库的某一行,但是updateById()只能通过id进行更改,该方法传入的参数还是一个实体类的实例,使用不好很容易出错。4.留意sql语句的错误,留意别添加多了逗号什么的,留意每一个符号,平时注意sql语句的错误,因为在idea里面sql语句是一个字符串,所以idea自己不会报出错误,在写sql语句或者类似的需要传入一个字符串的时候要留意标点符号等等问题。

2024-05-23 11:21:54 388

原创 什么是网关,网关有哪些作用?

网关(Gateway)是在计算机网络中用于连接两个独立的网络的设备,它能够在两个不同协议的网络之间传递数据。在互联网中,网关是一个可以连接不同协议的网络的设备,比如说可以连接局域网和互联网,它可以把局域网 的内部网络地址转换成互联网上的合法地址,从而使得局域网内的主机可以与外界通信。总的来说,网关可以为不同网络提供连接和通信的功能,同时也可以提供安全、性能、可靠性等方面的增强功能,是现代计算机系统中不可或缺的一部分。API 网关:用于管理和转发 API 请求,实现 API 的授权、限流、监控等功能。

2024-05-23 00:19:39 329

原创 死锁是什么?如何预防和避免死锁?

4. 引入资源剥夺策略:当一个进程请求的资源被其他进程占用时,可以采取剥夺资源的策略,即暂停占用该资源的进程,直到该资源被释放后再恢复该进程的执行。2. 避免资源持有和等待:当一个进程占用了一些资源并等待另一些资源时,其他进程就无法使用这些资源,容易引发死锁。3. 避免资源互斥:有些资源在同一时间只能被一个进程占用,比如打印机、磁带机等,需要采用一些技术手段来避免资源互斥的问题。5. 引入进程抢占策略:当一个进程等待时间过⻓时,可以采取抢占其资源的策略,即中断正在执行的进程,强制释放其占用的资源。

2024-05-23 00:17:18 507

原创 什么是进程和线程?它们有哪些区别和联系?

独立性:进程之间相互独立,互不干扰,而线程是进程的一部分,线程之间共享进程的资源;进程是操作系统资源分配的最小单位,一个进程至少包括一个线程,进程拥有自己的内存空间、文件句柄、环境变 量等系统资源。线程是程序执行的最小单位,一个进程中可以包含多个线程,它们共享进程的内存空间和系统资源。线程之间的通信可以通过共享内存、信号。在实际开发中,多线程应用更加常⻅,因为线程的开销小,执行效率高,适用于需要并发执行的场景。在操作系统中,进程是指一个正在执行中的程序,而线程是进程的一部分,是一个程序中执行的代码片段。

2024-05-23 00:15:25 236

原创 HTTP 协议中 GET 和 POST 有什么区别?分别适用于什么场景?

GET 请求的参数是明文传输的,因为参数在 URL 中,如果涉及敏感信息(如密码),容易被窃取或暴露 在浏览器历史记录、代理服务器日志等地方。2. 参数传递大小不同GET请求参数有大小限制,因为URL⻓度有限制,不同的浏览器和服务器对URL⻓度的限制不同,一般为 2048 个字符。而 POST 请求参数没有大小限制,因为它们是以请求体的形式传递的。因为 POST 请求参数在请求体中传输,相对安全一些,可以提交敏感信息,但是需要注意参数加密和防止 CSRF 攻击等问题。1. 参数传递方式不同。

2024-05-22 10:43:02 685

原创 Redis 实现分布式 Session

2. 将Redis中的Session数据的Key设置为一个全局唯一的ID,一般使用类似于“session:token”这样的格式, 其中 token 是一个随机生成的字符串,用来标识这个 Session 数据。同时,还需要注意保护 Redis 中的 Session 数据不被恶意攻击者窃取,一般可以通过设置 Session 数据的前缀和使 用随机的 Session ID 等方式来提高安全性。实现分布式 Session 的方式有多种,其中一种常用的方式是使用 Redis 的数据结构 Hash。

2024-05-22 10:39:14 679

原创 Spring 框架中 Bean 的生命周期?

其中,BeanPostProcessor 接口定义了两个方法 postProcessBeforeInitialization 和 postProcessAfterInitialization,分 别在 Bean 的初始化前后被调用,用于扩展 Bean 初始化的过程;总之,Spring 的 Bean 的生命周期通过上述阶段进行管理,开发者可以通过实现相关接口和方法来扩展和定制Bean 的创建和销毁过程,以满足各种业务需求。4. 使用(InUse):在这个阶段,Bean实例已经可以正常使用,供应用程序调用。

2024-05-22 00:53:50 468

原创 什么是零拷⻉?零拷⻉的理解?

在传统的数据传输方式中,当应用程序需要从磁盘、网络等外部设备中读取数据时,操作系统需要先将数据从外部 设备拷⻉到内核空间的缓冲区,然后再将数据从内核空间拷⻉到应用程序的内存空间中,这个过程中需要进行两次 数据拷⻉,浪费了大量的 CPU 时间和内存带宽。同时,零拷⻉技术也可以减少系统内存的开销,提高系统的稳定性和可靠性。而使用零拷⻉技术,数据可以直接从外部设备复制到应用程序的内存空间中,避免了中间的内核空间缓冲区,减少 了不必要的数据拷⻉,提高了数据传输的效率和性能。

2024-05-21 12:43:33 449

原创 什么是 BIO、NIO、AIO?

AIO (Asynchronous IO) 是 JDK 7 开始引入的新 IO 模型,它的读写方式与 NIO 相似,但在读写数据时,不需要自 己手动轮询是否有数据可读写,而是交由系统完成,适用于高并发且处理较大数据量的场景。总的来说,BIO 的并发处理能力较差,NIO 的并发处理能力较好,但使用起来较为复杂,AIO 的并发处理能力最好,但也是最为复杂的一种 IO 模型。BIO (Blocking IO) 是传统的 IO 模型,它在读写数据时会阻塞线程,直到数据读写完成,适用于并发不高的场景。

2024-05-21 12:40:38 476

原创 什么是 Git 的 fork 命令?它和 clone 命令有什么区别?

例如,在GitHub上,你可以先Fork一个仓库到自己的账户下,然后 使用git clone命令将Fork的仓库克隆到本地进行开发。Fork 操作的本质是复制一个仓库到自己的账户下,这样你就能在自己的仓库中进行修改,而不影响原始仓库。当 你对自己仓库中的代码进行了修改,并希望将这些修改合并到原始仓库时,可以发起一个Pull Request。3. 权限:Fork操作不需要原始仓库的写权限,只需要读权限。1. 操作层面:Fork是在代码托管平台上进行的操作,它会在你的账户下创建一个新的仓库,与原始仓库相互独。

2024-05-21 12:38:10 407

原创 捡一捡操作系统 -> 线程间有哪些通信方式?

信号(Signal):信号是一种异步通信方式,进程收到信号后,会根据信号的类型做出相应的处理。条件变量(Condition Variable):用于线程之间的协调和通信,一个线程可以通过条件变量等待某个条件的 出现,另一个线程可以通过条件变量通知正在等待的线程。管道(Pipe):管道是一种半双工的通信方式,一个进程可以向管道中写入数据,另一个进程可以从管道中 读取数据。消息队列:一个线程向消息队列中放入一条消息,另一个线程从消息队列中取出消息。共享内存:线程之间通过访问同一块共享内存区域来实现数据交换。

2024-05-21 10:54:54 361

原创 讲一下 Redis 的单线程模型,IO 多路复用是什么?

在 Redis 中,所有客户端的请求都是由一 个单线程来处理的,这个单线程不断地从客户端套接字中读取命令请求,并将命令请求放入一个请求队列中。在 Redis 中,客户端的请求是由一个单线程来处理的,而 IO 操作却是通过 epoll 多路复用技术实现的。这种设计 方式既能充分利用 CPU 的计算能力,又能够保证足够的 IO 处理能力,从而实现了高效的键值存储服务。在 Redis 中,采用的是基于 epoll 的 IO 多路复用技术,可以实现高效的事件监听和响应。

2024-05-20 14:51:31 273

原创 MVCC 是什么?InnoDB 是如何实现 MVCC 机制的?

InnoDB 是 MySQL 中最常用的存储引擎之一,它的 MVCC 实现是通过在每行记录中添加两个隐藏的列,分别记录 行的创建时间和过期时间,以此来判断事务对该行记录的可⻅性。当一个事务需要读取一行记录时,InnoDB 首先 读取这行记录的创建时间和过期时间,并根据这些信息判断该行记录是否可⻅。如果创建时间早于当前事务的开始 时间,且过期时间晚于当前事务的开始时间,那么该行记录对当前事务可⻅。这时可以使用快照读取来实现,即在读取时根据事务开始时间和 undo 日志来读取历史版本的数据。

2024-05-20 14:44:18 672

原创 MySQL 日志有了解?binlog、redolog、undolog 分别有什么作 用、有什么区别?

binlog 是 MySQL 记 录所有的操作,而 redolog 则是用于保证数据的一致性和持久性。binlog 记录的是SQL语句,而 redolog 记录的是数据⻚的修改,所以 binlog 可以跨平台使用,而 redolog 不能。undolog 和 redolog 的区别是,undolog 是用于回滚操作的,而 redolog 是用于恢复数据 的。binlog ,binlog(Binary log)是 MySQL 中的二进制日志文件,用于记录 MySQL 服务器上的所有更新和修 改操作。

2024-05-20 14:34:04 325

原创 线程的生命周期是什么,线程有几种状态,什么是上下文切换?

当线程的状态发生变化时,需要进行上下 文切换,即保存当前线程的状态和上下文信息,并恢复另一个线程的状态和上下文信息,使其能够继续执行。终止状态是指当线程的 run() 方法执行完毕或者因异常退出时,线程进入了终止状态。就绪状态是指当线程对象调用 start() 方法后,线程进入了就绪状态。线程的生命周期通常包括五种状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)运行状态是指当线程对象获得 CPU 资源后,就开始执行 run() 方法中的代码,线程处于运行状态。

2024-05-20 10:29:46 203

原创 redis缓存穿透,雪崩,击穿

逻辑分析:假设线程1在查询缓存之后,本来应该去查询数据库,然后把这个数据重新加载到缓存的,此时只要线程1走完这个逻辑,其他线程就都能从缓存中加载这些数据了,但是假设在线程1没有走完的时候,后续的线程2,线程3,线程4同时过来访问当前这个方法, 那么这些线程都不能从缓存中查询到数据,那么他们就会同一时刻来访问查询缓存,都没查到,接着同一时间去访问数据库,同时的去执行数据库代码,对数据库访问压力过大。缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。

2024-05-20 10:26:14 255

原创 JVM 内存模型,分为哪些区域?各区域的作用是什么?

每个线程在执行一个方法时,都会为该方法分配一个栈帧,并将该栈帧压入虚拟机栈,当方法 执行完毕后,虚拟机会将其出栈。堆是被所有线程共享的,当创建一个新对 象时,对象实例存储在堆中,堆中存储的对象实例都有一个标记用于标记对象是否存活。1.程序计数器(ProgramCounterRegister):每个线程都有自己的程序计数器,用于指示当前线程执行的字节码指令的行号,以便线程执行时能够回到正确的位置。其中,程序计数器、虚拟机栈、本地方法栈是线程私有的,堆、方法区、运行时常量池是线程共享的。

2024-05-19 10:51:16 252 2

原创 常⻅的垃圾回收算法有几种类型?他们对应的优缺点是什么?

4. 分代收集算法(Generational):根据对象存活的时间将内存分为几个区域,每个区域采用不同的回收策 略。复制算法适用于短时间内产生大量垃圾的场景,但需要额外的空间存储复制后的对象;2. 复制算法(Copying):将可用内存分为两块,只使用其中一块,当这一块满了后,将存活对象复制到另一塊 未被使用的空間,然後清除使用的那塊。3. 標記-整理算法(Mark-Compact):在标记阶段与标记-清除算法类似,但在清除阶段将存活对象整理到内 存的一端,然后清除边界以外的所有对象。

2024-05-19 10:48:47 236 1

原创 数据库踩坑

当我们设计项目时需要为字段设置浮点数时需要同时设置保留浮点数的几位数字,如果不设置将默认为0位,这样就和整数类型int存储没有差别,而且白白浪费了存储空间。计算机底层数据的处理可以通过二进制的原码,反码,补码,移码等等进行一系列的运算,最终得到我们想要的计算结果,只能说前人的发明真的太强大了,向他们学习!3.尾数位(单精度23位,双精度52位):存储小数部分的二进制形式,前面隐含一个二进制点(即1.f的形式,其中的1不实际存储)。1.浮点数的表示受到精度限制,尤其是使用二进制浮点数(如C/C++的。

2024-05-18 17:31:09 360

window好用复制粘贴板Ditto

可以保存最近ctrl+c或者ctrl+x的多条记录,在需要使用时快速复用

2024-05-25

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除