
Java
文章平均质量分 85
博主自己学习过程中总结概括的Java知识点
程序猿ZhangSir
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java泛型详解(史上最全泛型知识详解)
泛型是在JDK5之后引入的一个新特性,可以在编译阶段约束操作的数据类型,并进行检查。泛型的格式为用大白话来说,泛型就好比是给一个标签,通常情况下我们会在开发过程中或者个人学习或练习的过程中使用到泛型;就拿数组的泛型举例来说,我们把数组比作一个药瓶子,我们药瓶子贴上了什么标签,就只能放什么药,如果不管什么药都放在一个药瓶子里,那不得出大事吗?同样容器(数组)写上什么泛型,就只能存放什么数据;这样就不会导致我们存取数据的混乱。这样就解决了我们引言中提到的问题,也就解释了什么是泛型。原创 2023-07-25 14:00:00 · 14654 阅读 · 5 评论 -
Java反射全面详解
首先听这个名字就有些疑惑,什么是反射,它能用来干什么呢?Java官方对反射的解释是 "反射允许对封装类的字段,方法和构造函数进行编程式访问"。这里的字段指的就是成员变量,方法指的就是成员方法,构造函数就是构造方法。原创 2023-08-02 13:01:58 · 342 阅读 · 0 评论 -
线程池工作原理深入解析
线程池的好处就是,我们可以在线程池中创建多个线程,当我们有业务需要用到线程时,它会自动到线程池中拿取已经存在线程而不会再去创建新的线程,当线程完成了业务需求后,它会把使用过的线程再还到线程池中而不会销毁它,等待下一次任务的执行,如此一来,就节省了线程的创建与销毁这一动作,提高了程序的运行效率。(2)当我们需要用到线程时,线程池会去创建新的线程对象,当任务执行完毕之后,它会把线程归还给线程池,下次再有业务需要用到线程时,不会去创建新的线程,直接复用线程池中已经存在的线程。这里我就随便拿两个当例子说一下。原创 2023-08-10 13:30:00 · 6476 阅读 · 0 评论 -
深入理解集合的迭代器 Iterator,为什么遍历数组时删除元素不能直接使用remove()方法而需要使用迭代器?你有了解过原因吗?
如下所示,Itr 是 ArrayList 的一个内部类,它实现了 Iterator 迭代器接口,我画线的 expectedModCount 翻译过来意为期望修改次数,modCount 赋值给了 expectedModCount,也就是说,当我们创建了 iterator 对象之后,当前数组的修改次数 modCount 的值就会赋值给 excepectedModCount。在 Iterator 接口中,有两个非常重要的方法,hasNext()和next(),它是迭代器的核心方法。" 后面已经没有元素了,所以。原创 2023-09-23 12:00:00 · 2728 阅读 · 0 评论 -
@JsonProperty 和 @JSONField注解的使用方法及其异同?
目录一. 区别对比二. 代码举例说明2.1 准备实体类2.2 不加注释2.3 @JsonProperty2.4 @JSONField三. 全局映射解决方案3.1 fastjson 包3.2 jackson 包四. Serializable 接口(多学一招)总结概括:在实际项目开发中,有时候我们需要将实体类型数据转化为 Json 串,对方希望接收的 Json 数据中的 key 可能不是我们实体类定义的 key ,例如我们后端定义的是"createDate",但是对方接收的数据 key 希望是 "date";还原创 2025-06-27 18:14:03 · 1564 阅读 · 0 评论 -
Spring Boot 项目的启动流程,图片+文字详细解答(附相关面试题)
目录一. 核心简要流程二. 详细流程图三. 启动流程详解3.1 初始化阶段3.2 运行阶段四. 面试题合集4.1 Spring Boot启动流程?4.2 Spring Boot 的自动配置是如何实现的?4.3 如何自定义 Spring Boot 的 Banner?4.4 如何监听 Spring Boot 的启动事件?4.5 Spring Boot 内嵌服务器是如何启动的?4.6 @SpringBootApplication 注解的作用是什么?4.7 Spring Boot 应用启动失败的可能原因及排查方法?原创 2025-04-16 18:20:18 · 2454 阅读 · 0 评论 -
第三方API——Spring Boot 集成阿里云短信发送功能
在上面,我们已经定义好了发送短信的方法,按道理来说,直接 @Autowired 注入 配置的 Bean 实例就可以了,但是我们观察上方方法,其实还不够简洁,因为 sendSms 方法中,只有 phone 手机号一个参数是需要用户传递的,其他的参数是不需要的。然后,使用短信客户端实例调用 API 接口发送短信,这里写为一个方法,传递手机号,签名,短信模板Code值,然后再其他业务类型,注入此配置类的实例,调用 sendSms 方法,根据业务需求传递不同的短信Code发送不同的短信。原创 2025-04-14 18:37:23 · 1574 阅读 · 0 评论 -
十六款好用的 IDEA 插件,强烈推荐!!!不容错过
然后在右侧CodeGeeX中,他就会跟我们说这段代码的逻辑,做了什么事,在你接手别人的项目时,没有注释就直接选中问CodeGeeX,懒人必备神器,如下,它就帮我解释了刚才我选中的方法的功能,以后再遇到读不懂的方法时,别忘了询问CodeGeeX;然后我们回到项目中,随便选中一个单词,点击右键,就会出现 "Translate",点击翻译,他就可以直接讲的那次的意思翻译出来,不需要我们在去浏览器翻译,非常方便,对英语不好的同学简直是救星;然后,控制台下方就会出现方法的调用过程,我们可以清楚的知道它的执行逻辑;原创 2024-04-03 18:28:25 · 70232 阅读 · 5 评论 -
MyBatisPlus 代码生成器如何使用?一篇文章学会它!!!
代码生成器是 MyBatis-Plus 提供的一个非常实用的功能,可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等代码,极大地提高了开发效率。我们从网上拉取的一些博主项目,特别是Spring Boot项目,很多就会集成 MyBatis-Plus 使用MyBatis-Plus 提供的代码生成器,对于单表增删改查的项目来说可以极大的提升开发效率。// 定义数据库// 数据库用户名// 数据库连接密码// 定义数据库// 数据库用户名。原创 2025-01-09 17:18:39 · 868 阅读 · 0 评论 -
设计模式(1)——单例模式
静态内部类是通过JVM的方式保证线程安全,JVM会保证每个类之加载一次,但类中的静态内部类是不会被加载的,只有当我们调用 get 方法时,get 方法会返回给我们一个静态内部类的INSTANCE,而INSTANCE在静态内部类中指代的就是外部类的实例对象,非常神奇,非常花哨,并且可以做到线程安全,任何人来访问get方法获取Mgr03对象的实例,获取到的都是同一个INSTANCE。一个类只实例化自己的一个实例,并且不允许再创建多余的实例,在对外提供访问时,访问的都是同一个实例对象。原创 2024-03-29 09:47:57 · 782 阅读 · 0 评论 -
windows系统kafka小白入门篇——下载安装,环境配置,入门代码书写
我们修改 log.dirs 的值为刚才创建的 data 文件夹的路径,在路径末尾再添加上 "/kafka" ,用来和刚才的zk做区分,kafka 文件夹用来存放kafka的日志文件,zk 文件夹用来存放zoopeeper的日志文件;如下图所示,我在生产者命令窗口输入 "hello kafka",点击回车,我们就可以在消费者中命令窗口中看到发送过来的 "hello kafka" 消息。打开文件夹后可以发现内部含有bin文件夹,config配置夹,libs依赖夹等,和JDK,maven 问价夹的格式如出一辙;原创 2024-04-02 20:34:58 · 8156 阅读 · 10 评论 -
使用 Redis 实现手机号验证码登陆功能,实际开发中使用 Token 实现登录校验又是如何做的?
对于我们用户来讲,我们在登陆一个APP的时候,有很多种登陆方式,比如"微信扫码"、"手机号登陆"、"支付宝扫码"、"账号密码登录",而且现在账号普遍都是使用手机号作为账号同时还能确保每个用户账号的唯一性,因此狭义上来讲账号密码登录也可以归属于手机号登陆的一种。现在大多都会要求微信扫码登录或者是手机号验证码登录。使用传统账号密码登陆的已经很少了,当然并不是说没有了,而是不再那么流行了,而且很多人其实设置了密码基本都会忘了,还不如短信登陆来的快。原创 2024-12-31 18:26:34 · 1091 阅读 · 0 评论 -
Java常用 Date 时间格式化、Calender日历、正则表达式的用法
a-z] 则表示匹配26个小写字母,[A-Z] 则表示匹配26个大写字母,[0-9] 表示匹配0~9的数字;通常都是将正则条件写成一个字符串,然后在去调用 String 字符串类中已经写好的 "matches" 正则方法,方法会返回一个布尔类型的值。密码就没啥可说的了,安全性高一些的网站或者APP,可能会强制要求至少包含一个大小写、数字、特殊字符,且不能含有空格,长度通常为8~16位。表示匹配零个或一个;当然了,上述六个是正则表达式的基本组成部分,还有很多高级的组成部分,包括反向引用,非获取组,注释等。原创 2024-12-11 11:02:31 · 2421 阅读 · 0 评论 -
split 分割字符串方法解析,substring 截取字符串方法解析;二者的作用和区别?使用时需要注意什么?附代码和运行图
众所周知,开发过程中,我们时常会遇到需要切割字符串或截取字符串的需求,例如按照特殊符号切割、或按照标点符号截取等。对于切割字符串方法和截取字符串方法,Java为我们提供了 split 切割方法,substring 截取方法,下面小编就来说说二者的用法和区别。原创 2024-09-12 15:28:17 · 1467 阅读 · 0 评论 -
BigDecimal 接收数据库 decimal 类型数据,格式化为 #.000(#.角分厘)
经过查询之后,通常会将金额进行格式化,例如100元要格式化显示为100.00元;而我们在开发时,从数据库中查到 "decimal"、"float" 数据类型的数据,通常都是使用。数据库存储金额时,通常也是使用的 "decimal"、"float"等高精度类型。格式化的方式很简单,Java 提供了现成的格式化 API 供我们使用。开发过程中,我们在接触到关于金额的计算时,通常都会进行非常的精确的计算。举例 123456.789 元,拆解为如下表格所示。在实际的开发过程中,通常业务逻辑都是下面这样的,原创 2024-09-10 18:58:26 · 766 阅读 · 0 评论 -
Java跨平台的原理是什么?JDK,JRE,JVM三者的作用和区别?xxx.java和xxx.class有什么区别?看这一篇就够了
跨平台的意思就是说Java代码的运行可以不受平台的约束,只需要将代码进行一次编译,就可以在多种平台上运行。即一次编译,到处执行(Write Once,Run Anywhere)。(1)Java虚拟机:通过Java虚拟机将 Class 文件编译转化成对应平台的二进制文件;(2)Class 文件:所有Java文件都由javac编译器编译成class文件,规范文件一致性;(3)Java语言规范:规定了Java语言中基本数据类型的取值范围和行为;原创 2024-07-18 15:00:04 · 1536 阅读 · 1 评论 -
开发常用的实体属性转化API,copyProperties方法的用途,需要注意的点。
在开发过程中,我们通常会在 Entity,model,DTO,VO,POJO,Param 等众多实体类之间进行互相转换,传统的做法就是 new 一个新的要转化的对象然后一个属性一个属性的 set 进去,如果是集合,外边再加一层循环嵌套即可,但尽管如此,步骤还是较为繁琐,而且当实体类中的属性较多时,代码还会显得特别臃肿,不美观。原创 2024-05-15 13:42:30 · 1212 阅读 · 0 评论 -
null和空集合有什么区别?集合List的判断 list == null,list.size() == 0,isEmpty() == true有什么区别和联系?
集合 List 是我们在开发过程中非常常用的,这两天我在做一个功能的时候,用 PostMan 测试接口总是报空指针异常,后来经过调试发现了问题所在,原因就是对于数组的判断方式有误;所以写这篇文章记录下来,防止以后再犯类似的错误,也为了给小伙伴分享让小伙伴们在日后开发过程中也可以避。原创 2024-05-08 20:12:39 · 1787 阅读 · 0 评论 -
final 关键字的用法?
final关键字的用法非常多,它可以修饰类,可以修饰方法,可以修饰变量,可以修饰基本数据类型,也可以修饰引用数据类型,接下来我们就自己分析它的用法。原创 2023-07-12 11:30:00 · 357 阅读 · 0 评论 -
Java中重写和重载的区别?
重写:发生在父子类中,方法名,参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为private则子类就不能重写该方法。重载:发生在同一个类中,方法名必须相同,参数类型不同,个数不同,顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。原创 2023-07-13 12:30:00 · 66 阅读 · 0 评论 -
一篇文章带你学会匿名内部类,由浅入深,一定手把手教会你
听名字就能看得出来,内部类,就是定义类中的一个类。在A类中定义一个B类,那么B类就是A类的内部类。通过上面我所展示的和解释的,我们应该明白以下几点(1)什么是匿名内部类?匿名内部类不是真的没有名字,只是在代码中没有体现出来,在编译时,会单独将他编译成一个类并赋予默认的名字。(2)匿名内部类可以在什么位置?匿名内部类既可以定义在成员位置,也可以定义在局部位置;当我们将匿名内部类定义在成员位置,他就是成员匿名内部类;当我们把它定义在方法体之内,他就是局部匿名内部类。(3)格式的细节。原创 2023-07-14 13:15:00 · 8018 阅读 · 6 评论 -
Java接口与抽象类的区别?
2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的。1. 抽象类可以存在普通成员函数,而接口中只能存在public abstract方法。3. 抽象类只能继承一个,而接口可以实现多个。原创 2023-07-15 13:30:00 · 69 阅读 · 0 评论 -
Java中的Sychronized和ReentrantLock的区别?
(5)sychronized锁的是对象,锁信息保存在对象头中,而ReentrantLock通过代码中的int类型的state标识来标志锁的状态。(2)sychronized会自动的加锁和释放锁,而ReentrantLock需要程序员手动加锁和释放锁。(3)sychronized底层是JVM层面的锁,而ReentrantLock是API层面的锁。(4)sychronized是公平锁,而ReentrantLock可以选择公平锁或非公平锁。(6)sychronized底层有一个锁升级的过程。原创 2023-07-23 11:15:00 · 168 阅读 · 0 评论 -
String字符串相关类底层原理
刚才在第一点我们也说了,String字符串一经创建,值就不可变,当我们在程序编程时,如果对字符串进行拼接,实际上会产生新的字符串,这样不仅会降低程序的执行效率,还会创建出多余无用的字符串垃圾,非常不好。那么有没有更好的解决方案来应对字符串可变化的这一需求呢?当然是有的,它就是我们要说的 StringBuilder。StringBuilder我们可以把它看作是一个容器,创建之后内容是可变的,它可以很大的提高字符串的操作效率。StringBuilder有两个常用的构造方法,如下图所示。原创 2023-07-27 11:00:00 · 499 阅读 · 0 评论 -
static 关键字的用法?
static 是Java语言中一个非常重要的关键字,static 表示静态,是Java中的一个修饰符,可以修饰成员方法,成员变量。原创 2023-07-28 13:15:00 · 182 阅读 · 1 评论 -
IO流(1)-字符流与字节流
FileOutputStream 输出流可以把内存中的东西写入到磁盘中去长久保存,其实也可以结合 File InputStream 输入流完成文件的复制操作,思路很简单,我们知道,文件是保存在磁盘中的,我们可以先通过输入流将要复制的文件读取到内存中去,然后再通过输出流写入到硬盘中我们制定好的位置,就能完成文件的复制操作。其实我上面所写的程序,可以复制任何文件,如图片,音频,视频,文件夹,文本文件都可以,因为在计算机底层,所有文件都是以字节的方式存储的,而我们所写的方法正是字节输入流与字节输出流。原创 2023-07-29 14:45:00 · 239 阅读 · 0 评论 -
IO流(2)-缓冲流
我们上贴说到了 FileInputStream,FileOutputStream,FileReader,FileWriter。其实这四个流,我们通常把它叫做原始流,它们是比较偏底层的;而今天我们要说的四个缓冲流,如下图所示,叫包装流,也叫处理流,它们之间也有继承关系自下而上,并且它们都可以提高原始流读写数据的性能。原创 2023-07-30 16:15:00 · 807 阅读 · 0 评论 -
IO流(3)- 转换流与打印流
我们都知道,字符集编码的格式多种多样,有UTF-8,UTF-16,GBK等等很多种,那么在读取的时候也会有差异,例如我们的IDEA编码格式为UTF-8,当我们去读取一个编码格式为GBK的文件时,即便是采用字节流全部读取出来,也会读取到一堆乱码。运行此方法,程序会自动创建名为 test04.txt 的文件,可以看到,这里可以添加诸多内容,证书,字符串,浮点数,布尔类型都可以加入,我们打开文件查看如下,可以看到添加成功。字符转换输出流相比于字符转换输入流,用的就没有那么多了,所以理解即可,但能熟练掌握最好。原创 2023-07-31 15:00:56 · 188 阅读 · 0 评论 -
IO流(4)- 序列化流与反序列化流
如上图所示,序列化流与反序列化流也是IO流中会用到的一种高级流,也是用来包装基本流对象的,它们的继承关系如上图中所示。序列化流是字节流的一种,它负责输出数据。反序列化流也是字节流的一种,它负责输入数据。原创 2023-08-01 11:10:08 · 244 阅读 · 0 评论 -
HashMap 底层源码深度解读
通过上面对源码的解读,我们大致可以得出以下几个结论(1)HashMap默认的初始容量为16;(2)HashMap的最大容量为 2^30;(3)HashMap底层的数据名称为 table;(4)HashMap集合中每个元素成为一个节点,可能是链表节点,也可能是红黑树节点。若是链表节点,存放的数据包括该节点的哈希值,key值,value值,以及下一个结点的内存地址;原创 2023-08-03 14:00:00 · 476 阅读 · 0 评论 -
实现多线程的三种方式
(1)实现多线程有三种方式,一是继承 Thread 类,二是实现 Runnable 接口,三是实现 Callable接口并利用 FutureTask 类接收线程结果。(2)继承 Thread 类实现多线程不可以获取线程的结果;实现 Runnable 接口实现多线程的方式也无法获取返回值结果。(3)我们都知道,继承只能单继承,而接口却可以多实现。因此不难看出,第一种继承 Thread 类实现多线程的方式是不太友好地,虽然编程较为简单,但是可扩展性较差,一旦我们的业务类还需要继承别的类,就不行了。原创 2023-08-04 15:03:31 · 5105 阅读 · 0 评论 -
Java异常体系总结(上篇)
异常其实就是代表程序出现的问题。我们都知道,在编写代码时,我们时常会编写出一些 bug,那么这些 bug,它们有一些可能是异常,有一些可能不是异常。这里有一个误区需要各位注意,学习异常不是为了让我们以后在写代码的过程中不出现异常,但其实也很难避免不出现异常,学习异常是为了让我们知道在程序出现异常之后,该怎么去处理它。2. 异常家族体系介绍我们知道,在Java中,有各种各样的异常,它们其实是一个大的家族,而这个家族的首领就是 java.lung.Throwable。原创 2023-08-07 07:30:00 · 215 阅读 · 0 评论 -
Java异常体系总结(下篇)
可以看到,当我们定义了一个顶级父类异常Exception 之后,IDEA提示我们后面两个异常有错误,点过去 按Alt + Enter键,IDEA提示我们删除此异常,或者将定义的这个数组越界异常放在 Exception 异常之前。原因是什么呢?其实很简单,当我们程序出现问题之后,进入catch语句块,它还是会从上向下执行 catch 语句块,你现在把父类定义在了子类的前面,父类就可以把异常接受,那么子类存在的意义何在呢?原创 2023-08-08 09:00:00 · 174 阅读 · 0 评论 -
Thread 类中常用的成员方法
我们知道,Thread 是Java中已经提供好的一个线程类,那么既然是类,它就会有成员方法,本篇主要讲述一下 Thread 类中常用到的一些成员方法。原创 2023-08-09 11:15:00 · 163 阅读 · 0 评论 -
面向对象的三大基本特征和五大基本原则
而某些时候,实现类型并非需要所有的接口定义,在设计上这是“浪费”,而且在实施上这会带来潜在的问题,对胖接口的修改将导致一连串的客户端程序需要修改,有时候这是一种灾难。当两个模块之间存在紧密的耦合关系时,最好的方法就是分离接口和实现:在依赖之间定义一个抽象的接口使得高层模块调用接口,而底层模块实现接口的定义,以此来有效控制耦合关系,达到依赖于抽象的设计目标。继承基类的方法,并作出自己的改变和/或扩展,子类共性的方法或属性直接使用父类的,而不需要自己定义,只需扩展自己个性化的。核心思想是:依赖于抽象。原创 2023-08-23 10:30:00 · 762 阅读 · 0 评论 -
i++和++i的区别? &和&&的区别? |和||的区别? 三元运算符的执行逻辑?
(2)当我们使用两个 "||" 进行条件判断时,如果左边的判断已经为 true,则就不会进行右边的判断运算,因为此时表达式已经为 true,如果坐标的判断为 false,才会在去执行判断右边的操作;我们知道,++表示自增一,i++和++i都表示使 i 的值自增一,如果单独将它们作为一行代码,它们两个的效果是一样的,当它们参与到运算中,效果就不一样了。可以看到,在最终输出的结果中,使用一个 & 的a和b都自增了1,使用两个 && 的c和d只有c自增了1,这就是一个 & 和两个 && 最大的区别。原创 2023-08-25 14:00:00 · 215 阅读 · 0 评论 -
Java 枚举是什么?什么是枚举类?枚举类的用途?
我们可以从字面意思来理解,枚:一枚一枚的,举:举例,举出,将二者意思结合起来可以理解为一个一个的举出。这样听起来可能有些模糊,我来给大家说一个场景。例如我们定义一个月份类,我们肯定已经确定了该类只有1~12月12个类对象,不会再有别的对象了;还有星期数,只有周一~周日七个类对象,不会有星期八这个对象吧。那么如果我们要将这几个对象全部列出来,可以怎么做呢?首先我们想到的就是创建一个类,然后有几个对象我们就 new 几个对象。原创 2023-09-02 07:00:00 · 900 阅读 · 0 评论 -
浅谈JVM内存模型与GC垃圾回收
Java 虚拟机的底层设计其实是非常复杂的,本篇主要针对JVM的内存模型以及垃圾回收机制做一个简单概括和介绍,明白它各种方法是如何运行的,数据在哪里存放的,以及垃圾回收都有哪些算法是如何使用的。Java 虚拟机是运行在内存中的,当我们的虚拟机拿到了自己可支配的内存之后,它会对这些内存做分配,大致分为五个区域,分别为 栈(JVM栈),堆,本地方法栈,程序计数器,方法区(在JDK8之后改名加元空间)。如下图所示。原创 2023-09-05 10:15:00 · 197 阅读 · 0 评论 -
JDK8的 ConcurrentHashMap 源码分析
总结上面的初始化源码分析,我们可以得到以下结论。(1)ConcurrentHahMap 采用无参构造在底层什么都没有做,真正创建数组是在 put 第一个元素扩容的时候才创建数组的。(2)ConcurrentHashMap 带参构造中如果我们传入的初始容量大于等于最大容量的一半,则实际集合容量会使用最大容量 2^30;如果传入的初始容量小于集合最大长度的一半,则实际计算出的容量是(传入的值 + 传入值的一半 + 1)的结果向上取整并且必须是2的整数次幂。例如传入32,是计算出的容量是64而不是32。原创 2023-09-07 11:45:00 · 215 阅读 · 0 评论 -
怎样理解 Object 类中的 clone() 方法?
所以就有一个问题,我们的代码肯定不能在 java.lang 包下编写,而我们的业务类通常为了能够调用 clone() 去继承实体类,因为可能需要继承其他类,两种办法都行不通,所以我们不许重写父类 Object 中的 clone() 方法,扩大访问权限,才能够调用。基本数据类型是在各自的JVM栈中存储,而引用数据类型则是在堆中存储,JVM栈中的对象保存的不过是堆中对象的内存地址。而且默认重写方法采用的是浅拷贝,如果被克隆对象中含有引用数据类型,只会复制其对象的内存地址,和被克隆的对象操作同一引用数据类型。原创 2023-09-08 12:30:00 · 279 阅读 · 0 评论