自定义博客皮肤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)
  • 收藏
  • 关注

原创 Python的数字探险:揭秘商品销量的API之旅

在一个被代码和咖啡香包围的秘密基地里,Python探险家正准备开始他的新冒险:获取商品销量详情的API数据。Python探险家,这位编程界的印第安纳·琼斯,打开了他的笔记本电脑,准备开始这场充满智慧的旅程。他决定使用异步请求,这是他的新策略,可以让他在等待响应的同时,继续执行其他任务。Python探险家的代码越来越复杂,但他的脸上却露出了满意的笑容。他继续编写代码,处理异常,优化性能,直到他得到了完整的销量信息。于是,他为请求添加了必要的参数和认证令牌,这是他的秘密武器,可以让他在网络世界中精确定位。

2024-10-24 14:32:05 376

原创 一文掌握FastJson基础到高级玩法

FASTJSON 2是一个国产、性能极致并且简单易用的Java JSON库。介绍FieldBased基于字段反序列化,如果不配置,会默认基于public的field和getter方法序列化。配置后,会基于非static的field(包括private)做反序列化。在fieldbase配置下会更安全反序列化忽略非Serializable类型的字段支持数据映射的方式初始化String字段为空字符串""

2024-10-24 14:08:38 886

原创 Java中的Vector,看着陌生?

Vector和ArrayList都是AbstractList的子类,二者有啥区别呢?Vector很少用,但是其父类Stack却常见在各类项目工程中。typescript代码解读复制代码Vector和ArrayList是 Java 中两种常用的动态数组实现,但它们之间有一些重要的区别。

2024-10-24 14:07:59 413

原创 [Java并发编程]2.并发编程三大特性

