自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

努力分享一些干货

可以私信我任何问题

  • 博客(118)
  • 收藏
  • 关注

原创 网络与安全

DDoS(Distributed Denial of Service)分布式拒绝服务攻击,是指攻击者控制分布于互联网各处的大量僵尸主机向攻击目标发送大量垃圾报文或者对目标服务器发起过量访问,耗尽攻击目标所在网络的链路带宽资源、会话资源或业务系统处理性能,导致其无法响应正常用户的服务请求。HTTPS(HyperText Transfer Protocol Secure,超文本传输安全协议)是HTTP协议的安全版本,采用SSL/TLS协议对数据进行加密和验证,来保证数据传输过程中的安全性和完整性。

2024-12-15 19:33:20 941

原创 鸿蒙系统崛起与开发者机遇

鸿蒙操作系统(HarmonyOS)随着其不断发展,正在改变全球科技格局。鸿蒙不仅在智能手机领域展现了强大的潜力,还在智能穿戴、车载、智能家居等多个行业获得广泛应用。随着鸿蒙生态系统的不断完善,开发者面临着前所未有的机遇和挑战。本文将探讨鸿蒙生态中的机遇和挑战,分析如何抓住机会,克服挑战,推动更好的应用发展。

2024-11-24 13:37:09 389

原创 软件开发的未来:AI 大模型与智能代码生成

例如,GitHub Copilot 就是一个典型的应用,通过结合 AI 大模型的技术,能根据开发者输入的函数名称、注释或参数等信息,智能地推测并生成完整的代码块。AI 大模型的应用远不止于自动化代码生成。AI 大模型能够将复杂的编程任务转化为简单的语言描述,开发者只需用自然语言描述他们的需求,AI 就能自动生成符合要求的代码。未来,AI 与开发者的协作将不再是单纯的代码生成,而是更深层次的合作,AI 将成为开发过程中不可或缺的一部分,帮助开发者提升决策效率,优化架构设计,甚至参与项目的全生命周期管理。

2024-11-24 13:26:08 997

原创 常用算法详解

算法英文对应的单词是Algorithm,它的本意为解决问题的方法,所以算法直接理解就是解决问题的方法。在计算机领域定义就是一系列解决问题的、清晰、可执行的计算机指令。算法是在计算机科学中用于解决特定问题的一系列明确且有限的步骤或规则。它以输入数据为基础,通过确定性操作生成输出结果,强调高效性和可行性。常见算法包括排序、查找、动态规划、分治法和贪心算法等,主要评估指标为时间复杂度和空间复杂度。算法的设计与优化直接影响程序性能,是计算机编程的核心内容之一。算法复杂度是衡量算法性能的重要指标,主要包括时间复杂度和

2024-11-23 15:49:15 1285

原创 常用数据结构与算法

数据结构是一门研究数据组织方式的学科,是编程语言的重要组成部分。学好数据结构,可以编写出更高效的代码,同时为学习和掌握算法奠定坚实的基础。数据结构分为两大类:线性结构和非线性结构。线性结构是最常用的数据结构,其特点是数据元素之间存在一对一的线性关系。根据存储方式的不同,线性结构分为顺序存储和链式存储:常见的线性结构包括数组、链表、队列和栈。非线性结构则包括多维数组、广义表、树和图等形式。常见的线性数据结构包括数组、链表、栈、队列和哈希表。数组是一种固定大小的元素集合,存储在连续内存空间中,支持快速随机访问。

2024-11-23 15:48:12 987

原创 常用数据结构详解

数据结构分为两大类:线性结构和非线性结构。线性结构是最常用的数据结构,其特点是数据元素之间存在一对一的线性关系。根据存储方式的不同,线性结构分为顺序存储和链式存储:常见的线性结构包括数组、链表、队列和栈。非线性结构则包括多维数组、广义表、树和图等形式。常见的线性数据结构包括数组、链表、栈、队列和哈希表。数组是一种固定大小的元素集合,存储在连续内存空间中,支持快速随机访问。链表由节点和指针组成,能够动态调整大小,适用于频繁插入和删除的场景。栈遵循后进先出(LIFO)原则,通常用于处理递归和表达式求值等问题。队

2024-11-19 23:04:48 1175

原创 SpringCloud详解

