自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 15分钟用Java平台实现Springboot框架构建后端项目框架

首先,本文适合已学习过JavaSE但急于用Java编写一个后端项目的同学,还没学过的同学出门菜鸟教程或者b站黑马程序员,尚硅谷也可。(三者任选其一即可)其次,既然你已经学过了java语言,那么你大概率也接触了python语言,不难发现,相较于java的后端学习成本而言,python其实上手更容易,只需要一百行不到就可以实现绝大部分数据简单的增删改查,可以说路上抓一个人教他两个小时估计也能学会的程度。那为什么我们还要选择Java,或者说为什么我们还要选择Spring框架呢?以下简单列举Spring的优点:规范

2022-06-11 00:00:52 1808

原创 好书速览-深入理解JVM-Part1

计算机好书精读第一期-Part1-JVM虚拟机

2024-06-28 23:58:49 731

原创 速览三版HTTP的改进策略

HTTP/1.1主要通过持久连接、管道化和更丰富的头部字段改进了连接管理和数据传输的效率。HTTP/2引入了二进制分帧、多路复用、头部压缩等技术,显著提升了并行传输的效率和资源加载速度。HTTP/3则基于QUIC协议,克服了TCP协议的局限,提供了更快速、更可靠和更安全的传输机制。

2024-06-07 09:01:47 687

原创 java中的三种拷贝方法

引用拷贝:只复制引用,原对象和新对象指向同一个对象。浅拷贝:创建新对象,但不递归复制成员对象,成员对象仍然是共享的引用。深拷贝:创建新对象,并递归复制所有成员对象,完全独立。这些拷贝方式在实际应用中有不同的使用场景和适用性,根据需要选择合适的拷贝方式可以有效管理内存和对象关系。

2024-06-07 00:50:21 612

原创 JVM内存角度剖析int和integer的区别

int:直接在栈内存中分配,内存占用少,访问速度快。Integer:在堆内存中分配,需要额外的内存开销来存储对象头和元数据,访问速度相对较慢,需要依赖垃圾回收机制管理生命周期。了解这些内存上的区别,有助于在开发中根据具体需求选择合适的数据类型,以优化性能和内存使用。

2024-06-07 00:13:46 556

原创 Java对象一定在堆里吗?引出对象存储方式

在Java程序中,内存分为栈(Stack)和堆(Heap)两部分:栈(Stack):用于存储局部变量和方法调用。当方法被调用时,会在栈中创建一个栈帧,用于存储该方法的局部变量和操作数栈。当方法执行完毕后,该栈帧会被弹出,局部变量也随之销毁。堆(Heap):用于存储所有的对象实例和数组。当通过关键字 new 创建一个对象时,该对象会被分配到堆内存中。堆中的对象不会随着方法的结束而自动销毁,而是由垃圾回收器(Garbage Collector)负责回收。

2024-06-07 00:09:01 302

原创 stash拯救犹豫不决的commit

当使用git时,发现同事提交了代码,但是我的代码的还没有commit,我想先拉取他们的代码一起测试,测试成功后再commit,最好的做法是什么?

2024-04-22 19:51:41 416

原创 属于我们Go语言的toString!

通过实现String()方法,我们可以在 Go 中实现类似于 Java 中的toString()方法的功能,从而自定义类型的字符串表示形式。这种机制为我们提供了更多灵活性,使得在输出自定义类型时能够更加方便和直观。

2024-04-09 17:06:50 759

原创 Go语言不能常量取址!?

总的来说,Go 语言和 C++ 语言在处理常量取址方面有所不同。Go 语言中常量无法被取址,而 C++ 中常量是可以被取址的。这种差异是由于两种语言在常量处理上的设计和实现方式不同所导致的。在编写代码时,开发者应该注意不同语言的特性,并根据实际需求选择合适的语言进行开发。

2024-04-09 17:04:26 377

原创 探讨Java和Go语言的缺点

Go 语言的错误处理机制主要是通过返回错误值来完成的,这导致了大量的错误检查代码,降低了代码的可读性和简洁性。:Java 应用程序通常需要较多的内存资源,这部分是由于 Java 虚拟机(JVM)的存在以及其内存管理机制所导致的。:尽管 Java 提供了一些并发处理的工具和库(比如线程和同步机制),但在处理高并发场景时,开发者可能需要花费更多的精力来管理和调优。通常我们都会讨论Java和GO的优点,如果讨论缺点往往能让人们更清楚优点的重要性,Java和Go的缺点或许往往就是对方优点所在。