不同的硬件和不同的操作系统在内存上的操作有一定差异的。Java 为了解决相同代码在不同操作系统上出现的各种问题,用 JMM 屏蔽掉各种硬件和操作系统带来的差异,让Java 的并发编程可以做到跨平台。JMM 规定所有变量都会存储在主内存中,在操作的时候,需要从主内存中复制一份到线程内存(CPU内存),在线程内部做计算。然后再写回主内存中(不一定!原子性的定义:原子性指一个操作是不可分割的,不可中断的,一个线程在执行时,另一个线程不会影响到他。并发编程的原子性用代码阐述:java代码解读。

2024-10-23 14:26:14 848

原创 被“三个线程循环打印”吊打后的深入研究报告(下篇)

问题一:Thread 调用 run() 方法而不是 start() 方法会怎么样?答:可以调用,调用 run() 方法是同步调用,属于同一个线程,而 start() 是另外一个线程去执行方法,是两个线程Thread 调用两次 start() 方法会怎么样?答:会报错,每一个阶段都有一个自己的线程状态,调用 start() 方法会将线程状态从 new 编程 runnable。每次调用 start() 都会进行状态检测,所以报错Java代码解读复制代码。

2024-10-23 14:25:20 733

原创 抽象类 vs 接口:如何在实际项目中做出正确选择?

抽象类,顾名思义,就是包含抽象方法的类。它用 abstract 关键字来修饰,是一种不能被实例化的类。这是什么意思呢?简单来说,抽象类只能通过继承来使用,不能直接创建一个对象。正因为如此,抽象类不能使用 final 修饰——因为 final 表示类不能被继承,而抽象类的存在意义就在于给其他类继承。抽象类的几个特点:包含抽象方法:抽象方法也是用 abstract 修饰的,没有具体实现的内容。子类继承抽象类后,必须实现这些抽象方法。不能被实例化:抽象类不能直接创建对象,必须通过继承来使用。

2024-10-23 14:23:17 892

原创 【设计模式】MyBatis 与经典设计模式:从ORM到设计的智慧

在当今的软件开发中,ORM(对象关系映射)框架为开发者提供了一种方便且高效的方式来操作数据库,而 MyBatis 作为一种轻量级的 ORM 框架,凭借其灵活的 SQL 映射和高效的数据库操作,广受开发者的青睐。然而,MyBatis 之所以能够在众多 ORM 框架中脱颖而出,不仅仅在于其易用性,更在于它内部精心设计的架构和使用的经典设计模式。设计模式是软件开发中解决常见问题的最佳实践,它为开发者提供了一种可复用的解决方案,帮助简化复杂系统的设计与实现。

2024-10-22 14:02:29 903

原创 浅入浅出MySQL事务等特性

新版本可以作为老版本的从服务器,但反过来是不可行的。死锁是因为多个事务互相占用对方请求的资源导致的现象,要打破这个问题需要回滚其中一个事务,这样另一个事务就能获得请求资源了,而回滚的事务只需要重新执行即可。丢失修改:一个事务修改了某个数据,另一个事务与其读取同一数据且原始值都相同,另一个事务修改数据后提交,导致第一个事务的修改操作丢失。如果从服务器复制该二进制文件后的数据库状态是混乱无序的,那整个复制的过程就没有意义了。如果主、从服务器存储数据的顺序不一样,就会导致每次执行删除的数据都是不同的。

2024-10-22 14:00:01 439

原创 Java 线程池获取池中所有线程列表的方法

当我们创建线程池时,可以通过提供自定义的来影响线程的创建过程。在自定义的中,我们可以为创建的每个线程设置特定的属性(如名称、优先级等),并在工厂中维护一个对所有这些线程的引用。这样,虽然我们仍然不能直接从线程池获取线程列表,但我们可以通过访问工厂中的引用来获取线程信息。需要注意的是,这种方法的一个潜在缺点是它增加了额外的内存开销,因为我们需要维护一个额外的线程引用集合。此外,如果线程池中的线程被回收(例如,在超过后没有任务执行时),我们需要确保从集合中移除这些线程的引用,以避免内存泄漏。

2024-10-22 13:59:27 771

原创 我成dubbo contributor了?

解决此问题需要修改RadixTree的实现,使其能够识别并正确处理带有花括号{}的路径变量。解析路径模板:在添加路径时,识别出花括号包围的变量部分,并将其标记为通配符或变量节点。匹配路径:在匹配时,当遇到变量节点时,允许匹配任何有效的路径段。优先级处理:确保静态路径优先于动态路径,以避免匹配错误。

2024-10-21 14:03:08 400

原创 记录项目中遇见的几个常见异常

这通常是因为你的查询条件匹配到了多条记录,而你的代码却期望只返回一条记录。向MySQL数据库的某个字段插入数据时,如果数据的实际长度超过了该字段定义的最大长度,MySQL就会抛出“Data too long for column”错误。cmd控制台,开启mysql服务,输入用户名和密码连接mysql,重启SprintBoot项目。具体原因未知...,可能,SpringBoot运行过程中,mysql服务重新启动了,导致报错。名为 test84 的数据库中不存在名为 user 的表。

2024-10-21 14:02:36 727

原创 并发-synchronized的作用

synchronized是通过调用操作系统的互斥变量保证线程的同步,所以会存在线程上下文切换的开销。主要分为两块锁对象和同步代码块。当我们使用了synchronized,jvm在编译成字节码的时候,会在代码块的开始和结束阶段,添加monitorenter和monitorexit字节码指令(如果是方法则添加ACC_SYNCHRONIZED指令)。当第一个线程执行到monitorenter会在进行计数,直到执行到monitorexit进行数量-1。

2024-10-21 14:02:01 322

原创 Java 条件语法指南:高效编写逻辑控制代码

Java 的基本条件语法包括if-else语句和switch语句,它们用于控制程序的执行流程。if-else语句适用于布尔表达式和简单条件判断,而switch语句适用于变量值固定的情况。通过合理使用这些条件语法,可以编写出逻辑清晰、结构合理的代码。

2024-10-18 14:45:03 332

原创 HttpUtils 详解

现如今的 Web 项目,由服务端向外发起网络请求的场景,基本上随处可见!传统情况下,在服务端代码里访问 http 服务时,一般会使用 JDK 的 HttpURLConnection 或者 Apache 的 HttpClient,不过这种方法使用起来太过繁琐,而且 api 使用起来非常的复杂,还得操心资源回收。HttpUtils 是 Solon 提供的进行远程调用客户端HttpUtils 提供了很多远程调用的方法,能够大大提高客户端的编写效率。

2024-10-18 14:43:52 712

原创 OkDownload源码分析——DownloadTask类分析

是存储的文件名,如果有特殊要求,可以特别指定,没有特殊要求的话,就忽略,有内部自动计算。至于其他的参数都可以使用默认值,无须额外设置,我们来看一下其他参数的默认值配置。方法:将任务放入到下载任务队列中进行排队,同时会根据任务优先级。方法:将任务直接加入到正在下载任务队列中,然后立即启动下载流程。方法,而在其内部的处理中,添加/启动任。任务创建完成后,就可以启动任务下载了。参数,进行对任务的排序处理。的创建需要两个必须的参数。的构造函数中可以看到,是需要下载的资源地址,是资源下载的存储路径。

2024-10-18 14:43:11 328

原创 Android经典面试题笔记之JVM内存管理剖析

就是在对象晋级到老年代时,有可能老年代内存会不够,但如果每次老年代都进行GC又影响性能,所以JVM会进行担保,让老年代不用每次都GC,直到内存真不够时再进行GC,这样提高性能。,就是这个对象不会逃出方法作用域,以及逃出当前线程,也就是被其他线程引用,没有的话就是没有逃逸,可以在栈上分配,当然大小不能太大。堆里面放的是一些经常变动需要回收的对象,方法区是一些静态的,不容易回收的信息,这是一种动静分离的思想。是在堆里面,比如一个class的int成员变量,在new出来的时候,会跟随对象创建在堆里面。

2024-10-17 14:11:31 335

原创 Java 和 Kotlin 泛型中的协变和逆变

泛型定义:类型参数化,使代码适应不同类型。泛型核心作用:类型安全。在编译时确保类型的一致性,防止运行时出现类型转换错误。代码复用:编写适用于不同类型的接口、类或方法,不需要为每种类型编写不同的版本;灵活性:编写的算法不依赖特定的类型,适应多种类型;维护性:代码容易阅读和理解。支持类的继承关系扩展到泛型类型上,让泛型更灵活的同时保证类型安全。在引入泛型之前,使用 Object 适应不同类型java代码解读复制代码1 string。

2024-10-17 14:11:00 1065

原创 Java Behavioral 行为型模式之 Pipeline Pattern 管道模式

Pipe 接口用 java.util.function.Function (是一个函数式接口)替代。现实类也可以用 Lambda 表达式简化。若干个 Pipe 接口的现实类。若干个 Pipe 接口的现实类。

2024-10-17 14:10:25 362

原创 聊聊如何实现一个特别的责任链

什么是责任链责任链是一种设计模式,它让多个对象有机会处理同一个请求,这些对象形成一个链。请求从链的一端开始,逐个传递给链上的对象,直到某个对象处理它或者请求未被处理。这样,发送请求者无需知道哪个对象会处理,实现了发送者与接收者的解耦,增加了系统的灵活性责任链的常用场景权限与认证系统:在登录认证、权限验证流程中,不同的处理者可以检查用户名密码、验证权限级别、处理单点登录等。请求(如访问资源)沿着责任链传递,直到找到合适的处理器来授权或拒绝访问。日志记录与错误处理。

2024-10-15 14:29:48 540

原创 Java集合框架中的神器:全面掌握HashMap与HashSet的使用方法

在Java开发中,集合框架扮演着至关重要的角色,而和是最常用的集合类之一。无论是高效的数据查找、去重,还是存储键值对,和的出现简化了很多开发过程中的复杂操作。本篇博客将深入探讨这两个集合类的使用场景及其所有常用方法,助你全面掌握这两大“神器”。是Java集合框架中最常用的映射表之一,提供了快速的键值对存取能力。其查找、插入和删除的时间复杂度均为O(1),在处理海量数据时表现尤为突出。添加键值对:,将键值对存入映射中。获取值:,根据键查找值。检查键或值是否存在:使用和快速检查键或值。删除键值对:,根据键删除元

2024-10-15 14:29:16 708

原创 锐评 Nodejs 设计模式 - 行为型

迭代器和可迭代对象代表的迭代器设计模式是一种约定。生成器就是一个实现了@@iterator的迭代器。迭代器和生成器既可以是同步也可以是异步。node 中的闭包函数天生就是命令式的。

2024-10-15 14:28:28 609

原创 Redis Time Series 数据结构详解与Java实现

时间序列数据是指按时间顺序排列的一系列数据点,通常由时间戳和对应的数值组成。传感器读数(如温度、湿度)股票价格网站访问量系统性能指标(如CPU使用率、内存占用)通过本文的介绍和代码示例,我们了解了如何使用Redis的Time Series数据结构进行高效的时间序列数据处理。Redis的Time Series数据结构提供了一种高效且易用的方式来管理和查询时间序列数据,适用于各种需要处理大量时间序列数据的应用场景。

2024-10-14 14:23:29 430

原创 Java爬虫技术:自动化抓取问答题库答案

通过Jvpeteer,我们可以先获取到完整的、经过JavaScript渲染的网页内容,然后再利用Jsoup进行进一步的数据提取和解析。在今天,对于问答需求,更为先进且高效的解决方案是接入大型语言模型,利用AI技术来回答用户的问题,不仅能够提供更快速、更准确的答案,还能够根据用户的上下文和需求进行智能推理和定制化回答。代表我们感兴趣的关键词。例如,若我们想搜索“什么是设计模式,列举几种常见的设计模式”,则完整的搜索URL会是:“最后,选择第一个搜索结果链接,进一步解析csdn博客页面,并获取其中的内容。

2024-10-14 14:22:50 1220

原创 两小时学会使用dubbo(直接API、spring、注解、springboot)

Dubbo是一个分布式、高性能、透明化的RPC服务框架,提供服务自动注册、自动发现等高效服务治理方案,可以和Spring框架无缝集成。Dubbo最常用的应用就是远程调用。:配置当前应用信息:配置提供服务的协议信息:配置注册相关信息:配置暴露的服务信息:配置当前应用信息:配置引用的服务信息。

2024-10-14 14:19:57 860

原创 并发-volatile的作用

并发的三大概念,可见性,原子性,有序性。Volatile只能保证可见性和部分的有序性。

2024-10-11 16:20:13 325

原创 AtomicInteger原理,CAS 机制,乐观锁,ABA问题

这种乐观锁(无锁)机制还有一个ABA问题。假如操作的是引用类型,在AB两个线程中,一开始对象是a,在循环中间把对象换成了b,然后又换成了a,对比结果还是a,但是其实中间做了很多其他事情,在并发中可能会导致严重问题。值跟内存里保存的值是不是相等的,相等就执行交换,把加1后的值赋值给内存里的。,再通过处理器的CAS指令,比较一下此时输入的。发现值一直不对,又返回重新执行,需要很大的开销。

2024-10-11 16:19:33 460

原创 文件夹、文件目录递归下载:打包成ZIP压缩包

在准备将文件打包成 ZIP 文件之前,需要设置 HTTP 响应的相关信息,包括字符编码、内容类型和文件名称。它首先获取当前文件夹中的文件列表,然后将这些文件添加到ZIP中。获取子文件夹与文件列表需根据自身业务实现,这里基于数据库查询子文件目录,查询文件目录下的文件,同时又涉及了一些处理业务逻辑。单个文件目录打包ZIP下载与文件目录递归打包ZIP下载类似,首先来看看单个文件目录中的文件是如何打包ZIP下载的。递归文件目录打包ZIP下载相比单个文件目录打包ZIP下载,无非是多了个递归文件目录的操作。

2024-10-11 16:18:59 502

原创 零拷贝原理以及java中实现方式和使用场景

零拷贝技术通过减少数据在用户空间和内核空间之间的复制次数,极大地提升了 I/O 的性能,特别是在大文件传输、网络通信等场景中具有显著的优势。Java 提供的mmap等 API,以及第三方网络框架(如 Netty)的支持,使得零拷贝技术能够被轻松应用于高性能 I/O 应用中。

2024-10-11 16:18:12 386

原创 掌握ApplicationRunner和CommandLineRunner如何使用及实现原理

ApplicationRunner 和 CommandLineRunner 是 Spring Boot 提供的两个接口,允许在 Spring 应用程序启动完成后执行特定的代码。它们的主要作用是在应用启动后执行一段初始化或任务逻辑,常见于一些启动任务,例如加载数据、验证配置、执行调度等。接下来我们就来详细看看它们在项目开发中的实际应用CommandLineRunner 和 ApplicationRunner 常用于应用启动后的初始化任务或一次性任务执行。

2024-10-10 14:56:57 544

原创 LinkedList与ArrayList性能分析和适用场景

经测试: size为100时,100万次中间位置的删除添加,ArrayList耗时91ms,LinkedList耗时174ms。经测试: 在ArrayList索引末尾添加删除操作:23ms 在ArrayList索引头部添加删除操作:204ms 在ArrayList索引头部添加,在尾部删除操作:109ms 在LinkedList索引末尾添加删除操作:22ms 在LinkedList索引头部添加删除操作:24ms 在LinkedList索引头部添加,在尾部删除操作:18ms。

2024-10-10 14:55:57 324

原创 浅谈长轮询及其封装实现

长轮询是与服务器保持即时通信的最简单方式,它不依赖双向通信协议,例如 WebSocket,只需要支持http协议即可 ,也不依赖于浏览器版本等外部条件的兼容性,它很容易实现,也无需引入其他依赖,在很多场景下可以作为即时通信的最简单实现方案和兜底兼容方案。

2024-10-10 14:55:26 2187

原创 显著的性能提升,记录一次小优化竟让接口耗时下降60%,CPU负载降低30%

经过此次 GC 优化经历,我学到了如下经验要通过 GC 日志分析 GC 问题。调整JVM 内存,保证足够的新生代内存。优化 GC 可以降低接口耗时,提高接口可用性。优化 GC 可以有效降低机器 CPU 负载,提高硬件使用率。反过来当接口性能差、cpu负载高的时候,不妨分析一下 GC ,看看有没有优化空间。

2024-10-09 14:22:52 774

原创 线程池中线程是如何保活和回收的

线程池中的线程分为核心线程与非核心线程。核心线程默认不回收,可以通过设置为true来回收。非核心线程在获取任务为空且空闲时间超过一定时间之后进行回收。线程池的保活策略通过阻塞队列的阻塞特性实现,poll方法实现可以指定超时时间的阻塞,take方法实现阻塞直到获取到任务。当线程异常之后,通过新增线程的方式实现线程的补救,保证线程池的运行。

2024-10-09 14:22:14 920

原创 了解final关键字在Java并发编程领域的作用吗?

使用final是所谓的安全发布(safe publication)的一种方式,这里 发布(publication)意味着在一个线程中创建它,同时另一个线程在之后的某时刻可以引用到该新创建的对象。存在如下场景:当JVM调用对象的构造函数时,它必须将各成员赋值,同时存储一个指向该对象的指针;但就像其他普通数据写入一样,这可能是乱序的。而final可以防止此类事情的发生:如果某个成员是final的,JVM规范做出如下明确的保证:一旦对象引用对其他线程可见,则其final成员也必须正确的赋值了。

2024-10-09 14:20:26 586

原创 动态代理是如何在Spring AOP中起作用的?

和。

2024-10-08 14:42:02 681

原创 JDK动态代理是如何通过反射机制实现的?源码解析

说到动态代理必须得先说Class对象。一个Class对象(可通过Class.forName("")获取),代表正在运行中的java应用的类和接口,通过反射机制可以在运行时获取类信息,如:类名、成员属性、构造方法等。其中枚举类(enum)是一种特殊的类,注解 属于 一种接口 ,java中所有注解(@interface)都隐形地继承Annotation接口。数组类也属于Class类,他的Class类对象被同类型数组(元素类型、数组维度相同)共享,具体看Class#getName()的说明。

2024-10-08 14:40:42 379

原创 JAVA多态

多态的概念:通俗来说,就是多种形态。假如我们去喂食宠物,对于猫咪我们肯定喂食猫粮,那么万一是狗肯定对应的是狗粮。总的来说:同一件事情,发生在不同对象身上,就会产生不同的结果。

2024-10-08 14:40:10 597

原创 Effective Java 简要笔记

比如两个通过equal方法判定为相等的对象,在添加到HashSet中时,由于没有覆盖hashCode方法,会重复添加,但是根据Set的定义,Set中的元素应该是唯一的,不能有两个“相等”的对象。对于成员,有四种访问级别,私有的、包级私有、受保护的、公开的。如果成员类没有访问外围类实例的需求,就应该把成员类设计为static的,因为非static的成员类需要外围实例才能创建,在创建成员类实例以后,成员类实例会持有外围类实例的引用,保留这份引用不但需要消耗空间,而且会导致外围类实例不能被GC,造成内存泄漏。

2024-10-06 14:20:39 1664

原创 深入理解Java:从基础到高阶应用

在这篇文章中,我将从Java的核心概念到一些高阶应用展开讨论,帮助大家加深对Java的理解,拓展实际开发中的技术深度。从理解Java的核心特性到掌握JVM的运行机制,再到并发编程与设计模式的应用,我们需要不断深入学习,拓展自己的知识深度。Java中的线程有六个状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)、终止(Terminated)。JVM作为Java平台的核心,不仅提供了跨平台的能力,还管理着Java程序的运行时环境。

2024-10-06 14:19:51 1838

原创 分享几个工作中实用的代码优化技巧!

而使用 KeySet 方法,获得的是key 的集合,需要再进行一次 get 操作,多了一个操作步骤,所以更推荐使用 EntrySet 方式遍历 Map。当这些对象存入 HashMap 时,性能就会非常低,因为 HashMap 是通过 HashCode 定位到 Hash 槽,有冲突的时候,才会使用链表或者红黑树组织节点,固定地返回 0,相当于把 Hash 寻址功能无效了。由于堆资源是多线程共享的,是垃圾回收器工作的主要区域,过多的对象会造成 GC 压力,可以通过局部变量的方式,将变量在栈上分配。

2024-10-06 14:17:27 964

空空如也

空空如也

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

TA关注的人

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