
Java
文章平均质量分 84
出世&入世
专注于计算机毕设开发、定制、文档编写指导等,对软件开发具有浓厚的兴趣,工作之余喜欢钻研技术,关注IT技术的发展趋势,感谢大家的关注与支持。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
一文通透spring的初始化
抛去一些事件国际化相关的辅助代码,主要结合之前的流程总结如下配置主方法注入到bean容器添加一些beanFactory后置处理器和bean后置处理器,还有一些其它的bean至bean定义注册器。原创 2023-05-24 22:20:12 · 426 阅读 · 0 评论 -
在Java中,使用HttpUtils实现发送HTTP请求
HTTP请求,在日常开发中,还是比较常见的,今天给大家分享HttpUtils如何使用。阅读本文,你将收获:简单总结HTTP请求常用配置;JavaLib中HttpUtils如何使用;如何封装HTTP请求工具类。原创 2023-03-22 09:39:12 · 1887 阅读 · 0 评论 -
线上故障定位思路
其实,排查问题就像在破案,生产环境出现问题时,因为要尽快恢复应用,就不可能保留完整现场用于排查和测试。因此,是否有充足的信息可以了解过去、还原现场就成了破案的关键。这里说的信息,主要就是日志、监控和快照。原创 2023-03-12 22:20:59 · 929 阅读 · 0 评论 -
Spring Boot微服务监控告警简单介绍
在 Spring 2.x 之前,SpringBoot 使用 Actuator 模块进行监控,而在 Spring 2.x 之后,SpringBoot 使用了 Micrometer 进行监控。Spring Boot Actuator 模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP 跟踪等,帮助我们监控和管理 Spring Boot 应用。这个模块是一个采集应用内部信息暴露给外部的模块,上述的功能都可以通过 HTTP 和 JMX 访问。在 Spring 2.x 之后,Actuator 使原创 2023-03-12 12:50:43 · 2063 阅读 · 0 评论 -
一文带你了解MySQL的Explain
1 Extra中的为Using index的情况查询列被索引覆盖&&where筛选条件是一个基于索引前导列的查询,意味着 通过索引查找就能直接找到符合条件的数据,并且无须回表2 Extra中的为空的情况查询列未被索引覆盖&&where筛选列是索引的前导列,意味着通过索引查找并且通过回表来找到未被索引覆盖的字段,3 Extra中的为Using where;使用了索引: 要考虑索引扫描+回表表扫描的代价。4 Extra中的为Using where;原创 2023-03-10 16:41:04 · 499 阅读 · 0 评论 -
MySQL优化策略
1.1 SQL 语句简化,简化是 SQL 优化的一大利器,因为简单,所以优越。1.2 尽可能避免或者杜绝多表复杂关联,大表关联是大表处理的噩梦,一旦打开了这个口子,越来越多的需求需要关联,性能优化就没有回头路了1.4 SQL 中尽可能避免反连接,避免半连接,这是优化器做得薄弱的一方面,什么是反连接,半连接?其实比较好理解,举个例子:not in,not exists 就是反连接,in,exists 就是半连接,在千万级大表中出现这种问题,性能是几个数量级的差异。原创 2023-03-10 16:12:22 · 591 阅读 · 0 评论 -
Java后端通用接口设计
为了将接口设计得更合理,我们需要考虑如下两个原则:对外隐藏内部实现。即服务A调用服务B,如果服务B异常,但是我们不要直接把服务B的状态码、错误描述直接暴露给用户;设计接口结构时,明确每个字段的含义,以及客户端的处理方式。接口的设计逻辑:如果出现非 200 的 HTTP 响应状态码,就代表请求没有到服务,可能是网络出问题、网络超时,或者网络配置的问题。这时,肯定无法拿到服务端的响应体,客户端可以给予友好提示,比如让用户重试,不需要继续解析响应结构体。原创 2023-03-09 08:48:45 · 2996 阅读 · 0 评论 -
后端开发过程中的安全问题
安全问题是木桶效应,整个系统的安全等级取决于安全性最薄弱的那个模块。在写业务代码的时候,要从我做起,建立最基本的安全意识,从源头杜绝低级安全问题。原创 2023-03-09 08:43:00 · 1014 阅读 · 0 评论 -
Java程序中空指针异常的最佳实践
1、空指针问题NullPointerException 是 Java 代码中最常见的异常,将其最可能出现的场景归为以下 5 种:参数值是 Integer 等包装类型,使用时因为自动拆箱出现了空指针异常;字符串比较出现空指针异常;诸如 ConcurrentHashMap 这样的容器不支持 Key 和 Value 为 null,强行 put null 的 Key 或 Value 会出现空指针异常;A 对象包含了 B,在通过 A 对象的字段获得 B 之后,没有对字段判空就级联调用 B 的方法出现空指针原创 2023-03-08 10:36:30 · 2107 阅读 · 0 评论 -
慢SQL的优化思路和使用规范
1、索引优化1.1 建表或加索引时,保证表里互相不存在冗余索引。对于MySQL来说,如果表里已经存在key(a,b),则key(a)为冗余索引,需要删除。1.2 复合索引建立索引时,多考虑建立复合索引,并把区分度最高的字段放在最前面。比如 select * from goods where goods_no = 'aaa' and state=1;这种情况我们只需要建了一个复合索引就可以,这就相当于创建了(goods_no ,state)、(goods_no )两个索引,这就是最佳左前缀特性。原创 2023-03-08 08:00:00 · 598 阅读 · 0 评论 -
Http中post/get请求参数接收
form-data、x-www-form-urlencoded:不可以用@RequestBody;可以用@RequestParamapplication/json:json字符串部分可以用@RequestBody;url中的?后面参数可以用@RequestParam在GET请求中,不能使用@RequestBody。在POST请求,可以使用@RequestBody和@RequestParam;可以使用多个@RequestParam获取数据,@RequestBody不可以;原创 2023-03-07 09:38:31 · 11562 阅读 · 0 评论 -
一文讲解JDK自带监控工具查看 JVM 情况
本文主要介绍:常用的JDK 自带监控工具原创 2023-03-06 10:08:11 · 1886 阅读 · 0 评论 -
一文带你了解阿里的开源Java诊断工具 :Arthas
Arthas 是阿里开源的 Java 诊断工具,相比 JDK 内置的诊断工具,要更人性化,并且功能强大,可以实现许多问题的一键定位,是我用到的最方便的诊断工具。下载和安装见官网下面记录一些我工作中常用到的指令。原创 2023-03-06 08:21:36 · 1678 阅读 · 0 评论 -
行为型模式之策略模式
电商中,对商品的价格计算是比较麻烦的,不同等级的会员,折扣、优惠券、运费券、积分(不同等级的会员积分兑换的金额可能不一样),当用户下单或者商品详情页展示商品价格时,就需要根据不同的等级来计算商品价格。从上面的例子可以看出,在计算商品价格的业务代码中,并不会引入太多的if-else条件判断,且对于不同的策略/算法可以随时切换,这对于业务代码的解耦是相当有帮助的。此角色给出所有的具体策略类所需的接口。这种情形,就适合使用策略模式,我们根据不同的情况,将不同的算法封装成不同的策略,将策略与它的使用对象分离开来。原创 2023-03-04 11:35:33 · 528 阅读 · 0 评论 -
都2023年还不知道Java8如何优雅简化代码就落后了
空指针异常(NullPointerExceptions)是 Java 最常见的异常之一,一直以来都困扰着 Java 程序员。一方面,程序员不得不在代码中写很多null的检查逻辑,让代码看起来非常臃肿;另一方面,由于其属于运行时异常,是非常难以预判的。为了预防空指针异常,Google的Guava项目率先引入了Optional类,通过使用检查空值的方式来防止代码污染,受到Guava项目的启发,随后在Java 8中也引入了Optional类。Optional 类位于java.util包下,是一个可以为 n原创 2023-03-03 20:29:33 · 885 阅读 · 0 评论 -
Java 函数式编程实例
函数式编程是一种编程的范式和编程的方法论(programming paradigm),它属于结构化编程的一种,主要的思想是把运算的过程尽量通过一组嵌套的函数来实现。原创 2023-03-03 19:50:41 · 2354 阅读 · 0 评论 -
JAVA线程池监控以及动态调整线程池
Java线程池源码分析里虽然介绍了线程池的核心配置(核心线程数、最大线程数和队列大小)该如何配置,但是实际上业界也没有一个统一的标准。虽然有些所谓的"公式",但是不同的业务场景复杂多变,配置原则也不尽相同。从实际经验来看,IO密集型、CPU密集型应用在线程配置上就比较悬殊,因此没有一个通用的适合所有场景的公式。原创 2023-03-02 14:13:49 · 5181 阅读 · 0 评论 -
Java线程池源码分析
1.tasks,程序每秒需要处理的最⼤任务数量(假设系统每秒任务数为100~1000)2.tasktime,单线程处理⼀个任务所需要的时间(每个任务耗时0.1秒)3.responsetime,系统允许任务最⼤的响应时间(每个任务的响应时间不得超过2秒)corePoolSize:核心线程数每个任务需要tasktime秒处理,则每个线程每秒可处理1/tasktime个任务。原创 2023-03-02 08:00:00 · 539 阅读 · 0 评论 -
Java内置队列和高性能队列Disruptor
Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题。与Kafka、RabbitMQ用于服务间的消息队列不同,disruptor一般用于线程间消息的传递。基于Disruptor开发的系统单线程能支撑每秒600万订单。disruptor适用于多个线程之间的消息队列,作用与ArrayBlockingQueue有相似之处。原创 2023-03-01 09:04:27 · 1591 阅读 · 0 评论 -
MySQL:几个奇怪state和主从延迟问题(特例)
一、几个奇怪state这里的state就是我们show processlist出来看到的值,当前来看这个值有点类似Oracle的等待事件,但是实际上它是一个stage,也就是代码跑到某处时会置为一个合适的值,可以作为判定问题的一个初始化方向。1、preparing和statistics状态的特例先来看下面的state的值,我们可以看到:原创 2023-02-28 08:00:00 · 420 阅读 · 0 评论 -
MySQL5.7中delete长期处于preparing状态原因解析
大概就是这样一个语句,处于preparing 状态,问delete为什么会处于这个状态?二、简析对于preparing状态一般归结为优化阶段,并还没有进入实际的语句执行阶段。但是这里有所不同。并且我们知道一般delete执行慢一般状态会处于,updating子查询的sending data中但是这里是preparing状态。那么为什么会处于这种状态呢?简单分析一下。原创 2023-02-27 10:50:04 · 546 阅读 · 0 评论 -
Java8 Stream流操作总结
Stream 流操作可以分为 3 种类型:创建 StreamStream 中间处理终止 Steam中间处理只是一种标记,只有终止操作才会触发实际计算。 中间操作又可以分为无状态的(Stateless)和有状态的(Stateful),无状态中间操作是指元素的处理不受前面元素的影响,而有状态的中间操作必须等到所有元素处理之后才知道最终结果,比如排序是有状态操作,在读取所有元素之前并不能确定排序结果; 结束操作又可以分为短路操作和非短路操作,短路操作是指不用处理全部元素就可以返回结果,比如 找到第原创 2023-02-27 09:07:21 · 1688 阅读 · 0 评论 -
全网最全——Java 数据类型
一、数据类型方法论程序本质上是对数据的处理(逻辑运算),因此任何语言都需先解决如何表征【数据】这个核心概念。数据作为抽象的概念,天然的包含2个方面属性:类型:类型决定了数据只能和同类型的数据进行运算才有意义,不同类型的数据必须进行类型转换数值:是数据的数学意义上的大小或内容。同时数据保存在内存或磁盘中,总是占用一定的存原创 2023-02-26 18:02:42 · 554 阅读 · 0 评论 -
Java中BIO、NIO和AIO的区别和应用场景
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。一、BIO在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请原创 2023-02-26 16:55:58 · 762 阅读 · 0 评论 -
深入解析dubbo的延迟暴露
dubbo service默认是在容器启动的时候暴露的,一旦暴露,consumer端就可以发现这个service并且调用到这个provider。所谓延迟暴露即在启动之后延迟一定时间再暴露,比如延迟3s。dubbo服务默认是在spring容器初始化完成时()暴露,如果配置了delay参数且delay>0(单位ms),则会进行延迟暴露(初始化bean时->export->delay的配置有provider级别和service级别2种,Spring工程可在xml中配置;原创 2023-02-25 16:49:13 · 1562 阅读 · 0 评论 -
几张图带你看懂Unicode和UTF-8
二进制为什么要编码? 在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0)我们用QQ给其他人发消息、发文件、发表情,最终会以二进制形式在网路中传输,到达后再转换回来原创 2023-02-25 09:37:14 · 720 阅读 · 0 评论 -
一文带你了解如何模拟后台API调用场景
在开发前后台分离项目并且通过不同团队来实现的时候,如何将后台设计的 API 准确的传达到前台,是一个非常重要的工作。为了简化这个过程,开源社区做了很多努力,比如 protobuf技术,swagger 的诞生, 以及后面 openapi 的演化,都在试图解决 API 描述和文档的问题。这些标准某些程度上大大简化了 API 文档的撰写和维护,但是API设计往往比较复杂,所以另外还有一些痛点没有解决:原创 2023-02-24 08:31:08 · 691 阅读 · 0 评论 -
一文带你了解排序算法
数据序列1: 13-17-20-42-28 利用插入排序,13-17-20-28-42. Number of swap:1;数据序列2: 13-17-20-42-14 利用插入排序,13-14-17-20-42. Number of swap:3;如果数据序列基本有序,使用插入排序会更加高效。原创 2023-02-23 09:24:09 · 192 阅读 · 0 评论 -
你知道这几种常见的JVM调优场景吗?
看此文前需已了解了运行时的数据区域和常用的垃圾回收算法,也了解了Hotspot支持的垃圾回收器。一、cpu占用过高cpu占用过高要分情况讨论,是不是业务上在搞活动,突然有大批的流量进来,而且活动结束后cpu占用率就下降了,如果是这种情况其实可以不用太关心,因为请求越多,需要处理的线程数越多,这是正常的现象。话说回来,如果你的服务器配置本身就差,cpu也只有一个核心,这种情况,稍微多一点流量就真的能够把你的cpu资源耗尽,这时应该考虑先把配置提升吧。第二种情况,cpu占用率长期过高,这种情况下可原创 2023-02-22 11:01:00 · 260 阅读 · 0 评论 -
保证线程安全的10个小技巧
对于从事后端开发的来说,线程安全问题是我们每天都需要考虑的问题。线程安全问题通俗的讲:主要是在多线程的环境下,不同线程同时读和写公共资源(临界资源),导致的数据异常问题。比如:变量a=0,线程1给该变量+1,线程2也给该变量+1。此时,线程3获取a的值有可能不是2,而是1。线程3这不就获取了错误的数据?线程安全问题会直接导致数据异常,从而影响业务功能的正常使用,所以这个问题还是非常严重的。那么,如何解决线程安全问题呢?今天跟大家一起聊聊,保证线程安全的10个小技巧,希望对你有所帮助。原创 2023-02-22 08:23:17 · 384 阅读 · 0 评论 -
Stream管道流的map操作
用map方法是做不到的,这个需求用map方法无法实现。map只能针对一维数组进行操作,数组里面还有数组,管道里面还有管道,它是处理不了每一个元素的。map可以对管道流中的数据进行转换操作,但是如果管道中还有管道该如何处理?即:如何处理二维数组及二维集合类。peek函数是一种特殊的map函数,当函数没有返回值或者参数就是返回值的时候可以使用peek函数。原创 2023-02-21 09:32:55 · 394 阅读 · 1 评论 -
Stream的filter与谓语逻辑
什么是谓语逻辑?如下代码中WHERE 和 AND 限定了主语employee是什么,那么WHERE和AND语句所代表的逻辑就是谓语逻辑。lambda表达式表达的是一个匿名接口函数的实现,那具体到Stream.filter()中,它表达的是一个Predicate接口,在英语中这个单词的意思是:谓语。原创 2023-02-21 09:25:59 · 302 阅读 · 0 评论 -
lombok插件的使用和技巧
在过往的Java项目中,充斥着太多不友好的代码:POJO的getter/setter/toString;异常处理;I/O流的关闭操作等等,这些样板代码既没有技术含量,又影响着代码的美观,于是Lombok应运而生。Lombok能够达到的效果就是在源码中不需要写一些通用的方法,但是在编译生成的字节码文件中会帮我们生成这些方法,减少代码冗余.原创 2023-02-19 21:21:49 · 210 阅读 · 0 评论 -
你知道java8是如何排序Map嘛?
在Java中,有多种方法可以对Map进行排序,但是我们将重点介绍Java 8 Stream,这是实现目标的一种非常优雅的方法。学习一下HashMap的merge()函数在学习Map排序之前,有必要讲一下HashMap的merge()函数,该函数应用场景就是当Key重复的时候,如何处理Map的元素值。这个函数有三个参数:参数一:向map里面put的键参数二:向map里面put参数三:如果键发生重复,如何处理值。可以是一个函数,也可以写成lambda表达式。原创 2023-02-19 19:51:23 · 979 阅读 · 0 评论 -
一问学习StreamAPI终端操作
Java Stream管道流是用于简化集合类元素处理的java API。在使用的过程中分为三个阶段:将集合、数组、或行文本文件转换为java Stream管道流管道流式数据处理操作,处理管道中的每一个元素。上一个管道中的输出元素作为下一个管道的输入元素。管道流结果处理操作我之前写过的一个例子:原创 2023-02-18 22:13:01 · 506 阅读 · 0 评论 -
一文学习Stream查找和匹配元素
在对数组或者集合类进行操作的时候,经常会遇到这样的需求,比如:是否包含某一个“匹配规则”的元素是否所有的元素都符合某一个“匹配规则”是否所有元素都不符合某一个“匹配规则”查找第一个符合“匹配规则”的元素查找任意一个符合“匹配规则”的元素这些需求如果用for循环去写的话,还是比较麻烦的,需要使用到for循环和break。下面使用Stream来完成这些操作。何用Stream API来实现“查找与匹配”Employee员工类:原创 2023-02-18 21:26:33 · 2156 阅读 · 0 评论 -
带你认识一下什么是函数式接口Comparator
函数式接口Comparator1、函数式接口是什么?所谓的函数式接口,实际上就是接口里面只能有一个抽象方法的接口。Comparator接口就是一个典型的函数式接口,它只有一个抽象方法compare。有人会说equales方法也没有方法体,也是抽象方法。但是函数式接口的特点中有一条是:允许出现java.lang.Object中的public方法,所以equales方法可以忽略掉,Comparator仍然是函数式接口。原创 2023-02-17 14:13:43 · 642 阅读 · 0 评论 -
Spring Boot 是什么,应该如何学习,有哪些优缺点
1、Spring Boot 是什么?Spring Boot是一个基于Spring框架的开源项目,它简化了Spring应用程序的开发过程,提供了一种快速、便捷、可扩展的方式来构建Spring应用程序。Spring Boot通过自动化配置机制简化了Spring应用程序的配置过程,使得开发人员可以更快地启动和运行Spring应用程序,而无需手动配置大量的组件和依赖。同时,它还提供了一套功能强大的命令行工具,帮助开发人员更轻松地管理和运行Spring Boot应用程序。Spring Boot不仅支持传统的原创 2023-02-17 08:49:57 · 1492 阅读 · 3 评论 -
一文带你看懂泛型的约束和局限性
这是因为,定义的equals(T t)方法实际上会被擦拭成equals(Object t),而这个方法是继承自Object的,编译器会阻止一个实际上会变成覆写的泛型方法定义。泛型是一种类似“模板代码”的技术,不同语言的泛型实现方式不一定相同。Java语言的泛型实现方式是。所谓擦拭法是指,虚拟机对泛型其实一无所知,所有的工作都是编译器做的。所以,Java的泛型是由编译器在编译时实行的,编译器内部。,但是,在需要转型的时候,编译器会根据T的类型自动为我们。了解了Java泛型的实现方式——擦拭法,我们就知道了。原创 2023-02-16 14:30:00 · 331 阅读 · 0 评论 -
一文带你入门泛型
在Java中增加泛型类之前,泛型程序设计是用继承实现的。ArrayList类只维护一个Object引用的数组:...这种方法有两个问题。当获取一个值时必须进行强制类型转换。此外,这里没有错误检查。可以向数组列表中添加任何类的对象。对于这个调用,编译和运行都不会出错。然而在其他地方,如果将get的结果强制类型转换为String类型,就会产生一个错误。类型参数这使得代码具有更好的可读性和安全性。人们一看就知道这个数组列表中包含的是String对象。一个泛型类()就是具有一个或多个类型变量的类。原创 2023-02-16 10:11:10 · 363 阅读 · 0 评论