"断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。客户端的请求先通过匹配规则找到合适的路由,映射到具体的服务,然后请求经过过滤器处理后转发给具体的服务,服务处理后,再次经过过滤器处理,最后返回给客户端。它并不是一个框架,而是很多个框架。

2024-11-17 08:00:00 1029

原创 微服务治理详解

—大意:简而言之,微服务体系结构风格是一种将单个应用程序开发为一套小型服务的方法,每个服务运行在自己的进程中,并与轻量级机制(通常是HTTP资源API)通信。这些服务是围绕业务功能构建的,可以通过全自动部署机制进行独立部署。对这些服务的集中管理是最低限度的,这些服务可能用不同的编程语言编写,并使用不同的数据存储技术。

2024-11-16 22:55:12 1132

原创 this关键字详解

在JVM内部,它通过栈帧管理和字节码指令实现了对当前对象的引用,使得实例方法可以操作调用对象的属性和方法。它是类内部对当前对象的引用,因此在实例方法或构造方法中,可以通过。看成一个特殊变量,它保存着当前对象的内存地址,并允许你在类内部访问该对象的属性和方法。的执行原理在于它是一个隐式传递的参数,指向当前对象实例,并在编译和执行过程中通过。在多线程环境中,JVM为方法分配独立的栈帧,每个线程操作自己的栈,因此。是一个内置的引用,代表了“当前对象”,它指向当前对象的实例。是一个特殊的引用,指向当前对象的实例。

2024-11-01 08:00:00 1198

原创 transient关键字详解

这是因为static字段属于类而不是某个具体的对象,序列化是对象级别的操作,它保存的是对象的实例状态,而static字段是类级别的状态,不属于任何具体对象,因此在序列化过程中被忽略。也就是说,使用transient修饰的字段在序列化过程中将被忽略,反序列化时这些字段会被初始化为默认值,基本数据类型为0,引用类型为null。transient译为“临时的”,它可以阻止字段被序列化到文件中,在被反序列化后,transient字段的值被设为初始值,比如int型的初始值为0,对象型的初始值为null。

2024-08-18 16:52:50 2047

原创 strictfp关键字详解

BigDecimal的运算逻辑完全在Java的标准库中实现,并不依赖于任何特定平台的硬件或操作系统的浮点运算单元,所以在任何平台上使BigDecimal进行相同的计算时,结果都是一致的,但并不是它在所有场景下都是最合适的选择。在没有使用strictfp时,Java虚拟机可能利用硬件浮点运算的特性来优化计算,这就可能导致在不同平台上,浮点运算的结果不完全一致。而且大多数应用程序的浮点计算已经足够一致,满足了实际需求,因此不需要额外的strictfp关键字来保证浮点运算的一致性,strictfp了解即可。

2024-08-18 08:00:00 972

原创 static关键字详解

除此之外,这种理解有助于优化类的加载性能,减少不必要的初始化开销,并能够正确实现一些设计模式,确保类在多线程环境下的稳定性。例如,静态变量用于保存所有对象共享的状态,而静态方法可用于提供通用的工具函数,这些功能可以直接通过类名访问,无需实例化对象。是Java中的一个关键字,用于定义类级别的成员,类级别的成员是指那些属于整个类,而不是特定对象实例的成员。时,JVM在方法区为这些静态成员分配内存,这块内存被所有类的实例共享,并在整个类的生命周期内保持不变,所以静态变量不需要为每个对象实例重新创建。

2024-08-11 08:00:00 835

原创 Netty高性能数据结构

它的基本思路是在哈希表中发生冲突时,线性地探测哈希表中的下一个位置来寻找空闲的存储位置。时间轮算法将时间分割成一个个固定大小的时间片,并将任务安排到相应的时间片上,从而优化了定时任务的管理。类型的无锁队列,允许多个线程同时提交任务,而由单个事件循环线程处理这些任务。它通过将定时任务分配到轮盘上的不同槽位来避免高频率的任务调度开销,这种设计主要用于处理大量的定时任务。所谓的高性能数据结构是指,那些在特定场景下优化了性能和效率的数据结构,通常能够提供更快的操作速度、更低的内存消耗或更高的并发处理能力。

2024-08-07 21:36:14 904

原创 Netty内存池管理