2024-04-09 16:59:27 562

原创 MySQL事务特性原理

不同事务可以同时修改相同的数据,而不会相互干扰,因为每个事务看到的是在其开始时数据库的一致状态。适当配置Redo日志文件大小可以在一定程度上影响系统的性能,因为较大的Redo日志文件可以容纳更多的事务记录,但也会增加磁盘写入的开销。隔离性是指多个并发事务之间应该是相互隔离的,一个事务的执行不应影响其他事务的执行。这些步骤保证了数据库的一致性和持久性,同时提供了事务回滚的机制,以应对在事务执行过程中可能发生的错误。不同事务之间的修改不会相互干扰,每个事务看到的是一致的、自己独立的数据视图。

2023-11-17 22:36:43 478

原创 Java内存区域速览

量等。局部变量表中的每个元素都可以存储一个基本数据类型或者一个对对象的引用。

2023-11-17 21:29:00 438

原创 基于操作系统讨论Java线程与进程、浅谈Go的线程与管程

线程是程序执行的一条路径,每个线程都是独立的、并发执行的。在Java中,线程是通过 java.lang.Thread 类来表示的。

2023-11-16 21:11:40 892

原创 StringBuffer和StringBuilder的区别与联系

关键字在方法级别提供线程安全,但这种方式可能会导致在高并发环境下的性能问题。在现代 Java 应用中,建议谨慎考虑是否需要使用。图片中的StringBuffer和StringBuilder都是用了同一个父类方法实现append,在返回this。尽管在单线程环境中,线程安全的问题不再是一个关注点,但。由于其更高的性能而更受欢迎,但在需要确保线程安全的场合,的同步特性依然存在,这会导致一些性能上的差异。,以及是否有更适合的线程安全替代方案。尽管在不使用多线程的情况下,当不使用多线程的情况下,

2023-11-16 19:05:32 160

原创 激活函数的本质

在神经网络中,激活函数通常被用于每个神经元的输出,以便引入非线性变换。如果没有激活函数,整个神经网络将由线性变换组成,多个线性变换的组合仍然是线性的。通过引入非线性激活函数,神经网络可以学习和表示更复杂的函数关系,使其能够适应更广泛的问题。将输入映射到范围 (0, 1) 之间,常用于输出层的二分类问题。类似于 Sigmoid 函数,但将输入映射到范围 (-1, 1) 之间,有时在隐藏层中使用。将负数映射为零,对正数保持不变。是目前最常用的激活函数之一。

2023-11-14 11:20:42 158

原创 深入了解HTTP与HTTPS关键差异与底层原理

在互联网世界中,数据传输的安全性是至关重要的。HTTP(Hypertext Transfer Protocol)和HTTPS(Hypertext Transfer Protocol Secure)是两种广泛使用的协议,它们在保护用户数据和隐私方面存在着重要的差异。本文将深入探讨HTTP与HTTPS的区别与联系,以及它们的底层原理。

2023-11-14 11:18:56 787

原创 Spring Boot: 约定优于配置的软件设计思想

Spring Boot提供了一些称为"Starters"的依赖,它们是预配置的依赖集合,你只需要引入相关的Starter,Spring Boot就会自动配置所需的依赖项。"约定优于配置"不仅仅是Spring Boot的特色,更是一个常见的软件设计思想,旨在实现更高效、更便捷的软件系统的开发和维护。在传统的Spring框架中,这些任务通常需要手动配置,但是Spring Boot通过其约定优于配置的设计理念,大大简化了这些任务,使得开发者不再需要手动处理绝大部分的配置。,让开发者能够更专注于业务逻辑的实现。

2023-11-11 00:57:54 1523

原创 Spring&SpringBoot自动装配

Spring的自动装配(Autoscan or Autowiring)是指Spring框架通过一些特定的规则,自动为应用程序中的Bean之间建立关联关系,而不需要显式地在配置文件中进行声明。它使用约定大于配置的理念,通过默认配置和自动装配来减少开发者的工作。Spring Boot的自动装配是基于Spring框架的自动装配机制的扩展,提供了更多的默认配置和便捷的特性。通过以上方式,Spring框架可以在运行时自动装配应用程序中的组件,减少了手动配置的工作,提高了代码的可维护性和灵活性。

