
Java
文章平均质量分 86
Java实战技术精选
颯沓如流星
Putty本无树,MinGW亦非台
展开
-
Java常用17个工具类方法,提升开发效率的“轮子”,避免重复造轮子
首先出场的是java.util包下的Collections类,该类主要用于操作集合或者返回集合,我个人非常喜欢用它。在工作中经常有对集合排序的需求。看看使用Collections工具是如何实现升序和降序的:执行结果:1.2 获取最大或最小值有时候需要找出集合中的最大值或者最小值,这时可以使用Collections的max和min方法。例如:执行结果:1.3 转换线程安全集合我们都知道,java中的很多集合,比如:ArrayList、LinkedList、HashMap、HashSet等,都是线程原创 2022-06-29 09:43:18 · 4961 阅读 · 0 评论 -
Java直接内存对齐(Memory Alignment)
内存对齐意味将数据类型写入到内存地址时是按照它们大小切割的,内存对齐会带来性能提升,是Java性能提升的黑技术。内存对齐定义(n是2的乘幂):boolean nAligned = (address%n) == 0;如果内存地址是n字节的倍数,那么我们说这n字节是内存对齐的,注意,这里n是2的幂,说白了,内存地址正好放下n字节的倍数,两者相除余数为零,正好整除。内存对齐类型有:类型对齐:某种CPU需要其特定的对齐方式缓存行对齐:正常是64,也有32/128,缓存行是主内存等内存的基本原子单位,有翻译 2021-08-21 19:19:41 · 947 阅读 · 0 评论 -
5款强大的JVM 性能调优监控工具 !
现实企业级Java应用开发、维护中,有时候我们会碰到下面这些问题:OutOfMemoryError,内存不足内存泄露线程死锁锁争用(Lock Contention)Java进程消耗CPU过高…这些问题在日常开发、维护中可能被很多人忽视(比如有的人遇到上面的问题只是重启服务器或者调大内存,而不会深究问题根源),但能够理解并解决这些问题是Java程序员进阶的必备要求。本文将对一些常用的JVM性能调优监控工具进行介绍,希望能起抛砖引玉之用。一、 jps(Java Virtual Machin原创 2020-10-27 11:01:05 · 1520 阅读 · 0 评论 -
SpringBoot最新版:优雅停机,抢先解读~~ 拒绝kill -9
优雅停机目前Spring Boot已经发展到了2.3.4.RELEASE,伴随着2.3版本的到来,优雅停机机制也更加完善了。目前版本的Spring Boot 优雅停机支持Jetty, Reactor Netty, Tomcat和 Undertow 以及反应式和基于 Servlet 的 web 应用程序都支持优雅停机功能。优雅停机的目的:如果没有优雅停机,服务器此时直接直接关闭(kill -9),那么就会导致当前正在容器内运行的业务直接失败,在某些特殊的场景下产生脏数据。增加了优雅停机配置后:在服原创 2020-10-26 10:37:46 · 704 阅读 · 0 评论 -
一整套Java线上故障排查技巧,爱了!
线上故障主要会包括 CPU、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如 jstack、jmap 等工具也是不囿于一个方面的问题的,基本上出问题就是 df、free、top 三连,然后依次 jstack、jmap 伺候,具体问题具体分析即可。CPU一般来讲我们首先会排查 CPU 方面的问题。CPU 异常往往还是比较好定位的。原因包括业务逻辑问题(死循环)、频繁 GC 以及上下文切换过多。而最常见的往往是业务逻辑(或者框架逻辑)转载 2020-10-22 17:32:49 · 349 阅读 · 1 评论 -
缓存淘汰算法--LRU算法
1. LRU1.1. 原理LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。1.2. 实现最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:新数据插入到链表头部;每当缓存命中(即缓存数据被访问),则将数据移到链表头部;当链表满的时候,将链表尾部的数据丢弃。1.3. 分析【命中率】当存在热点数据时,LRU的效率很好,但偶发性的、周期性的批量操作会导致LRU命原创 2020-10-14 11:03:20 · 312 阅读 · 1 评论 -
你知道 Volatile 和 CAS 的弊端之总线风暴吗?
一、什么是总线风暴总线风暴,听着真是一个帅气的词语,但如果发生在你的系统上那就不是很美丽了,废话不多说,先看图说结论。什么是总线风暴,先来看结论在java中使用unsafe实现cas,而其底层由cpp调用汇编指令实现的,如果是多核cpu是使用lock cmpxchg指令,单核cpu 使用compxch指令。如果在短时间内产生大量的cas操作在加上 volatile的嗅探机制则会不断地占用总线带宽,导致总线流量激增,就会产生总线风暴。总之,就是因为volatile 和CAS 的操作导致BUS总线缓存一致原创 2020-10-13 10:00:02 · 1490 阅读 · 0 评论 -
lombok的使用详解,解决@Builder.Default默认值问题
Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的Java模型对象(POJO)。在开发环境中使用Lombok插件后,Java开发人员可以节省出重复构建,诸如hashCode和equals这样的方法以及各种业务对象模型的accessor和ToString等方法的大量时间。对于这些方法,它能够在编译源代码期间自动帮我们生成这些方法,并没有如反射那样降低程序的性能。它所有的增强都是通过注解实现,所以了解其使用主要了解一下注解即可原创 2020-10-12 16:07:19 · 26295 阅读 · 0 评论 -
一口气说出Java 6种延时队列的实现方法(面试官也得服)
这篇文章主要介绍了一口气说出Java 6种延时队列的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧下边会介绍多种实现延时队列的思路。其实哪种方式都没有绝对的好与坏,只是看把它用在什么业务场景中,技术这东西没有最好的只有最合适的。一、延时队列的应用什么是延时队列?顾名思义:首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费。延时队列在项目中的应用还是比较多的,尤.原创 2020-10-12 10:43:40 · 1170 阅读 · 0 评论 -
JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙!
CPU磁盘内存GC问题网络线上故障主要会包括cpu、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top 三连,然后依次jstack、jmap伺候,具体问题具体分析即可。CPU一般来讲我们首先会排查cpu方面的问题。cpu异常往往还是比较好定位的。原因包括业务逻辑问题(死循环)、频繁gc以及上下文切换过多。而最常见的往往是业务逻辑(.原创 2020-09-27 11:00:06 · 292 阅读 · 0 评论 -
Java 必须掌握的 12 种 Spring 常用注解!
1.声明bean的注解@Component 组件,没有明确的角色@Service 在业务逻辑层使用(service层)@Repository 在数据访问层使用(dao层)@Controller 在展现层使用,控制器的声明(C)2.注入bean的注解@Autowired:由Spring提供@Inject:由JSR-330提供@Resource:由JSR-250提供都可以注解在set方法和属性上,推荐注解在属性上(一目了然,少写代码)。3.java配置类相原创 2020-09-21 14:56:21 · 112 阅读 · 0 评论 -
Spring 最常用的 7 大类注解,史上最强整理!
随着技术的更新迭代,Java5.0开始支持注解。而作为java中的领军框架spring,自从更新了2.5版本之后也开始慢慢舍弃xml配置,更多使用注解来控制spring框架。而spring的的注解那么多,可能做java很多年,都用不上。这里按照类型总结了这7种最常用的注解。1 核心注解@Required此注解用于bean的setter方法上。表示此属性是必须的,必须在配置阶段注入,否则会抛出BeanInitializationExcepion。@Autowired此注解用于bean的field、原创 2020-09-21 14:49:12 · 285 阅读 · 0 评论 -
Google 开源的依赖注入库,比 Spring 更小更快!
Google开源的一个依赖注入类库Guice,相比于Spring IoC来说更小更快。Elasticsearch大量使用了Guice,本文简单的介绍下Guice的基本概念和使用方式。学习目标概述:了解Guice是什么,有什么特点;快速开始:通过实例了解Guice;核心概念:了解Guice涉及的核心概念,如绑定(Binding)、范围(Scope)和注入(Injection);最佳实践:官方推荐的最佳实践;Guice概述Guice是Google开源的依赖注入类库,通过Guice减少了对工原创 2020-09-21 13:45:56 · 262 阅读 · 0 评论 -
Oracle JDK 和 OpenJDK 有什么区别?
OpenJDK是Sun在2006年末把Java开源而形成的项目,这里的“开源”是通常意义上的源码开放形式,即源码是可被复用的,例如IcedTea、UltraViolet都是从OpenJDK源码衍生出的发行版。Oracle JDK采用了商业实现,而OpenJDK使用的是开源的FreeType。当然,“相同”是建立在两者共有的组件基础上的,Oracle JDK中还会存在一些Open JDK没有的、商用闭源的功能。例如从JRockit移植改造而来的Java Flight Recorder,预计以后JRock原创 2020-09-21 13:22:32 · 187 阅读 · 0 评论 -
JDK1.8中的双冒号::是什么语法?
一、简介方法引用分为三种,方法引用通过一对双冒号:: 来表示,方法引用是一种函数式接口的另一种书写方式静态方法引用,通过类名::静态方法名, 如 Integer::parseInt实例方法引用,通过实例对象::实例方法,如 str::substring构造方法引用,通过类名::new, 如 User::new二、方法引用public final class Integer { public static int parseInt(String s) throws NumberForm原创 2020-09-17 19:44:33 · 698 阅读 · 0 评论 -
Java开源框架中的设计模式以及应用场景
一,单例模式单例模式是Java中最简单的设计模式之一,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。单例模式虽然很简单,但它的花样一点都不少,我们一一来看。1、饿汉式饿汉式,顾名思义,就是我很饿,迫不及待。不管有没有人用,我先创建了再说。比如在Dubbo中的这段代码,创建一个配置管理器。public class ConfigManager { p原创 2020-09-17 19:27:19 · 631 阅读 · 0 评论 -
Linux下Netty实现高性能UDP服务(SO_REUSEPORT)
当UDP丢包的时候,我们正常情况下是增加各种缓冲区的大小,有调整内核缓冲区的,也有调整应用缓冲区的。但是还有另外一种方式,就是加速UDP数据包的处理速度。1.当前Linux网络应用程序问题运行在Linux系统上网络应用程序,为了利用多核的优势,一般使用以下比较典型的多进程/多线程服务器模型:首先需要单线程listen一个端口上,然后由多个工作进程/线程去accept()在同一个服务器套接字上。 但有以下两个瓶颈:单线程listener,在处理高速率海量连接时,一样会成为瓶颈多线程访问serv.转载 2020-09-07 19:04:41 · 3124 阅读 · 0 评论 -
20个使用 Java CompletableFuture的示例,so easy!
在Java中异步编程,不一定非要使用rxJava, Java本身的库中的CompletableFuture可以很好的应对大部分的场景。这篇文章介绍 Java 8 的 CompletionStageAPI和它的标准库的实现CompletableFuture。API通过例子的方式演示了它的行为,每个例子演示一到两个行为。既然CompletableFuture类实现了CompletionStage接口,首先我们需要理解这个接口的契约。它代表了一个特定的计算的阶段,可以同步或者异步的被完成。你可以把它看成一个计原创 2020-08-29 11:14:23 · 281 阅读 · 0 评论 -
JDK8的Stream操作你还不会用吗?
Stream介绍Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。Stream特性:不是数据结构: 它没有内部存储,它只是用操作管道从 source(数据结构、数组、generator function、IO chann原创 2020-08-26 09:53:28 · 41107 阅读 · 0 评论 -
Java工具类库Hutool,GitHub星标15k+
简介Hutool是一个Java工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让Java语言也可以“甜甜的”。Hutool最初是我项目中“util”包的一个整理,后来慢慢积累并加入更多非业务相关功能,并广泛学习其它开源项目精髓,经过自己整理修改,最终形成丰富的开源工具集。(抄自作者简介)功能一个Java基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,同时提供以下组件:hutool-aop JDK动态代理封装,提供非IOC下原创 2020-08-24 09:47:50 · 484 阅读 · 0 评论 -
Java中的float浮点数的二进制存储及运算
float在内存中的数据格式及其转byte数组原理及转换过程float在计算机的存储四个字节,共有32位。以“符号”+“移位数”+“底数”的方式存储。三者的计算第一位是符号,往后8位是“移位数”,再往后23位是“底数”。32位的格式排列就是ABBB BBBB BCCC CCCC CCCC CCCC CCCCA表示符号,正数为0,负数为1B表示移位数,占了8个字节,所以能表示的大小为0~255。但是,移位数肯定是有正负之分,当读取这里的值要减去127,故float的移位数可从原创 2020-08-21 18:17:04 · 1537 阅读 · 0 评论 -
SpringBoot几种定时任务的实现方式
定时任务实现的几种方式Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。ScheduledExecutorService:也jdk自带的一个类;是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。Spring Task:Spring3.0以后自带的task,可以将它看成一个轻量级的原创 2020-08-20 18:08:32 · 537 阅读 · 0 评论 -
Java8 快速实现List转map 、分组、过滤等操作 ,当下最火的stream操作
利用java8新特性,可以用简洁高效的代码来实现一些数据处理。定义1个Apple对象:public class Apple { private Integer id; private String name; private BigDecimal money; private Integer num; public Apple(Integer id, String name, BigDecimal money, Integer num) { thi原创 2020-08-20 09:54:46 · 4412 阅读 · 1 评论 -
StringBuider 在什么条件下、如何使用效率更高?
引言都说StringBuilder在处理字符串拼接上效率要强于 String,但有时候我们的理解可能会存在一定的偏差。最近我在测试数据导入效率的时候就发现我以前对 StringBuilder 的部分理解是错误的。后来我通过实践测试 + 找原理 的方式搞清楚了这块的逻辑。现在将过程分享给大家测试用例我们的代码在循环中拼接字符串一般有两种情况第一种就是每次循环将对象中的几个字段拼接成一个新字段,再赋值给对象第二种操作是在循环外创建一个字符串对象,每次循环向该字符串拼接新的内容。循环结束后得到拼接好原创 2020-08-14 10:17:13 · 130 阅读 · 0 评论 -
有了这款可视化工具JVisualVM,Java 应用性能调优 so easy
JVisualVM 简介VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。在JDK_HOME/bin(默认是C:\Program Files\Java\jdk1.6.0_13\bin)目录下面,有一个jvisualvm.exe文件,双击打开,从UI上来看,这个软件是基于NetBeans开发的了。Vi转载 2020-08-14 10:10:55 · 220 阅读 · 0 评论 -
线上服务的Full GC问题排查,看这篇就够了!
线上服务的GC问题,是Java程序非常典型的一类问题,非常考验工程师排查问题的能力。同时,几乎是面试必考题,但是能真正答好此题的人并不多,要么原理没吃透,要么缺乏实战经验。过去半年时间里,我们的广告系统出现了多次和GC相关的线上问题,有Full GC过于频繁的,有Young GC耗时过长的,这些问题带来的影响是:GC过程中的程序卡顿,进一步导致服务超时从而影响到广告收入。这篇文章,我将以一个FGC频繁的线上案例作为引子,详细介绍下GC的排查过程,另外会结合GC的运行原理给出一份实践指南,希望对你有所帮助转载 2020-08-14 10:00:22 · 2298 阅读 · 0 评论 -
老生常谈逻辑运算,与&、或|、异或^、取反~、左移<<、右移>>
按位与运算符(&)参加运算的两个数据,按二进制位进行“与”运算。运算规则: 0&0=0; 0&1=0; 1&0=0; 1&1=1;即:两位同时为“1”,结果才为“1”,否则为0例如:3&5 即 0000 0011& 0000 0101 = 00000001因此,3&5的值得1。另,负数按补码形式参加按位与运算。“与运算”的特殊用途:(1)清零。如果想将一个单元清零,即使其全部二进制原创 2020-08-12 19:11:27 · 2898 阅读 · 0 评论 -
【一篇入魂】带你快速起跑spring,最详细入门教程
一、spring简介Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身。它的理念包括 IoC (Inversion of Control,控制反转) 和 AOP(Aspect Oriented Programming,面向切面编程)。1、Spring 中常用术语:框架:是能完成一定功能的半成品。框架能够帮助我们完成的是:项目的整体框架、一些基础功能、规定了类和对象如何创建,如何协作等,当我们开发一个项目时,框架帮助我们完成了一部分功能,我们自己再完成一部分,原创 2020-08-10 12:26:17 · 764 阅读 · 1 评论 -
抽丝剥茧java8函数式编程,生产环境下应该这么用
摘要: 在Java重构的过程中,巧妙的运用函数式思想能够便捷地去掉重复。函数式编程是声明式的。也就是说,她应该指定“什么要做”而非“怎么做”。这种方式使得我们可以工作更高的抽象层次。而传统的过程式以及面向对象的语言,则是命令式的,因而更关注于“怎么做”这个层面。站在面向对象思想的角度来看,函数式编程将函数看成一等公民的思想,使得我们处理的粒度从类变小为函数,从而可以更好地满足系统对重用性和扩展性的支持。也就是说,我们可以从函数的粒度,而非对象的粒度去思考领域问题。例如,有这样一个场景:我的业务模型是个P原创 2020-08-08 16:41:45 · 190 阅读 · 0 评论 -
阿里排查Java问题工具清单,后端必备技能!
平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记,可以让自己后续忘记了可快速翻阅,二是分享,希望看到此文的同学们可以拿出自己日常觉得帮助很大的工具,大家一起进步。Linux命令类tail最常用的tail -ftail -300f shopbase.log #倒数300行并进入实时监听文件写入模式grepgrep forest f.txt #文件查找grep forest f.txt cpf.txt #多文件查找gre原创 2020-08-08 13:18:20 · 292 阅读 · 0 评论 -
用了这么久你还不知道Java 8到底有哪些新特性?
一、接口的默认方法(Default Methods for Interfaces)Java 8使我们能够通过使用 default 关键字向接口添加非抽象方法实现。 此功能也称为虚拟扩展方法。第一个例子:interface Formula{ double calculate(int a); default double sqrt(int a) { return Math.sqrt(a); } }Formula 接口中除了抽象方法计算接口公式还定义了默认方法 sqrt 。 实现原创 2020-08-08 12:54:23 · 346 阅读 · 0 评论 -
老生常谈—后端优化性能经验分享
今天谈下业务系统性能问题分析诊断和性能优化方面的内容。这篇文章重点还是谈已经上线的业务系统后续出现性能问题后的问题诊断和优化重点。系统性能问题分析流程我们首先来分析下如果一个业务系统上线前没有性能问题,而在上线后出现了比较严重的性能问题,那么实际上潜在的场景主要来自于以下几个方面。业务出现大并发的访问,导致出现性能瓶颈上线后的系统数据库数据日积月累,数据量增加后出现性能瓶颈其它关键环境改变,比如我们常说的网络带宽影响正是由于这个原因,当我们发现性能问题的时候,首先就需要判断是单用户非并发.原创 2020-08-03 12:58:46 · 1690 阅读 · 0 评论 -
你知道Thread.Sleep(0)的用处吗?
前言我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间。那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题:假设现在是 2020-7-28 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在 2008-4-72020-7-28 12:00:01.000 的时候,这个线程会 不会被唤醒?某人的代码中用了一句看似莫明其妙的话:Thread.Sleep(0) 。既然是 Sleep 0 毫秒,那么他跟去掉这句代码相比,有啥区别么?我们先回顾一下操原创 2020-07-28 10:29:20 · 130 阅读 · 0 评论 -
深入理解 Java 虚拟机 学习笔记
深入理解 Java 虚拟机 学习笔记深入理解 Java 虚拟机 学习笔记第二章 Java 内存区域与内存溢出异常内存区域对象创建对象的内存布局对象访问内存溢出异常常用 JVM 参数 (Java HotSpot VM)常见异常及可能原因String 与字符串常量第三章 垃圾收集器与内存分配策略判断对象是否存活垃圾收集算法HotSpot 算法实现垃圾收集器内存分配与回收策略第六章 类文件结构第七章 虚拟机类加载机制类加载的过程类加载器原创 2020-07-25 10:42:34 · 265 阅读 · 0 评论 -
使用 Redis 和 Spring Boot 执行异步任务
Spring/Spring BootSpring 是最流行 Java 应用程序开发框架。因此,Spring 社区也是最大的开源社区之一。除此之外,Spring 博客还提供了最新的开发文档,内容非常丰富。涵盖了框架的内部工作原理和示例项目,在StackOverflow上有10万多个问题。Spring 早期只支持基于XML的配置,为此饱受批评。后来 Spring 引入了基于注解的配置,情况发生了根本改变。Spring 3.0是第一个支持基于注解的配置的版本。2014年发布的 Spring Boot 1.0,翻译 2020-07-23 17:59:07 · 555 阅读 · 0 评论 -
带你上手阿里开源的 Java 诊断利器:Arthas
项目源码地址:https://github.com/alibaba/arthas一、简介为什么要用 Arthas?好多 Java 开发的小伙伴可能有遇到下面这些问题:项目中导入了一个 jar 包的不同版本,那么这个类从哪个 jar 包加载的?线上环境为什么会报各种异常?本地项目运行没问题,线上环境运行的结果为什么和本地不同?数据原因没有执行到?代码没有 commit?环境上使用的分支搞不对?线上环境遇到偶先问题,难道只能通过加日志,调整项目日志级别,重新打包发布验证问题吗?线上环境遇到某个用.原创 2020-07-20 10:30:29 · 1147 阅读 · 0 评论 -
JVM参数你设置对了吗?
前言一般来说,每个公司对于JVM的参数都有规范的,甚至形成了一些公司层面的默认配置,如果遇到性能问题(比较特殊的使用场景),就会考虑从代码层次、JVM层次、甚至Linux服务器层次去进行优化。堆设置-Xms:初始堆大小-Xmx:最大堆大小-XX:NewSize=n:设置年轻代大小-XX:NewRatio=n:设置年轻代和年老代的比值。如n=3,表示年轻代与年老代比值为1:3,年轻代占整个年轻和代年老代的1/4-XX:SurvivorRatio=n:年轻代中Eden区与两个原创 2020-07-09 20:11:27 · 699 阅读 · 0 评论 -
还在用if(obj!=null)做非空判断?带你快速上手Optional实战性理解!
1.前言相信不少小伙伴已经被java的NPE(Null Pointer Exception)所谓的空指针异常搞的头昏脑涨,有大佬说过“防止 NPE,是程序员的基本修养。”但是修养归修养,也是我们程序员最头疼的问题之一,那么我们今天就要尽可能的利用Java8的新特性 Optional来尽量简化代码同时高效处理NPE(Null Pointer Exception 空指针异常)2.认识Optional并使用简单来说,Opitonal类就是Java提供的为了解决大家平时判断对象是否为空用 会用 null!=o原创 2020-06-22 10:27:33 · 239 阅读 · 0 评论