Java
文章平均质量分 87
学习 Java
sco5282
这个作者很懒,什么都没留下…
展开
-
详解 SPI 机制
新建一个 maven 项目// 获取型号// 开关// 调节温度// 模式变更用 maven 把它打成 jar 包,供后续的服务实现使用(服务提供者在项目中就可以引入这个 jar 包)有了这套规范,就保证了产品后期不管怎么更新换代,都能接入到系统来Spring SPI 配置文件是一个固定的文件 -//获取所有factories文件中配置的LoggingSystemFactorySpring 也是支持 ClassPath 中存在多个。原创 2024-10-07 12:33:59 · 936 阅读 · 0 评论 -
【异步】Futurn、FutureTask、CompletionService、CompletableFuture
所以,强烈建议你要根据不同的业务类型创建不同的线程池,以避免互相干扰。对于烧水泡茶这个程序,一种最优的分工方案:用两个线程 T1 和 T2 来完成烧水泡茶程序,T1 负责洗水壶、烧开水、泡茶这三道工序,T2 负责洗茶壶、洗茶杯、拿茶叶三道工序,其中 T1 在执行泡茶这道工序时需要等待 T2 完成拿茶叶的工序。场景:一个大的任务可以拆分成多个子任务,并且子任务之间有明显的先后顺序或者一个子任务依赖另一个子任务完成的结果时,那么 CompletionStage 是一个不错的选择。,我们知道创建线程的几种方式。原创 2023-06-16 17:29:39 · 965 阅读 · 0 评论 -
【HttpURLConnection】使用 HttpURLConnection 后台模拟实现 HTTP 请求
在 SpringBoot 工程中,通过 HttpURLConnection 类来实现 HTTP 请求吧。类 HttpURLConnection 是 JDK 自带的。它的应用场景:在自己的工程中,你想调用第三方接口(外部接口)来获取数据,那么 HttpURLConnection 类就可以实现。接下来通过两个小案例来进行实现吧。开发步骤:先开发外部接口再开发内部接口在内部接口中,通过类 HttpURLConnection 去调用外部接口为了测试方便,我这里就将外部接口、内部接口,全写在通过一个原创 2021-11-21 19:07:59 · 2040 阅读 · 0 评论 -
【Log】(三)Java 中的日志框架 logback、log4j2
1. logback 学习1.1 logback 介绍logback 是由 log4j 创始人设计的另一个开源日志组件,性能比 log4j 好logback 主要分为 3 个模块:logback-core:其它两个模块的基础模块logback-classic:它是 log4j 的一个改良版本,同时它完整实现了 slf4j APIlogback-access:访问模块与 Servlet原创 2021-12-06 22:01:45 · 1733 阅读 · 0 评论 -
【Log】(二)Java 中的日志框架 JCL、SLF
【Log】Java 中的日志框架(上)JUL、Log4j前言JUL 用起来简单、方便,不需要引入第三方依赖,适合小型应用。Log4j 同样适用起来简单,但它配置更为强大。那么,我们该如何选择这两个日志框架呢?其实,这根据我们项目需求而定的。举个简单例子:在项目初期,功能简单,我们可以使用比较简单的日志框架 JUL。因为,它使用起来灵活,不需要导入第三方依赖。随着功能的日益完善,当初的日志框架无法满足现在的需求,那么就得进行日志的升级了,如:切换成 Log4j。如果从 JUL 切换成 Log4j,那么原创 2021-12-05 00:44:46 · 875 阅读 · 0 评论 -
【Log】(一)Java 中的日志框架JUL、Log4j
现有的日志框架:日志门面:JCL(Jakarta Common Logging)、SLF日志实现:JUL(Java Util Logging)、log4j、logback、log4j21. JUL 学习1.1 JUL 介绍JUL:全称 Jakarta Common Logging,它是 Java 原生的日志框架,使用时不需要引入第三方类库,相对其它日志框架使用方便、学习简单,能够在小型应用中灵活使用。架构:Loggers:记录器。应用程序通过获取 Logger 对象,调用其 API 来原创 2021-12-01 21:05:56 · 836 阅读 · 0 评论 -
【JDK】Java 中的语法糖
这篇博文咱们就来谈谈 Java 中一个有趣的知识点 ------ 语法糖1. 语法糖简介那么,什么是语法糖呢?语法糖:又称 “糖衣语法”。指:计算机语言中添加的某种语法。这种语法对语言的功能没有影响,只是为了方便程序员开发,提高开发效率,提高程序的可读性(语法糖的存在主要是方便开发人员使用)。解语法糖:但是,JVM 并不支持语法糖的。语法糖在程序编译后就会被还原成最原始的基础语法结构,这个过程就是 解语法糖(Java 中的语法糖只存在于编译期)。所以,在 Java 中,真正支持语法糖的是 Ja原创 2021-11-01 17:52:00 · 897 阅读 · 1 评论 -
【Excel】Java 操作 Excel 的两种方式:POI、EasyExcel
1. 了解 POI 和 EasyExcelJava 中,常见的用来操作 Excel 的方式有 2 种:POI、EasyExcel。主要用于:对 Excel 进行导入、导出。POI:Apache。一种原生操作 Excel(复杂)HSSF : 读写 Microsoft Excel XLS 格式文档XSSF : 读写 Microsoft Excel OOXML XLSX 格式文档SXSSF : 读写 Microsoft Excel OOXML XLSX 格式文档(优化)EasyExcel:更像原创 2021-10-06 14:27:39 · 2116 阅读 · 0 评论 -
【Java 8】手把手教你 Stream 类
1. Stream 概述Stream 是 Java8 中处理集合的关键抽象概念(将要处理的集合元素看作一种流),它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。总之,Stream API 提供了一种高效且易于使用的处理数据的方式。它的特点:它不是数据结构,所以,不会保存数据,只是按照特定的规则对数据进行计算,一般会输出结果不会修改原来的数据源,它会将操作后的数据保存到另外一个对象中(保留意见:毕竟peek方法可以修改流中元素)惰性求值,流在中间处理过程中,只是对原创 2021-09-07 20:46:25 · 791 阅读 · 0 评论 -
【Java 8】手把手教你 Optional 类
1. 什么是 OptionalJava 8 中引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题是空指针异常(NullPointerException)。本质上,它是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。如果值存在则 isPresent() 方法会返回 true,调用 get() 方法会返回该对象2. 创建 Optional 实例查看 Optional 类源码:public final class Optional<原创 2021-09-03 18:52:12 · 721 阅读 · 0 评论 -
【Java 8】手把手教你 Lambda 表达式
章节目录1. 前言2. 认识Lambda2.1 Lambda简介2.2 Lambda语法2.3 Lambda表达式实例2.4 自定义一个Lambda表达式2.5 Lambda表达式对接口的要求2.5.1 函数式接口2.5.2 注解@FunctionalInterface2.5.3 举个例子3. 使用Lambda表达式3.1 将Lambda作为方法的参数,传进方法中3.2 Lambda表达式替换匿名内部类3.2.1 传统方法创建线程3.2.1.1 使用外部类创建线程3.2.1.2 使用匿名内部类创建线程3.2原创 2021-08-26 19:22:40 · 259 阅读 · 0 评论 -
深入理解 Java 中的 SPI 机制
Override@Override查看 Java API,看看里面怎么说的大致意思:ServiceLoader是一个简单的服务提供商加载工具…提供商的位置很懒,即按需实例化。服务加载器维护到目前为止已加载的提供者的缓存。每次iterator()方法的调用都会返回一个迭代器,该迭代器首先按实例化顺序生成高速缓存的所有元素,然后懒惰地定位和实例化任何剩余的提供程序,依次将每个提供程序添加到高速缓存中。可以通过reload()方法清除缓存…(具体文档说明请自行查阅)也像。原创 2021-08-26 19:20:11 · 1020 阅读 · 0 评论 -
【JDBC】详解 Java 中的 JDBC 技术
1. 什么是 JDBC?JDBC 是什么?来看看文档说明:The Java Database Connectivity (JDBC) API provides universal data access from the Java programming language. Using the JDBC API, you can access virtually any data source, from relational databases to spreadsheets and flat fi原创 2021-08-25 21:03:55 · 330 阅读 · 0 评论 -
【Annotation】详解 Java 中的注解(下)--- 自定义注解
1. 注解与反射机制前面经过反编译后,我们知道 Java 中的注解都继承了 Annotation 接口。也就是说,Java 使用 Annotation 接口代表注解元素,该接口是所有 Annotation 类型的父接口。同时为了运行时能准确获取到注解的相关信息,Java 在 java.lang.reflect 包下新增了 AnnotatedElement 接口,它主要用于表示目前正在 VM 中运行的程序中已使用注解的元素,通过该接口提供的方法可以利用反射技术地读取注解的信息,如反射包的 Construct原创 2021-08-24 13:32:59 · 236 阅读 · 0 评论 -
【Annotation】详解 Java 中的注解(上)--- 注解的基本介绍
1. 注解概念首先看看官方对注解的描述:An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and packages may be annotated. Annotations have no direct effect on the operation of the code they annotate.大致意思:注解原创 2021-08-23 10:27:09 · 210 阅读 · 0 评论 -
【Generic】详解 Java 中的泛型(下)
泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法1. 泛型类泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map。定义一个泛型类:class 类名 <泛型标识> { private 泛型标识 var;}泛型标识:可以随便写为任意标识,常见的如 T、E、K、V 等形式的参数常用于表示泛型。在实例化泛型类时,必须指定 T 的具体类型public class GenericType<原创 2021-08-22 18:39:45 · 298 阅读 · 0 评论 -
【Generic】详解 Java 中的泛型(上)
1. 未使用泛型------通过继承设计通用程序在 Java 增加泛型类型之前,通用程序的设计就是利用 继承 实现的:你可以将方法的参数类型设置为基类,那么该方法就可以接受这个基类中的任何子类作为参数,这样的方法将会更具有通用性。如:自定义一个静态内部类,此类中维护一个 Object 类型的数组,然后,通过调用其 add(Object) 方法,往其数组中添加元素。代码如下:public class GenericTest { static class MyList { pri原创 2021-08-19 22:09:02 · 144 阅读 · 0 评论 -
【Enum】枚举在 Java 中的常用用法
相信大家通过前面几篇关于“枚举”的博文的学习,大大地提升了对枚举的认识。仅仅地知道枚举的原理不行啊,还得知道怎么去使用它。那么,下面就简单地介绍下枚举的常用用法吧~~原创 2021-08-05 16:15:26 · 5552 阅读 · 0 评论 -
【JDK】详解 Java 中的可变长参数
在 JDK 1.5 中,新增了 变长参数 机制:在定义方法时,允许直接定义能和多个实参相匹配的形参。从而,可以用一种更简单的方式,来传递个数可变的实参原创 2021-08-02 18:57:31 · 746 阅读 · 0 评论 -
【Enum】详解 Java 中的枚举类(下)
在上一篇博文 【Enum】详解 Java 中的枚举类(上).有讲到:什么是枚举?如何定义枚举?以及枚举的实现原理。那这篇博文继续讲讲关于枚举的其它知识吧~~原创 2021-07-31 19:03:10 · 1033 阅读 · 0 评论 -
【Enum】详解 Java 中的枚举类(上)
1. 枚举简介枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。枚举在曰常生活中很常见,如:人的性别、四季、星期、月份、…。类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型。在 JDK 1.5 之前,没有枚举类型,那时候一般用接口常量来替代。在 JDK 1.5 之后,使用关键字 enum 来表示枚举类型,并且可以更贴近地表示这种常量。当然,在实际使用中,枚举类型也可以作为一种规范,保障程序参数安全。那么,如何声明枚举呢?其实,枚举跟类一样,只不过这个类是继承了原创 2021-07-29 19:20:31 · 546 阅读 · 0 评论 -
【Exception】如何使用 try-with-resources 优雅地关闭资源
一、背景 在 Java 编程中,如果打开了外部资源,如:文件输入输出流、数据库连接、网络连接(InputStream、OutputStream、java.sql.Connection)等,那我们必须在这些外部资源使用完后,去手动地关闭它们。因为外部资源不由JVM管理,无法享用JVM的垃圾回收机制。如果我们在编程时并没有确保在正确的时机关闭外部资源,就会导致外部资源泄露,就会出现文件被异常占用,数据库连接过多导致原创 2021-07-26 20:53:42 · 1267 阅读 · 0 评论 -
【Exception】自定义异常类
自定义异常类分三步:自定义枚举类自定义异常类测试自定义枚举类:为什么要自定义枚举类?因为在自定义异常时,常常是自己在写 异常信息说明,这可能会导致这样的情况发生:同一个场景问题,可能会出现多个不同的描述。如,前台传参错误,可能会描述为:参数错误、name 参数没传…等。所以,为了 统一异常信息说明,就用到了枚举类。所以正常情况下,异常类的代码如下:public class MyException extends RuntimeException { private Inte原创 2021-07-26 14:38:26 · 1423 阅读 · 0 评论 -
【Exception】Java 中的异常处理
1. 异常简介背景 在项目开发过程中,即使把代码写得尽善尽美,但在系统运行的过程中仍然会遇见一些问题,影响程序的正常运行。因为很多问题不是靠代码能够避免的。如:客户输入的数据格式、读取文件是否存在、网络是否始终保持畅通等。异常:在 JAVA 语言中,将程序执行中发生的不正常情况称为“异常”。Java 程序在执行过程中所发生的异常事件可分为两类:Error:JVM 无法解决的严重问题。JVM 系统内部原创 2021-07-25 23:13:00 · 262 阅读 · 0 评论 -
【IO 流】IO 流与网络编程
1. 网络编程基础什么叫网络编程?直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯,这就叫网络编程但在交互过程中,会有以下两个问题:如何准确地定位网络上一台或多台主机:定位主机上的特定的应用(IP + 端口)找到主机后,如何可靠、高效地进行数据传输(网络通信协议)当然,以上两个问题都已经有了相应的解决方案了。IPIP:唯一的标识 Internet 上的计算机端口端口被规定为一个16位的整数:0~65535。在同一主机中,不同的进程有不同的端口。端口被分为:公认原创 2021-07-25 11:21:52 · 268 阅读 · 0 评论 -
【IO 流】Java 中常见的 IO 流
1. IO 流简介何为 IO 流?在计算机中,内存和磁盘需要进行数据传输(内存从磁盘中读入数据,进行处理,然后写入磁盘中),而数据传输需要通道。所以,这里的 “IO 流”就是数据传输的通道。内存和磁盘数据交互图如下:大致意思:内存通过输入流从磁盘中读取数据,这个过程也称为读;内存通过输出流将数据保存到磁盘中,这个过程也称为写。所以,简单来说,IO 流的作用就是 通过 IO 流,可以完成对磁盘文件的读和写。2. IO 流的分类按流的方向分(以内存为参照物):输入流(往内存中去)、输出流(原创 2021-07-23 14:23:17 · 207 阅读 · 0 评论 -
【File】Java 中的 File 类
1. File 简介File ?什么是 File?中文的意思就是“文件”。在 Windows 操作系统中,数据是以文件的形式进行存储的。如:文本(.txt)、图片(.jpg、.png)、视频(avi)等。这些文件都被操作系统中的文件系统给管理着。那么问题来了,在 Java 语言中为什么会存在 File 类呢?大家都知道 Java 语言是一个面向对象的语言,遵循着“万事万物皆为对象”的法则。所以,Java 要想操作文件,就要把文件抽象成一个类------File 类。Java 中有哪些场景需要操作文原创 2021-07-23 14:14:53 · 259 阅读 · 0 评论 -
【字符集】ASCII?GBK?Unicode?
1. ASCIIASCII:主要用于显示现代英文和其它西欧语言标准 ASCII 码(基础 ASCII 码):使用 7 为二进制位(剩下一位为 0)来表示所有的大小写字母、数字0~9、标点符号以及美式的特殊控制字符其中:0~31、127(共33个)是控制字符或通信专用字符(其余为可显字符)控制字符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等 通信专用字符:SHO(文头)、EOT(文尾)、ACK(确认)等 ASCII 码值为8、9、10、13原创 2021-07-21 22:51:13 · 423 阅读 · 0 评论 -
【日期类】Java 中的时间标准:UTC、GMT、CST
UTC(世界标准时间)UTC:协调世界时,又称 世界标准时间或世界协调时间,简称 UTC,是最主要的世界时间标准。其以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间GMT(格林尼治平时)GMT:格林尼治平时,又称 格林尼治平均时间或格林尼治标准时间,简称 GMT,是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。原创 2021-07-20 19:34:43 · 9969 阅读 · 1 评论 -
【工具类】使用 Calendar 类的日期工具类
以下是我在平时的工作中使用 Calendar 类操作日期的一些方法:public class DateUtils { // 获取某一天的0时0分0秒时间 public static Date getStartTimeOfDay(Date dt) { if (dt == null) { return null; } Calendar cal = Calendar.getInstance(); c原创 2021-07-19 23:11:38 · 227 阅读 · 0 评论 -
【日期类】Java 中常用的日期类(下)
1. java.time API 背景新日期时间 java.time.LocalDate 出现的背景:java.util.Date、java.util.Calendar 面临的问题:1.可变性:像日期、时间这样的类应该是不可变的2.偏移性:Date 中的年份是从 1900 年开始的;月份是从 0 开始的3.格式化:格式化只对 Date 有用,而对 Calendar 则不行4.线程安全:它们都不是线程安全Java 8 吸收了 Joda-Time 的精华,引入了 java.time API,已原创 2021-07-19 23:03:25 · 286 阅读 · 0 评论 -
【日期类】Java 中常用的日期类(上)
在 Java 8 之前,操作日期类的有两个:java.util.Date、java.util.Calendar;在 Java 8 之后,又推出了一个全新的日期类 java.time.LocalDate1. java.util.Date讲 java.util.Date 类之前,咱们先说说另外一个类的方法吧,System.currentTimeMillis():返回当前时间与 1970-01-01 00:00:00 之间以毫秒为单位的时间差。此方法适用于计算时间差// 1626624005531 时间戳原创 2021-07-19 00:23:39 · 1788 阅读 · 0 评论 -
【内部类】JAVA 中的四大内部类【下】
在上一篇博文 【内部类】JAVA 中的四大内部类【上】 中,有介绍到内部类、成员内部类,只说了四大内部类中的其中一个。接下来,此文就来介绍剩下的三种内部类:局部内部类、静态内部类、匿名内部类2.2 局部内部类什么是局部内部类?局部内部类相当于一个局部变量,在一个方法中/局部代码块中定义一个类,称为局部内部类(不能被 public、private 修饰)那局部内部类和成员内部类的区别就显而易见了 ------ 它们所处的位置不同。定义、构建局部内部类public class OuterClas原创 2021-07-17 22:35:49 · 105 阅读 · 0 评论 -
【内部类】JAVA 中的四大内部类【上】
1. 内部类简介什么是内部类?可以将一个类的定义放在里另一个类的内部,这就是内部类。广义上,我们将内部类分为四种:成员内部类、局部(方法)内部类、静态内部类、匿名内部类。如:// 外部类public class OuterClass { // 内部类 class InnerClass { }}那么,为什么要使用内部类呢?使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现原创 2021-07-16 02:05:24 · 287 阅读 · 0 评论 -
【Integer】java.lang.Integer 类的缓存机制与享元模式
1. 缓存机制与享元模式此文简单介绍下关于 Integer 类的 缓存机制 ,这是在 Java 5 中引入的一个既能节省内存又能提高性能的功能。简单地看一个示例代码,来体会下 Integer 类中的缓存机制:Integer a = 1;Integer b = 1;Integer c = 200;Integer d = 200;System.out.println(a == b); // trueSystem.out.println(c == d); // false看到这几行代码时原创 2021-07-04 22:59:48 · 459 阅读 · 0 评论 -
【Integer】包装类型的自动拆装箱
1. 基本数据类型JAVA 提供了两个类型系统:基本数据类型、引用类型。其中,基本数据类型是我们编程中使用最频繁的类型Java 是一种强类型语言,第一次申明变量时,必须要指明数据类型。第一次为变量赋值称为变量的初始化Java 基本类型共有八种,基本类型可以分为三类:字符类型:char布尔类型:boolean数值类型:byte、short、int、long、float、double那么,使用基本数据类型有什么好处?在 Java 语言中,new 一个对象存储在堆中,并通过栈内存的引用来使原创 2021-07-01 00:08:05 · 167 阅读 · 0 评论 -
【String】理解字符串常量池与 String#intern() 方法
1. 字符串常量池的介绍在 JAVA 语言中,有 8 种基本类型和一种比较特殊的类型 String。这些类型为了使它们在运行过程中速度更快,更节省内存,都提供了一种 常量池 的概念。常量池就类似一个JAVA系统级别提供的缓存。其中,这 8 种基本类型的常量池都是系统协调的,而 String 类型的常量池比较特殊。它的主要使用方法有两种:直接使用双引号声明出来的 String 对象会直接存储在常量池中如果不是用双引号声明的 String 对象,可以使用 String 提供的 intern() 方法原创 2021-06-29 22:31:58 · 230 阅读 · 0 评论 -
【String】理解 java.lang.String类的不可变性
1. 字符串 String 的不可变性什么是不可变类?这样理解: 一个对象在创建完成后,不能去改变它的状态,不能改变它的成员变量(如果成员变量包含基本数据类型,那么这个基本数据类型的值不能改变;如果包含引用类型,那么这个引用类型的变量不能指向别的对象)不可变类只是其实例不能被修改的类。每个实例中包含的所有信息都必须在创建该实例的时候就提供,并且在对象的整个生命周期内固定不变。为了使类不可变,要遵循下面五原创 2021-06-26 23:24:42 · 457 阅读 · 4 评论