2023-11-11 00:46:39 364

原创 Spring依赖注入与控制反转

IoC是一种更宽泛的概念,它强调控制的反转,而依赖注入是IoC的一种具体实现方式,强调通过注入的方式管理组件之间的依赖关系。在实际应用中,常常会结合使用这些方式,选择适合项目需求的方式来实现依赖注入。例如,使用构造函数注入来保证对象在创建时依赖完全初始化,同时结合设值注入来允许在运行时更改依赖。依赖注入(DI)和控制反转(IoC)是关联的概念,通常在软件设计和开发中一起使用。都可以用于进行依赖注入,但在实际使用中,根据具体的场景和需求,选择合适的注解可以使代码更为清晰和灵活。指定首选注入的 bean。

2023-11-11 00:29:07 443

原创 归结原理、归结演绎推理

检查子句集S中是否包含空子句,若包含,则S不可满足,不包含,就在子句集中选择合适的子句进行归结,归结出空子句,则S不可满足。一个谓词公式的所有量词均非否定地出现在公式的最前面,且它的辖域一直延伸到公式之末,同时公式中不出现连接词→及 ↔。例如,如果有两个条件 A 和 B,A ∧ B 表示只有当 A 和 B 都为真时,整个条件才为真。,它表示在多个条件都为真时,整个条件为真。如:P(x) ∧ (P(x)∨Q(y)∨~ R(x,y))如:P(x)∨(P(x)∧Q(y)∧~R(x,y))

2023-10-28 17:02:01 2422 1

原创 数据库索引种类

索引的本质是一种排好序的快速查找数据结构,用于满足特定查找算法。通常情况下,每张表只能有一个聚簇索引,因为数据行的物理存储顺序只能有一个。这与非聚簇索引不同,一张表可以有多个非聚簇索引。聚簇索引通常与表的主键相关联。主键是表的唯一标识符,使用聚簇索引对主键列进行快速查找非常有效。的,因为它确定了数据行的物理存储顺序。通常,表的主键列用于创建聚簇索引,以确保数据行的唯一性。的键值顺序在磁盘上连续存储,这有助于减少磁盘I/O操作,提高查询性能。因此,在选择是否使用索引时,需要综合考虑索引的优点和缺点。

2023-10-19 21:59:16 126

原创 InnoDB 与 MyISAM的比较(含其他存储引擎)

MySQL的存储引擎是用于管理数据的底层系统组件,它定义了数据如何存储、检索和管理。不同的存储引擎提供不同的功能和性能特点,以满足不同类型的应用需求。

2023-10-19 20:32:09 140

原创 动态规划解股票类型

在遍历结束后,函数返回两种情况的最大值,即最大利润。用动态规划的方法来解决买卖股票的问题,确保在每一天都选择最优的策略以获得最大的利润。用于记录未购买股票时的最大利润。在一个循环中,它逐步计算了每一天的最佳策略,然后返回最后一天的最大利润。这个算法的关键在于动态地维护四个变量,以确保在每一天都考虑了两次交易的情况,并计算出最大利润。用minprice记录最小的值,用maxprofit记录最大的收益。关键思路:找到一个值,他与之后的最大值之差最大。用于记录已购买股票后的最大利润,而。

2023-10-19 08:39:57 101

原创 深度分析AMQP以及在rabbitMQ中的应用

AMQP定义了不同类型的交换器,如直接交换器、主题交换器、扇出交换器等,每种类型都有不同的消息路由规则。总之,信道是AMQP连接内的逻辑通信通道,它们提供了多路复用、资源隔离、性能优化和错误处理等重要功能,使AMQP成为一个强大的消息传递协议。这意味着一个应用程序可以在一个连接上创建多个信道,并在这些信道上并行执行不同的操作,如发送和接收消息,声明队列和交换器等。消息持久化:在 RabbitMQ 中,客户端可以使用消息持久化功能,确保即使在 RabbitMQ 服务器崩溃或重启时,也可以保留已发送的消息。

2023-10-18 19:58:53 617

原创 Java常见队列和栈构造与常用方法