内存池将内存分为不同大小的块,每个大小对应一个内存池。实际就是一个队列,当内存释放时,将内存块加入队列当中,下次再分配同样规格的内存时,直接从队列中取出空闲的内存块。会检查其内存区域中的空闲块,并从中选择一个可用的块进行分配。来管理较大的内存块,通过伙伴算法和二叉树结构进行内存分配。中获取内存块,如果缓存中没有,才会从全局内存池中获取。它的主要作用是管理内存池中的小内存块,在分配的内存大小小于一个。向操作系统申请内存的单位,所有的内存分配操作也是基于。,可以快速分配和回收内存块,减少对全局内存池的争用。

2024-07-31 20:58:02 451

原创 Netty详解

Netty是一个高性能、异步的网络应用框架,用于开发高效的网络通信程序。它是JavaNIO的一个抽象,简化了网络编程的复杂性,并提供了一系列高级功能,使网络编程变得更简单。Netty是一个高效的网络框架,专注于处理大量并发连接。它通过异步IO处理来避免阻塞,这让它在处理高并发时表现出色。Netty还利用了优化的内存管理和零拷贝技术,降低了性能开销。框架的灵活性也很高,开发者可以通过管道机制自定义数据处理流程,API和文档丰富,帮助简化网络编程。不过,Netty。

2024-07-31 20:40:14 4278

原创 Redis内存管理

达到内存限制时,它会在所有设置了过期时间的键中选择最近最少使用的数据进行淘汰。页面置换算法:进程运行时,若其访问的页面不在内存而需将其调入,但内存已无空闲空间时,就需要从内存中调出一页程序或数据,送入磁盘的对换区,其中选择调出页面的算法就称为页面置换算法。默认最大内存是全部的内存,我们在实际配置的时候,一般配实际服务器内存的3/4也就足够了。算法常用于缓存管理,目的是在缓存满时,保留最常使用的数据,同时移除最久未被使用的数据。专注于管理设置了过期时间的键,优先淘汰过期数据,保留未过期的键。

2024-07-30 11:55:24 981 1

原创 Redis部署策略

它的主要优点是能够处理大规模的数据和高并发请求,自动故障转移功能减少了服务中断时间,同时分散了数据和负载,减少了单点故障的风险。如果主节点出现故障,可以将从节点提升为新的主节点,实现一定程度的容错和数据恢复。不过,由于主从复制默认是异步的,从节点的数据可能会有延迟,导致读取的数据可能不是最新的。它的主要优点是能够自动处理主节点故障,将从节点提升为新的主节点,从而减少服务中断时间,增强系统的稳定性和可靠性。前者称为主节点,后者称为从节点,数据的复制是单向的,只能由主节点到从节点。一旦选定新的主节点,

2024-07-29 12:15:15 528 1

原创 Redis与缓存

可以设置自动重试机制,如果更新操作失败,系统会尝试重新执行更新,增加成功的可能性,虽然这样可能会增加系统的负担。另一种方法是使用备用缓存,在主缓存更新失败时,将数据写入备用缓存,并在主缓存恢复正常时进行同步,这样可以保持系统的正常运转。缓存穿透的原因通常是,用户请求的数据在缓存和数据库中都不存在,或者是请求的数据在缓存中未命中,直接查询数据库,并未将结果正确地缓存起来。在更新源数据时,同时更新缓存和源数据库。缓存击穿 是指在缓存中某个热点数据的缓存失效时,多个请求同时访问数据库,导致数据库压力剧增的情况。

2024-07-29 12:13:05 509

原创 基于Redis的分布式锁的演进

加过期时间释放锁的这种方式会带来另一个问题,某个线程加锁,然后执行业务代码,业务代码执行的时间超过了限定时间,此时Redis会释放锁,然后第二个请求就进来了,此时第一个线程业务代码执行完毕,执行释放锁步骤。对于上面的解决方法,其实并没有真正的解决缓存续期的问题,还是会带来能存在锁过期释放,业务没执行完的问题。针对缓存续期的问题,我们可以开一个守护线程,每隔一段时间检查锁是否还存在,存在则对锁的过期时间延长,防止锁过期提前释放。当释放锁时,节点会检查锁的持有者是否匹配,只有匹配的情况下才会删除锁。

2024-07-27 12:54:52 1114

原创 分布式锁详解

