
长篇大论
文章平均质量分 96
对技术深入、详细的剖析讲解
_whitepure
这个作者很懒,什么都没留下…
展开
-
Java中的数据类型全面详解
在 Java 中使用final关键字来修饰常量,声明方式和变量类似。要声明一个常量,第一需要制定数据类型,第二需要通过finalfinal 数据类型 常量名称[=值]。final当final修饰变量就变成了常量;当final用于修饰方法时,表示该方法不能被子类重写;当final用于修饰类时,表示该类不能被继承;常量因为被final修饰一旦初始化后,其值就不能再被修改,所以在定义常量时就需要对该常量进行初始化。为了与变量区别,提高代码的可读性和可维护性,常量取名一般都用大写字符,单词之间使用下划线。原创 2021-01-02 19:05:02 · 2015 阅读 · 1 评论 -
Java中的运算全面详解
在Java中,其实是通过值传递实现的参数传递,只不过对于Java对象的传递,传递的内容是对象的引用的副本。而计算机中的随机函数是按照一定的算法模拟产生的,其结果是确定的,可见的。将待转的数字乘以2,取出整数部分作为二进制表示的第1位,然后再将小数部分乘以2,将得到的整数部分作为二进制表示的第2位,以此类推,直到小数部分为0。表达式是由运算符和运算对象组成的,表达式可以定义为一组变量、常量、运算符等符号的组合,其结构形成一个计算值的过程,换句话说,表达式是用来计算值的一种编程结构。原创 2021-01-11 17:20:37 · 1970 阅读 · 1 评论 -
Java中的面向对象详解
面向对象简称OO()是相对面向过程()来说的,是一种编程思想,Java就是一门面向对象的语言,包括三大特性和六大原则。其中,三大特性指的是封装、继承和多态。六大原则指的是单一职责原则、开放封闭原则、迪米特原则、里氏替换原则、依赖倒置原则以及接口隔离原则。单一职责原则是指一个类应该是一组相关性很高的函数和数据的封装,这是为了提高程序的内聚性,而其他五个原则是通过抽象来实现的,目的是为了降低程序的耦合性以及提高可扩展性。面向对象编程简称OOP(),是将事务高度抽象化的编程模式。面向对象编程是以功能来划分问题的,原创 2021-02-23 15:06:22 · 2031 阅读 · 1 评论 -
Java中的IO及序列化详解
想要实现自定义序列化和反序列化,可以在被序列化的类中增加和readObject方法来实现。举个例子,看一下ArrayList实现了接口且有自定义,那么我们就可以对它进行序列化及反序列化。ArrayList底层是通过数组实现的,其中数组其实就是用来保存列表中的元素的。因为是被transient修饰的,所以这个成员变量不会被序列化而保留下来。那么为什么却通过序列化和反序列化把List中的元素保留下来了呢?ArrayList。原创 2021-04-17 16:50:10 · 1214 阅读 · 1 评论 -
Java中的泛型详解
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。泛型方法是Java中一种特殊的方法,它在声明时可以使用泛型类型参数,使得方法在调用时可以接受不同类型的参数,并且能够保证类型安全。需要注意的是,泛型在Java中是通过类型擦除来实现的,这意味着泛型信息只在编译时存在,而在运行时会被擦除。在Java中,泛型是一种强大的编程特性,允许类、接口和方法在定义时声明一种参数化类型,而在使用时可以指定具体的类型参数。在编译时,泛型类型被擦除,实际操作的对象是原始类型。原创 2024-07-16 09:53:15 · 1382 阅读 · 0 评论 -
Java中的多线程详解
进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。一条线程指的是进程中的一个单一顺序的控制流,一个进程至少有一个线程,一个进程中可以并发多个线程,多个线程可共享数据,每条线程并行执行不同的任务。Java程序是多线程程序,每启动一个Java程序,至少我们知道的都会包含一个主线程和一个垃圾回收线程。而且启动的时候,每条线程可以并行执行不同的任务。无论并行、并发,都可以有多个线程执行,如果是多个线程抢占一个CPU,交替执行,并且CPU通过时间片轮转等机制切换执行线程,这种情况下称为并发执行原创 2021-06-09 22:18:08 · 5599 阅读 · 6 评论 -
JavaObject类方法详解
如果有多个线程在该对象上等待,具体唤醒哪一个线程是由线程调度器决定的,并且是不确定的。方法,返回值为int类型,根据一定的规则将与对象相关的信息,如对象的存储地址,对象的字段等,映射成一个数值,这个数值称作为。当一个对象变成一个垃圾对象的时候,如果此对象的内存被回收,那么就会调用该类中定义的。还有有一种隐式的调用方法,当你将一个对象与字符串进行拼接操作时,如果对象不是字符串类型,Java会自动调用该对象的。方法用于创建并返回一个对象的副本,对象克隆指的是创建一个新的对象,新对象的内容与原始对象相同。原创 2021-08-27 18:41:57 · 1711 阅读 · 2 评论 -
Java中的枚举详解
枚举在Java中是一种特殊的类,用来定义一组固定的常量。它在Java5中引入,提供了一种类型安全的方式来定义和使用常量集合。尽管enum看起来像是新的数据类型,但它实际上是一个受限制的类,继承自。在编译时,编译器生成的类包含了所有定义的常量,并提供了内置的方法,如values()和valueOf(),用来获取所有枚举常量或根据名称返回特定常量。枚举的引入不仅增强了代码的可读性,还提供了更强大的功能和灵活性。Java枚举不仅可以定义常量,还可以实现接口,提供额外的行为和功能。原创 2024-07-20 09:56:22 · 1281 阅读 · 0 评论 -
Java中的反射详解
在Java程序运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性。这种动态获取信息以及动态调用对象方法的功能,称为Java语言的反射机制。反射是Java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作。通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。程序中一般的对象的类型都是在编译期就确定下来的,而Java反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。原创 2023-05-05 10:00:12 · 1577 阅读 · 0 评论 -
Java中的集合详解
Java中的集合主要包括Collection和Map两种,Collection存储着对象的集合,而Map存储着键值对的映射表。由于数组没有提供任何的封装,所有对元素的操作,都是通过自定义的方法实现的,对数组元素的操作比较麻烦,好在Java自带了一些API供开发者调用。原创 2021-10-28 19:50:15 · 1152 阅读 · 1 评论 -
Java中的异常详解
在Java中,自定义异常类可以帮助你创建特定于你的应用程序的异常类型,这些异常类型可以提供更清晰的错误描述,并使错误处理更加灵活和精确。在Java中自定义异常,但所有自定义异常都必须是Throwable的子类。如果希望写一个检查性异常类,则需要继承Exception类。如果你想写一个运行时异常类,那么需要继承类。// 创建一个自定义的受检查异常类// 使用自定义异常// 条件判断或业务逻辑// 创建一个自定义的非受检查异常类// 使用自定义异常// 条件判断或业务逻辑。原创 2021-04-08 21:07:17 · 666 阅读 · 1 评论 -
transient关键字详解
这是因为static字段属于类而不是某个具体的对象,序列化是对象级别的操作,它保存的是对象的实例状态,而static字段是类级别的状态,不属于任何具体对象,因此在序列化过程中被忽略。也就是说,使用transient修饰的字段在序列化过程中将被忽略,反序列化时这些字段会被初始化为默认值,基本数据类型为0,引用类型为null。transient译为“临时的”,它可以阻止字段被序列化到文件中,在被反序列化后,transient字段的值被设为初始值,比如int型的初始值为0,对象型的初始值为null。原创 2024-08-18 16:52:50 · 2530 阅读 · 0 评论 -
volatile关键字详解
缓存一致性协议: 每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行修改操作的时候,会强制重新从系统内存里把数据读到处理器缓存里。在多线程环境下,CPU轮流切换线程执行,有可能某个线程修改了数据,准备回主内存,此时CPU切换到另一个线程修改了数据,并且写回到了主内存,此时就导致数据的不准确。的作用就是,当某个线程工作内存中的值与主内存中的值,如果不相同就会一直。原创 2024-07-12 22:15:28 · 1525 阅读 · 0 评论 -
this关键字详解
在JVM内部,它通过栈帧管理和字节码指令实现了对当前对象的引用,使得实例方法可以操作调用对象的属性和方法。它是类内部对当前对象的引用,因此在实例方法或构造方法中,可以通过。看成一个特殊变量,它保存着当前对象的内存地址,并允许你在类内部访问该对象的属性和方法。的执行原理在于它是一个隐式传递的参数,指向当前对象实例,并在编译和执行过程中通过。在多线程环境中,JVM为方法分配独立的栈帧,每个线程操作自己的栈,因此。是一个内置的引用,代表了“当前对象”,它指向当前对象的实例。是一个特殊的引用,指向当前对象的实例。原创 2024-11-01 08:00:00 · 1210 阅读 · 0 评论 -
static关键字详解
除此之外,这种理解有助于优化类的加载性能,减少不必要的初始化开销,并能够正确实现一些设计模式,确保类在多线程环境下的稳定性。例如,静态变量用于保存所有对象共享的状态,而静态方法可用于提供通用的工具函数,这些功能可以直接通过类名访问,无需实例化对象。是Java中的一个关键字,用于定义类级别的成员,类级别的成员是指那些属于整个类,而不是特定对象实例的成员。时,JVM在方法区为这些静态成员分配内存,这块内存被所有类的实例共享,并在整个类的生命周期内保持不变,所以静态变量不需要为每个对象实例重新创建。原创 2024-08-11 08:00:00 · 859 阅读 · 0 评论 -
strictfp关键字详解
BigDecimal的运算逻辑完全在Java的标准库中实现,并不依赖于任何特定平台的硬件或操作系统的浮点运算单元,所以在任何平台上使BigDecimal进行相同的计算时,结果都是一致的,但并不是它在所有场景下都是最合适的选择。在没有使用strictfp时,Java虚拟机可能利用硬件浮点运算的特性来优化计算,这就可能导致在不同平台上,浮点运算的结果不完全一致。而且大多数应用程序的浮点计算已经足够一致,满足了实际需求,因此不需要额外的strictfp关键字来保证浮点运算的一致性,strictfp了解即可。原创 2024-08-18 08:00:00 · 1039 阅读 · 0 评论 -
JVM详解
除了这三种类加载器之外,用户还可以加入自定义的类加载器来进行拓展,以满足自己的特殊需求。就比如说,我们可以对 Java 类的字节码(.class文件)进行加密,加载时再利用自定义的类加载器对其解密。隔离加载类修改类加载的方式扩展加载源防止源码泄漏若要实现自定义类加载器,只需要继承类,按需重写相关方法即可。如果不想打破双亲委派模型,那么只需要重写findClass方法如果想打破双亲委派模型,那么就重写整个loadClass方法。原创 2024-06-26 10:46:55 · 1390 阅读 · 0 评论 -
Spring详解
Spring是一个轻量级的Java开源框架,是为了解决企业应用开发的复杂性而创建的。Spring的核心是控制反转(IOC)和面向切面(AOP)。Spring虽然把它当成框架来使用,但其本质是一个容器,即IOC容器。里面最核心是如何创建对象和管理对象,包含了Bean的生命周期和Spring的一些扩展点,也包含对AOP的应用。除此之外,Spring真正的强大之处在于其生态,它包含了、、等一些列框架,极大提高了开发效率。、和是Java生态系统中常见的三个框架:Spring启动流程的主要步骤及对应的代码如下:初原创 2024-07-19 09:51:43 · 933 阅读 · 0 评论 -
SpringBoot详解
SpringBoot提供了一种新的编程范式,可以更加快速便捷地开发Spring项目,在开发过程当中可以专注于应用程序本身的功能开发,而无需在Spring配置上花太大的工夫。因此,把应用的主类放在根包中,SpringBoot就会自动扫描并加载所有需要的组件和配置,让你可以专注于编写业务代码,而不用担心复杂的配置细节。启用了SpringBoot的自动配置功能,SpringBoot会根据项目中的依赖,自动配置很多常用的 Spring组件,这样就不需要手动配置它们。在实际测试中,有时候需要测试场景中加载配置,原创 2024-07-26 15:52:30 · 23955 阅读 · 0 评论 -
Netty详解
Netty是一个高性能、异步的网络应用框架,用于开发高效的网络通信程序。它是JavaNIO的一个抽象,简化了网络编程的复杂性,并提供了一系列高级功能,使网络编程变得更简单。Netty是一个高效的网络框架,专注于处理大量并发连接。它通过异步IO处理来避免阻塞,这让它在处理高并发时表现出色。Netty还利用了优化的内存管理和零拷贝技术,降低了性能开销。框架的灵活性也很高,开发者可以通过管道机制自定义数据处理流程,API和文档丰富,帮助简化网络编程。不过,Netty。原创 2024-07-31 20:40:14 · 5106 阅读 · 0 评论 -
Redis详解
Redis全称,是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API的非关系型数据库。简而言之,Redis是一个可基于内存亦可持久化的日志型、Key-Value非关系型数据库。非关系型数据库,简称NoSQL,是的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称,泛指非关系型的数据库。NoSQL不依赖业务逻辑方式存储,而以简单的Key-Value模式存储。因此大大的增加了数据库的扩展能力。Redis。原创 2021-09-09 14:58:40 · 2836 阅读 · 1 评论 -
Kafka详解
发布者和订阅者之间有时间上的依赖性:针对某个主题的订阅者,它必须创建一个订阅之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。半数以上完成同步才可以发ACK,如果挂了n台有副本的服务器,那么就需要有另外n台正常发送(这样正常发送的刚好是总数(挂的和没挂的)的一半(n(挂的)+n(正常的)=2n)),因为是半数以上所以2n+1。,但是确实Erlang语言阻止了大量的Java工程师去深入研究和掌控它,对公司而言,几乎处于不可控的状态,但是确实人家是开源的,比较稳定的支持,活跃度也高。原创 2024-04-13 13:26:12 · 1567 阅读 · 0 评论 -
Elasticsearch详解
文档更新也是类似的操作方式,当一个文档被更新时,旧版本文档被标记删除,文档的新版本被索引到一个新的段中。如果是非主节点宕机了,那么会由主节点,让那个宕机节点上的主分片的数据转移到其他机器上的副本数据。接着你要是修复了那个宕机机器,重启了之后,主节点会控制将缺失的副本数据分配过去,同步后续修改的数据之类的,让集群恢复正常。当一个节点被选举成为主节点时,它将负责管理集群范围内的所有的变更,例如,增加、删除索引,或者增加、删除节点等。如果主分片发生故障并被替换,集群会将新的主分片的数据从副本分片恢复。原创 2023-05-04 15:37:53 · 2107 阅读 · 0 评论 -
MySQL详解
文章目录MySql逻辑架构MySqlSQL优化索引索引的优缺点索引分类及操作索引建立原则执行计划id、tableselect_typetypepossible_keys、keykey_lenrefrowsExtraSQL优化案例单表优化两表优化避免索引失效的一些原则SQL优化方法exist和in选择order by优化排查SQL慢SQL日志设置查看慢SQL日志模拟数据并分析SQL全局查询日志MySql锁机制使用锁表锁行锁MySql逻辑架构主要分为:连接层,服务层,引擎层,存储层。客户端执行一条sele原创 2021-09-21 19:22:01 · 2136 阅读 · 0 评论 -
微服务治理详解
—大意:简而言之,微服务体系结构风格是一种将单个应用程序开发为一套小型服务的方法,每个服务运行在自己的进程中,并与轻量级机制(通常是HTTP资源API)通信。这些服务是围绕业务功能构建的,可以通过全自动部署机制进行独立部署。对这些服务的集中管理是最低限度的,这些服务可能用不同的编程语言编写,并使用不同的数据存储技术。原创 2024-11-16 22:55:12 · 1192 阅读 · 0 评论 -
分布式锁详解
它管理数据一致性,防止多个节点同时修改相同数据,处理资源竞争,保障事务原子性,避免任务重复执行,同时协调和同步节点操作,减少死锁的可能性。例如,在表中记录锁的创建时间,并定期检查是否超时,如果超时则自动释放锁。只有在比自己序号小的节点被删除后,才会再次检查自己是否成为最小的节点,进而获取锁。利用顺序节点实现锁的公平性,保证了锁的获取顺序。,查出来的数据是相同的,然后依次执行库存减一操作,此时库存会变成-1件,这就造成了超卖问题。当释放锁时,节点会检查锁的持有者是否匹配,只有匹配的情况下才会删除锁。原创 2024-07-27 12:50:48 · 2201 阅读 · 13 评论 -
分布式事务详解
其中AP在实际应用中比较多,AP舍弃一致性,保证可用性和分区容忍性,但是在实际生产中很多场景都要实现一致性,比如主数据库向从数据库同步数据,即使不要一致性,但是最终也要将数据同步成功来保证数据一致,这种一致性和CAP中的一致性不同。例子中形成了一个事务,若张三或李四其中一人拒绝付款,或者钱不够,老板都不会出票,并且把已收的钱退回。整个事务过程由事务管理器和参与者组成,老板就是事务管理器,张三、李四就是事务参与者,事务管理器负责抉择整个分布式事务的提交和回滚,事务参与者负责自己的本地事务提交和回滚。原创 2021-08-19 17:06:31 · 1696 阅读 · 0 评论 -
分布式ID详解
在分库之后, 数据遍布在不同服务器上的数据库,数据库的自增主键已经没办法满足生成的主键唯一了,这个时候就需要生成分布式。适用于并发不高,但是数据量太大导致的分库分表扩容,可能每秒最高并发最多就几百,那么就走单独的一个库和表生成自增主键即可。雪花算法相对来说还是比较靠谱的,毫秒数在高位,自增序列在低位,整个ID都是趋势递增的。不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成ID的性能也是非常高的,能达到百万计。生成,如果是高并发啥的,那么用这个应该性能比较好,一般每秒几万并发的场景,也足够用了。原创 2024-07-26 17:24:18 · 1013 阅读 · 0 评论 -
内存泄漏详解
内存泄漏是指不使用的对象持续占有内存使得内存得不到释放,从而造成内存空间的浪费。严格来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏。但实际情况很多时候一些不太好的实践会导致对象的生命周期变得很长,甚至导致00M,也可以叫做宽泛意义上的“内存泄漏”。举个例子,创建的连接不再使用时,需要调用close方法关闭连接,只有连接被关闭后,GC才会回收对应的对象。忘记关闭这些资源会导致持续占有内存,无法被GC回收。这样就会导致内存泄露,最终导致内存溢出。try{原创 2024-07-23 10:54:03 · 4731 阅读 · 1 评论 -
常用数据结构与算法
数据结构是一门研究数据组织方式的学科,是编程语言的重要组成部分。学好数据结构,可以编写出更高效的代码,同时为学习和掌握算法奠定坚实的基础。数据结构分为两大类:线性结构和非线性结构。线性结构是最常用的数据结构,其特点是数据元素之间存在一对一的线性关系。根据存储方式的不同,线性结构分为顺序存储和链式存储:常见的线性结构包括数组、链表、队列和栈。非线性结构则包括多维数组、广义表、树和图等形式。常见的线性数据结构包括数组、链表、栈、队列和哈希表。数组是一种固定大小的元素集合,存储在连续内存空间中,支持快速随机访问。原创 2024-11-23 15:48:12 · 1001 阅读 · 0 评论