BlockingQueue是Java中的一个阻塞队列,它继承了Queue接口,并提供了一些阻塞操作的方法。优先队列中的元素按照优先级进行排序,优先级最高的元素排在队列的前面。ArrayDeque是Java中的双端队列,它可以在两端高效地插入和删除元素,因而具有比Stack和LinkedList更好的性能。带有初始容量和比较器的构造函数:创建一个指定初始容量和比较器的空优先队列。带有初始容量的构造函数:创建一个指定初始容量的空优先队列。带有初始容量的构造函数:创建一个指定初始容量的空双端队列。

2023-10-16 13:48:20 173

原创 JDK1.8对HashMap的优化、以及通过源码解析1,8扩容机制

这些优化使得 JDK 1.8 中的 HashMap 在处理大规模数据和多线程环境下表现更好,同时也减少了哈希碰撞的影响,提高了性能和稳定性。然而,需要注意的是,具体的实现可能因不同的 JDK 版本而有所不同,因此在选择和使用 HashMap 时需要考虑 JDK 版本的影响。在1.8之前,扩容时,会将每个元素都进行重新Hash,再放入到新的桶中。可以指导,如果原先的容量已经是大于等于最大容量了,则HahMap不可以再扩,阀值threshold也变为 了小大整数不可以被超越。将新的阀值扩展为原先的两倍。

2023-10-15 19:38:44 892

原创 JDK8、11、17的新特性

Java Development Kit (JDK) 1.8,也被称为Java 8,引入了许多新特性和改进,其中最显著的是Lambda表达式和Stream API。这个新的 API 提供了更灵活、更易于使用的日期和时间操作方式。: JDK 11 包含 JUnit 5,这是一个流行的 Java 单元测试框架,提供了新的功能和改进,以帮助开发者更容易地编写和运行单元测试。: JDK 11 引入了一个新的垃圾回收器,称为 Epsilon,它是一个实验性的垃圾回收器,专注于极低的延迟和极高的吞吐量。

2023-10-15 16:11:51 288

原创 token、cookie、session的对比以及Java实现

Token、Cookie和Session是用于实现用户身份验证和状态管理的常见技术。它们各自有不同的实现原理、优点和缺点。选择哪种方法取决于您的应用程序需求。Token通常更适合,而。最佳实践是将它们结合使用,例如,。

2023-10-14 19:42:24 841

原创 redis与 缓存击穿、缓存穿透、缓存雪崩

缓存击穿、缓存穿透和缓存雪崩是与缓存相关的三种常见问题,它们可以在高并发的应用中导致性能问题。以下是它们的解释:缓存击穿(Cache Miss)缓存穿透(Cache Penetration)缓存雪崩(Cache Avalanche)总结:缓存击穿是由于缓存中缺少某个热门数据项而导致的性能问题,缓存穿透是由于不合法的查询请求而导致的性能问题,而缓存雪崩则是由于大量缓存同时过期而导致的性能问题。

2023-10-12 11:31:46 380

原创 redis极速的奥秘

内存读写是比在磁盘快很多的,Redis 基于内存存储实现的数据库,相对于数据存在磁盘的 MySQL 数据库,省去磁盘 I/O的消耗。而使用数据持久化的情况下,Redis会将数据同时保存在内存和磁盘中。Redis提供了两种持久化方式:RDB(Redis Database)和AOF(Append Only File)。。如果AOF文件损坏或不完整,才会使用RDB文件进行恢复。

2023-10-12 11:15:02 233

原创 JVM-Java字节码的组成部分

字节码文件的结构和内容是由Java编译器生成的,而JVM负责解释和执行这些字节码指令。常量池是Java字节码文件的一个重要部分,它包含了各种常量,如字符串、类和字段引用、方法描述符等。常量池是一个表格结构,每个常量都有一个索引,通过这个索引可以在常量池中查找具体的常量。Java字节码文件是一种由Java编译器生成的二进制文件,用于在Java虚拟机(JVM)上执行Java程序。方法定义包括方法的访问修饰符、名称、方法描述符(参数类型和返回类型的描述)、方法的字节码指令序列以及异常表。

2023-10-11 20:35:42 551

原创 Java的引用详解与示例

在Java中,引用(Reference)是一种重要的概念,它们用于管理对象的生命周期、内存分配和垃圾回收。:引用帮助Java虚拟机(JVM)管理内存。当一个对象不再被引用时,它就成为了垃圾,,释放其占用的内存,以便为其他对象腾出空间。:通过使用不同类型的引用,可以控制对象的生命周期。例如,强引用(Strong Reference)会阻止对象被垃圾回收,直到该引用不再存在。