它管理数据一致性,防止多个节点同时修改相同数据,处理资源竞争,保障事务原子性,避免任务重复执行,同时协调和同步节点操作,减少死锁的可能性。例如,在表中记录锁的创建时间,并定期检查是否超时,如果超时则自动释放锁。只有在比自己序号小的节点被删除后,才会再次检查自己是否成为最小的节点,进而获取锁。利用顺序节点实现锁的公平性,保证了锁的获取顺序。,查出来的数据是相同的,然后依次执行库存减一操作,此时库存会变成-1件,这就造成了超卖问题。当释放锁时,节点会检查锁的持有者是否匹配,只有匹配的情况下才会删除锁。

2024-07-27 12:50:48 2170 13

原创 分布式ID详解

在分库之后, 数据遍布在不同服务器上的数据库,数据库的自增主键已经没办法满足生成的主键唯一了,这个时候就需要生成分布式。适用于并发不高,但是数据量太大导致的分库分表扩容,可能每秒最高并发最多就几百,那么就走单独的一个库和表生成自增主键即可。雪花算法相对来说还是比较靠谱的,毫秒数在高位,自增序列在低位,整个ID都是趋势递增的。不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成ID的性能也是非常高的,能达到百万计。生成,如果是高并发啥的,那么用这个应该性能比较好,一般每秒几万并发的场景,也足够用了。

2024-07-26 17:24:18 988

原创 SpringBoot详解

SpringBoot提供了一种新的编程范式,可以更加快速便捷地开发Spring项目,在开发过程当中可以专注于应用程序本身的功能开发,而无需在Spring配置上花太大的工夫。因此,把应用的主类放在根包中,SpringBoot就会自动扫描并加载所有需要的组件和配置,让你可以专注于编写业务代码,而不用担心复杂的配置细节。启用了SpringBoot的自动配置功能,SpringBoot会根据项目中的依赖,自动配置很多常用的 Spring组件,这样就不需要手动配置它们。在实际测试中,有时候需要测试场景中加载配置,

2024-07-26 15:52:30 22067

原创 内存泄漏详解