2023-10-10 20:59:51 116

原创 MySQL为什么使用B+树而不是跳表

这只是一个简单的B+树实现示例,实际上的实现可能需要更多的细节和优化,特别是在节点分裂、合并和平衡等方面。请注意,B+树是一种复杂的数据结构,实际用于生产环境中的数据库系统通常会有更复杂和高效的实现。在Java中实现一个简单的B+树数据结构可以是一个复杂的任务,因为需要处理插入、删除、查找等操作,并且需要维护B+树的平衡性质。相对于平衡树,跳表的实现较为简单,并且在某些情况下具有相似的性能。请注意,实际的跳表实现可能会包含更多细节和优化,特别是在插入和删除操作时需要维护跳表的平衡性。

2023-10-08 18:43:40 1014 1

原创 rabbitMQ的exchanages类型以及使用场景

RabbitMQ 支持多种交换机(exchanges)类型,用于在不同的消息发布和消费场景中进行路由和分发消息。以下是 RabbitMQ 中常见的几种交换机类型:这些不同类型的交换机允许 RabbitMQ 在不同的消息路由场景中进行灵活的配置和分发。消息发布者可以根据应用程序的需求选择合适的交换机类型来实现消息的有效分发和路由。

2023-10-08 10:52:15 476

原创 RabbitMQ队列持久化的重要性与意义

但无论如何,持久化队列是确保消息系统的可靠性的不可或缺的一部分。然而,如果队列没有持久化,一旦RabbitMQ服务器发生故障或者重启,所有未被处理的消息都会丢失。持久化队列意味着即使在消息进入队列后,但在被消费之前,如果RabbitMQ服务器崩溃,消息也会得到保留。可用性问题:没有持久化的队列和消息无法在服务器故障后恢复,可能导致应用程序无法正常运行,需要手动处理消息丢失和恢复。数据丢失:没有持久化的队列和消息会导致在服务器故障或者重启时所有未处理的消息丢失,可能导致数据丢失和消息不可靠性。

2023-10-08 00:23:43 382

原创 RabbitMQ中的手动应答和自动应答

当使用RabbitMQ来处理消息时,消息确认是一个重要的概念。RabbitMQ提供了两种不同的消息确认方式:自动应答(Automatic Acknowledgment)和手动应答(Manual Acknowledgment)。这两种方式适用于不同的应用场景,本文将通过Java代码示例来演示它们的区别以及如何在实际应用中使用它们。

2023-10-08 00:09:41 986

原创 RabbitMQ中basic**方法汇总与参数解释

当使用RabbitMQ进行消息传递时,Channel对象提供了一组称为"basic方法"的方法,用于执行最基本的消息传递操作。在本篇博客中,我们将详细介绍这些方法,包括示例和参数解释。

2023-10-07 21:37:45 796

原创 InnoDB 事务的四种隔离机制以及底层实现原理

事务快照(Transaction Snapshot)用于确定在一个事务执行期间可以看到哪些数据版本。事务快照的创建是为了维持隔离性和一致性,特别是在使用多版本并发控制(MVCC)实现不同事务隔离级别时。当一个事务开始执行时,它会记录当前时间戳或事务ID作为自己的事务开始时快照。这个快照表示了事务启动时数据库的状态。在事务执行期间,所有读取数据的操作都会使用事务开始时的快照,而不是实时的数据库状态。这意味着事务会看到在它开始之前已提交的数据版本,而不会看到后续未提交的数据修改。

2023-10-07 00:16:40 262

原创 CompletableFuture 和 Future 的选择,以及CompletableFuture的用法

在 Java 编程中,异步编程是一种重要的技术,它允许你在执行长时间运行的任务时不会阻塞主线程。为了支持异步编程,Java 提供了Future和这两个关键的类。在本文中,我们将比较它们的特点、优缺点以及使用场景。

2023-10-06 23:40:58 269

原创 为什么InnoDB选择B+树而不是红黑树作为索引结构?

在数据库管理系统中,索引结构的选择对于数据库的性能和效率至关重要。MySQL的InnoDB存储引擎是一个广泛使用的数据库引擎,它选择了B+树作为索引结构,而不是像红黑树那样的其他数据结构。本文将探讨为什么InnoDB选择B+树,并解释B+树与红黑树之间的区别以及对应的规则。

2023-10-06 23:05:36 890

空空如也

空空如也

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

TA关注的人

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