内存泄漏是指不使用的对象持续占有内存使得内存得不到释放,从而造成内存空间的浪费。严格来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏。但实际情况很多时候一些不太好的实践会导致对象的生命周期变得很长,甚至导致00M,也可以叫做宽泛意义上的“内存泄漏”。举个例子,创建的连接不再使用时,需要调用close方法关闭连接,只有连接被关闭后,GC才会回收对应的对象。忘记关闭这些资源会导致持续占有内存,无法被GC回收。这样就会导致内存泄露,最终导致内存溢出。try{

2024-07-23 10:54:03 4341 1

原创 如何从代码层面避免内存泄漏

内存泄漏是指不使用的对象持续占有内存使得内存得不到释放,从而造成内存空间的浪费。内存泄露最明显问题频繁GC,从而STW次数增加,导致用户体验变差。如果内存泄露问题严重,会导致OOM,直接导致程序不能正常运行。大多数内存泄露的原因是,长生命周期的对象引用了短生命周期的对象。例如,A对象引用B对象,A对象的生命周期(t1-t4)比B对象的生命周期(t2-t3)长的多。当B对象没有被应用程序使用之后,A对象仍然在引用着B对象。这样,垃圾回收器就没办法将B对象从内存中移除,从而导致内存泄露问题。

2024-07-22 17:16:47 852 1

原创 如何写出优雅的代码

优雅的代码就是那种看起来简单、易懂,而且好维护的代码。它的设计让人一眼就能明白每部分的作用,避免了复杂和冗余的部分。它使用清晰的变量和方法名称,能让你很快理解代码在做什么,而不是去猜测。优雅的代码还遵循一些编程的好习惯,比如把代码分成小块,每块负责一个特定的功能,这样更容易修改和扩展。

2024-07-22 17:12:59 1150

原创 Java程序中常见问题

资源有序分配法指的是,线程 A 和 线程 B 获取资源的顺序要一样,当线程 A 先尝试获取资源 A,然后尝试获取资源 B 的时候,线程 B 同样也是先尝试获取资源 A,然后尝试获取资源 B。在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。举例,现有公司B、公司A、公司T,想要从银行分别贷款70亿、40亿、50亿,假设银行只有100亿供放贷,如果借不到企业最大需求的钱,钱将不会归还,怎么才能合理的放贷?

2024-07-21 09:39:01 938

原创 Java程序的故障排查

线程快照是当前JVM内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。命令可以获得运行中的JVM的堆的快照,从而可以离线分析堆,来检查内存泄漏、检查一些严重影响性能的大对象的创建、检查系统中什么对象最多,各种对象所占内存的大小等等。通过这些命令,可以生成和分析堆转储,查看线程状态,获取JVM配置信息等。可用于显示虚拟机进程及进程的配置和环境信息,监视应用程序的CPU、GC、堆、方法区及线程的信息等,甚至代替。

2024-07-21 09:23:23 1089

原创 解决死锁问题

资源有序分配法指的是,线程 A 和 线程 B 获取资源的顺序要一样,当线程 A 先尝试获取资源 A,然后尝试获取资源 B 的时候,线程 B 同样也是先尝试获取资源 A,然后尝试获取资源 B。在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。举例,现有公司B、公司A、公司T,想要从银行分别贷款70亿、40亿、50亿,假设银行只有100亿供放贷,如果借不到企业最大需求的钱,钱将不会归还,怎么才能合理的放贷?

2024-07-20 11:25:34 1044

原创 Java中的枚举详解

枚举在Java中是一种特殊的类,用来定义一组固定的常量。它在Java5中引入,提供了一种类型安全的方式来定义和使用常量集合。尽管enum看起来像是新的数据类型,但它实际上是一个受限制的类,继承自。在编译时,编译器生成的类包含了所有定义的常量,并提供了内置的方法,如values()和valueOf(),用来获取所有枚举常量或根据名称返回特定常量。枚举的引入不仅增强了代码的可读性,还提供了更强大的功能和灵活性。Java枚举不仅可以定义常量,还可以实现接口,提供额外的行为和功能。

2024-07-20 09:56:22 1239

原创 Spring详解

Spring是一个轻量级的Java开源框架,是为了解决企业应用开发的复杂性而创建的。Spring的核心是控制反转(IOC)和面向切面(AOP)。Spring虽然把它当成框架来使用,但其本质是一个容器,即IOC容器。里面最核心是如何创建对象和管理对象,包含了Bean的生命周期和Spring的一些扩展点,也包含对AOP的应用。除此之外,Spring真正的强大之处在于其生态,它包含了、、等一些列框架,极大提高了开发效率。、和是Java生态系统中常见的三个框架:Spring启动流程的主要步骤及对应的代码如下:初

2024-07-19 09:51:43 923

原创 Spring中的事务详解

但是随着事务越来越大,执行时间也会变长,就需要将这个大事务拆分成多个事务,如果确保这个事务能够拆分成多个事务,就需要指定Spring的事务传播行为。比如,在用户注册时候,需要记录注册日志,这时候可以将记录日志的操作单独划分为一个事务,而注册是另一个单独的事务,可以将保存日志的方法指定。事务隔离级别,即数据库中事务隔离级别,指的是一个事务对数据的修改与另一个并行的事务的隔离程度。事务传播行为指,当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行,是应该加入现有事务,还是应该启动一个新事务。

2024-07-19 09:33:23 1482

原创 Spring中的AOP详解

代理对象在客户端和目标对象之间起到中介的作用,可以在不修改目标对象的情况下,扩展其功能。实现AOP的技术,主要分为两类,一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“切面”,从而使得编译器可以在编译期间织入有关“切面”的代码,属于静态代理。在Spring AOP中,注意切面执行顺序非常重要,因为不同切面可能会对同一个方法执行不同的逻辑,这些逻辑的执行顺序可能会影响应用程序的行为和结果。,这个方法就是代理创建的雏形。

2024-07-19 09:26:44 1087

原创 Spring启动流程

【代码】Spring启动流程。

2024-07-18 12:09:37 829

原创 Spring中的IOC详解

单例Bean和多实例Bean的生命周期主要区别在于实例化和销毁的管理方式,单例Bean在容器启动时创建一个实例,并由容器负责管理其生命周期的完整过程。在Spring框架中,Bean是应用程序的核心组件,它们由Spring容器创建、组装和管理,以帮助开发者实现松耦合、可测试和可维护的代码。IOC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。Bean的自动装配是Spring框架提供的一种便捷的方式,用于自动解析和设置Bean之间的依赖关系,而无需显式配置每一个依赖关系的方式。

2024-07-18 09:20:47 6020

原创 Spring循环依赖与三级缓存

简单来说,首先检查一级、二级和三级缓存中是否有BeanA,如果没有,开始创建BeanA。又因为BeanB依赖BeanA,此时三级缓存中有BeanA,从三级缓存中获取BeanA,然后将BeanA提前暴露到二级缓存。继续初始化BeanB,完成后将BeanB放入一级缓存,并从三级缓存中移除。在Spring Boot 2.6.0及之后的版本中,默认情况下,Spring不再自动解决循环依赖。在Spring框架中,为了解决循环依赖问题,Spring使用了三级缓存机制。

2024-07-18 09:11:17 439

原创 七种软件设计原则

当两个模块之间存在紧密的耦合关系时,最好的方法就是分离接口和实现,即在依赖之间定义一个抽象的接口使得高层模块调用接口,而底层模块实现接口的定义,以此来有效控制耦合关系,达到依赖于抽象的设计目标。某些时候,实现类并非需要所有的接口定义,在设计上这是“浪费”,而且在实施上这会带来潜在的问题,对胖接口的修改将导致一连串的客户端程序需要修改,有时候这是一种灾难。其核心思想为,降低类之间的耦合。类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成搏击,也就是说,信息的隐藏促进了软件的复用。

2024-07-17 10:14:42 999

原创 HashSet详解

如果尝试添加一个已经存在的元素,集合将保持不变,所以该集合在线程不安全的情况下可替代。中添加一个已经存在的元素,新添加的集合元素不会覆盖已有元素,从而保证了元素的不重复。不允许存储重复的元素,即集合中的元素是唯一的。方法,因此这两个对象的散列值是不同的,最终导致集合添加了两个等价的对象。,则说明哈希码冲突,但实际上是不同的对象,此时将新元素添加到。方法比较相等的元素,则不添加,否则添加新元素到集合中。中的元素,而值则是一个占位对象,用来表示键已经存在。,则认为新元素与已存在元素相同,不进行添加操作,返回。

2024-07-17 10:09:49 1840

原创 ArrayList详解

二分查找法:也称为折半查找法,是一种适用于大量数据查找的方法,但是要求数据必须的排好序的,每次以中间的值进行比较,根据比较的结果可以直接舍去一半的值,直至全部找完(可能会找不到)或者找到数据为止。底层是数组,而数组的中的元素内存分配都是连续的,并且数组中的元素只能存放一种,这就造成了数组中的元素地址是有规律的,数组中查找元素快速的原因正是利用了这一特点。在进行添加,删除操作时,会用二分查找法找到将要添加或删除的元素,之后再设置对象的下一个结点来进行添加或删除操作,所以增加删除的效率高。

2024-07-16 10:01:51 1192

原创 Java中的泛型详解

泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。泛型方法是Java中一种特殊的方法,它在声明时可以使用泛型类型参数,使得方法在调用时可以接受不同类型的参数,并且能够保证类型安全。需要注意的是,泛型在Java中是通过类型擦除来实现的,这意味着泛型信息只在编译时存在,而在运行时会被擦除。在Java中,泛型是一种强大的编程特性,允许类、接口和方法在定义时声明一种参数化类型,而在使用时可以指定具体的类型参数。在编译时,泛型类型被擦除,实际操作的对象是原始类型。

2024-07-16 09:53:15 1367

原创 Java中的23种设计模式

原型模式作为一种快速创建大量相同或相似对象的方式,在软件开发中应用较为广泛,很多软件提供的复制和粘贴操作就是原型模式的典型应用。通过clone的方式在获取大量对象的时候性能开销基本没有什么影响,而new的方式随着实例的对象越来越多,性能会急剧下降,所以原型模式是一种比较重要的获取实例的方式。当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,提高创建对象的效率。可以使用深克隆的方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来,可辅助实现撤销操作。

2024-07-15 11:45:03 794

免费吐血整理,前端知识点总结,课程学习路线及学习链接

前端知识点总结,课程学习路线及学习链接。部分内容如下: ## 基础知识 ### 网络知识 1. [HTTP](https://www.bilibili.com/video/BV1js411g7Fw/) 2. [DNS](https://www.bilibili.com/video/BV1GW411j7Ts/) 3. [域名](https://www.bilibili.com/video/BV1zA411x7Pj/) 4. [云服务](https://www.bilibili.com/video/BV1Rt411u7k4/)

2024-04-17

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

TA关注的人

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