![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 82
jeff-y
所有文章用于个人记录,仅供参考,有错误的地方还请指出错误。
展开
-
Java新特性-JDK16中的Record类(怎么精简地表达不可变数据?)
Java新特性-JDK16中的Record类1. 背景从18年开始了解到java就用的就是jdk8,经历了两家公司,也都是JDK8的项目,这是故步自封还是稳中求胜呢,对于商业项目来讲需要考虑到的地方太多了,更新的价值点和风险点 ,最终的结果导向还是价值,升级后对于我们现在到底能带来多少送价值。但是对于我个人来讲我不去学习新的东西,那必然是故步自封了。给你一个保守、粗暴的估计,你如果从 JDK 8 迁移到 JDK 17,并且能够恰当使用 JDK 8 以后的新特性的话,产品的代码量可以减少 20%,代码错原创 2021-11-20 16:39:36 · 1812 阅读 · 1 评论 -
细品事物机制(二)
细品事物机制(二)上一节讲了本地事物,我们先回顾一下,本地事物的事物是依靠底层数据库的支持实现,列如我们项目中的jdbc中统一封装的rollBack()方法以及结合AOP切面和事务的传播特性实现整个项目的事物机制。 今天我们主要聊的是全局事务。什么是全局事务?与本地事务相对的是全局事务,在上一节中,事务的区分可以根据数据源和是否单机进行区分。全局事务被限定为一种适用于单个服务使用多个数据源的事务解决方案。但是理论上的全局事务是没有单个服务的限制的,它本来就是 DTP(Distributed Trans原创 2021-07-25 16:06:02 · 201 阅读 · 1 评论 -
浅入浅出Caffeine cache
背景公司项目中有用到caffeine cache 所以来了解一下。本地缓存也就是我们适用内存缓存一些热点数据,使应用程序的程序处理的更加的快。以及保护我们的一些有IO操作的函数/方法,以达到提高我们应用程序吞吐的目的。对于java技术栈来讲我们通常使用到的本地缓存都有 一些原有的容器HashMap,google的guava cache等等。今天了解一下caffine缓存。简介Caffeine 是基于Java 8 开发的、提供了近乎最佳命中率的高性能本地缓存组件,Spring5 开始不再支持 Gua原创 2021-07-24 22:01:30 · 1247 阅读 · 3 评论 -
细品mysql的事务隔离机制
细品mysql的事务隔离机制背景之前也有记录过mysql事务这块,温故而知新。既然聊的是Mysql事务的隔离机制,那在这里我们就默认mysql使用的是InnoDB引擎。事务这两个词也还算抽象,在这里我就把大家当做大黄鸭,都细细的聊一边。为什么MYSQL数据库需要事务在回答这个问题之前,先分析一下问题,数据库:也可以称为数据管理系统,存储数据的一个系统,将我们所需要的数据进行持久化存储,再着就是事务:这本就是一个抽象的概念,我在这里把他描述为一个过程,一个事件的成功,必然会经过一个过程,这个过程原创 2021-06-20 17:05:08 · 148 阅读 · 0 评论 -
从零开始学架构-day05
从零开始学架构-day06高性能缓存架构当服务使用关系型数据库已经达到性能瓶颈的时候我们应该怎么办,数据库已经分片了,也分库分表了,索引什么也都极致了(一般不可能)但是还是扛不住高流量。有点经验的同学都会说:“加缓存,上redis or 直接应用内存(缓存)“。什么时候用高性能缓存架构?需要经过复杂运算后得出的数据,存储系统无能为力当我们是一个用户中心的系统,需求是提供在线用户的人数,那我们肯定不能去select count(*) 数据库去统计吧,一般读多写少的数据,存储系统有心无力原创 2021-06-14 17:25:41 · 1177 阅读 · 3 评论 -
压测引发的思考——高并发用同步还是异步好?
高并发用同步好还是异步好?背景最近616大促,公司的服务需要进行压力测试,使用了公司自己的压测平台。对生产机器进行了摘流量压测。由于服务都是查询的接口,也算是很好压测的。这篇文章大概描述压测过程过程,主要是压测出的问题的解决以及对ForkJoinPool学习和了解。(标题党???????)为什么要进行压测电商促销 ,这个肯定要对现有服务的流量预估,峰值可以抗到多少QPS 。是否需要在促销前加机器,是否需要加机器内存等。是否当有高并发的时候会有明显的性能bug问题,在促销前进行性能优化,不在物理原创 2021-06-05 19:38:21 · 776 阅读 · 2 评论 -
从零开始学架构-day04
不得不说我是三天打渔两天晒网,烂泥巴糊不上墙。烂泥巴开始打渔。上节跟着大佬学习了,架构的复杂度来源,现在回顾下,确实想不起来了。重新开一遍。回顾影响架构复杂度的几大因素,追求高性能,高可用,高拓展既然已经知道了复杂度的来源于这些方面,那我们有什么原则可以直接将这些复杂度化难为简呢? 那这这节课,我们就看下架构的三大原则:合适原则,简单原则,演化原则。架构的三大原则合适原则合适原则,合适的意思就是合适呗,选择一个中间件,或者一些框架,或者物理机等,都得合适我们所要设计的系统。还有就是合适原则原创 2021-05-03 22:06:38 · 2248 阅读 · 6 评论 -
Java函数式编程神器 VAVR(vavr - turns java™ upside down)
什么是函数式编程基本概念:他是一种编程范式,对于函数式编程来说,它只关心定义输入数据和输出数据相关的关系,数学表达式里面其实是在做一种映射(mapping),输入的数据和输出的数据关系是什么样的,是用函数来定义的。特征:stateless:函数不维护任何状态。函数式编程的核心精神是 stateless,简而言之就是它不能存在状态,打个比方,你给我数据我处理完扔出来。里面的数据是不变的。immutable:输入数据是不能动的,动了输入数据就有危险,所以要返回新的数据集。(不可变的)Jav.原创 2021-04-17 22:28:14 · 1233 阅读 · 9 评论 -
获取不连续数字中缺的数字
背景最近项目需求需要做一个档案管理系统,其中一个功能就是判断凭证是否断号。且将断号的号码找出来。需求分析凭证的短号规则,也就是这个凭证是通过怎么一个规则来判断短号的。最后和产品了解每个公司都有自己的规则。不一定是纯数字,也有可能标记有横杠特殊字符等。砍需求,由于我们在年底进行开发的版本是POC版本,并且时间非常的紧急(以至于我们每天都要搞到11点)。所以说不用很复杂的业务需求,所以最后讨论下来先做为写死的纯数字校验。所以有了今天这篇文章。CODOING其实有很多同学看到这个一串数字断号校原创 2021-01-30 22:56:35 · 491 阅读 · 0 评论 -
如何使用MySQL关系型数据库存储树结构
背景需求存储一个组织结构或者档案仓库,看到这个需求我们的第一个反应肯定就是树状结构,并且是一个多层多节点无限级树状机构。我们目前使用的是mysql关系型数据库。那我们应该如何来实现这个结构关系呢?有3种存储的方式:到目前为止我在实战中曾使用过三种方式来实现这种hierarchical-data:Adjacency list (邻接表)Closure table (闭包表)Path enumeration (路径枚举)基于个人需要这里主要了解闭包表。Closure table原创 2020-12-13 18:37:27 · 837 阅读 · 0 评论 -
浅析线程池参数设置
背景首先先明确一下线程池的主要作用是什么线程池解决的核心问题就是资源管理问题。在并发环境下,系统不能够确定在任意时刻中,有多少任务需要执行,有多少资源需要投入。这种不确定性将带来以下若干问题:频繁申请/销毁资源和调度资源,将带来额外的消耗,可能会非常巨大。创建一个线程不仅会消耗内存资源,并且会增加CPU的线程的上下文切换频繁,当线程达到一定的极限的时候CPU就只能忙的切换线程,而其他什么事情也不做了。对资源无限申请缺少抑制手段,易引发系统资源耗尽的风险。当我们无限的去申请线程的时候就有可能产生OO原创 2020-12-08 23:55:56 · 374 阅读 · 0 评论 -
细品Java8中hashCode方法
hashCode方法简介散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。Java语言对hashCode的应用3. 主要用途hashcode是Object中的函数,所有类都拥有的一个函数,主要返回每个对象的hash值,主要用于哈希表中,如HashMap、HashTable、HashSet。在这里需要注意的是,他就是为了在一些对象数组里面存储的时候可以节省空间原创 2020-11-30 20:50:27 · 1913 阅读 · 4 评论 -
细品Java中的异常体系
Java中的异常异常的基本定义:异常情形是指阻止当前方法或者作用域继续执行的问题。异常处理机制就是当程序发生异常时,它强制终止程序运行,记录异常信息并将这些信息反馈给我们,由我们来确定是否处理异常。异常体系1. Java中的异常Throwable是java语言中所有错误和异常的超类(万物即可抛)。它有两个子类:Error、Exception。Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类。Exception 是程序正常运行中,可以预料的意外情况,可原创 2020-11-28 18:09:51 · 226 阅读 · 0 评论 -
使用Vavr进行函数式编程(二)
值Option这个Option(vavr)或Optional(java8)就是提醒开发人员这个值有可能为null,你在使用前进行判空处理。在Java8中也就是我们上面所描述的Optional。Vavr 中的 Option 与 Java 8 中的 Optional 是相似的。不过 Vavr 的 Option 是一个接口,有两个实现类 Option.Some 和 Option.None,分别对应有值和无值两种情况。Option 也支持常用的 map、flatMap 和 filter 等操作./*原创 2020-11-23 23:29:29 · 1081 阅读 · 2 评论 -
使用Vavr进行函数式编程(一)
1. 元组 ( Tuple )可以放入多个不同参数的数据类型。弥补Java的函数只能返回一个值的缺陷(可以理解为就是一个特殊对象)。不易放入多个变量,会导致代码不易阅读。demo //原数组的 Tuple2<String, Integer> tuple2 = Tuple.of("Hello", 100); //对Tuple2内部变量进行操作 Tuple2<String, Integer> updatedTuple2 = tup原创 2020-11-18 00:36:06 · 918 阅读 · 0 评论 -
细品数据结构之BitMap
背景有10G的数据,查找其中是否有包含某个数据。但是内存只有2G。如何在10G数据中查看这条数据是否存在。也许有同学立马会想到bloom filter,是的布隆过滤器是由位图思想演化来的一个更高级的数据结构。这篇文章主要还是讲一下位图的的原理和思想。BitMap(位图)简介用一个bit来表示某个值,也就是通过存储位置来代表这个数据。位图没有存储具体的值,而只是存储了这个值在应用中的数据指纹(可以指数组下标,也可以指的是hash后的值所映射的数组下标)。位图是不可以重复的,且是有序的(具体还是根据原创 2020-10-09 21:39:17 · 347 阅读 · 0 评论 -
Java 并发控制脑图
原创 2020-09-24 20:27:25 · 217 阅读 · 0 评论 -
理解java中的happens-Before
引言Java的内存模型是主内存和工作内存,我们在进行程序调用的时候,变量值都是从主内存中读取然后复制一个副本,对这个副本进行操作。到最后将这个副本再更新到主内存中。但是这个只是针对于单线程,那如果是多线程呢?并且操作的是同一个变量值,那这两个线程之间的可见性应该如何来定义呢?happen-Before简介java使用JMM模型后那就使用happen-before来阐述两个线程间的可见性在JMM中,如果一 个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在happens-befor原创 2020-09-22 21:26:50 · 542 阅读 · 1 评论 -
细品redis的Scan和Keys命令
背景我们有一个类似用户中心,其中有百万级别用户以user_id + id号为key存放在redis中。有一个需求是将user_为前缀进行匹配查询进行key的匹配,就在进行这个的操作命令的时候出现服务卡顿和redis 有部分链接超时。最后排查出来的问题所在就是keys的时候查出来的key太多导致的问题。具体原因那就从他这个命令的原理看起最后的解决方案是:使用scan命令Keys简介通过简单的正则就可以进行模糊匹配,没有分页,没有游标。就是暴力查找遍历。好处就是方便,坏处应有仅有,redis是原创 2020-09-01 22:29:27 · 4168 阅读 · 0 评论 -
细品Redis高性能数据结构之hash对象
背景上一节讲Redis的高性能字符串结构SDS,今天我们来看一下redis的hash对象。Hash对象简介redis的hash对象有两种编码(底层实现)方式,字典编码和压缩列表编码。在使用字典编码的时候程序就是将hash表的key存为字典的键,hash的value作为字典的值,字典的键值都是用的是字符串类型。在哈希对象保存的所有键值对的键和值的字符串长度都小于 64 字节和哈希对象保存的键值对数量小于 512 个使用的是ziplist,不能满足这个的使用的是hashtable(字典编码)深度原创 2020-08-12 01:37:51 · 1456 阅读 · 0 评论 -
秒懂java规则表达式框架Aviator2.3.0
背景在我们的业务场景中有一个需求,我们有一个配置功能,该功能需要配置两个变量之间比较大小。使用tab比较难表达,所以就提出了,可以让用户写比较简单的函数进行配置。或者选tab进行选择(前段直接将对应的tab字符串拼接来给后端执行)。或者这么说吧,可以通过字符串的表达的意思,进行执行这个字符串的索要表达的逻辑,且这个逻辑和这个字符串可以自定义。Aviator简介Aviator是一个高性能、轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值。现在已经有很多开源可用的java表达式求原创 2020-08-09 16:44:14 · 5672 阅读 · 2 评论 -
微服务间异步通讯踩坑日记
背景公司的服务都是微服务之前的调用,现在A服务需要使用B服务的功能,但是B服务处理业务是需要一定的时间的。为了提高服务间的吞吐采用异步的方式执行。同步调用和异步调用同步调用带来的坏处同步调用需要被调用方的吞吐不低于调用方的吞吐。否则会导致被调用方因为性能不足而拖死调用方。换句话说,整个同步调用链的性能会由最慢的那个服务所决定。同步调用会导致调用方一直在等待被调用方完成,如果一层接一层地同步调用下去,所有的参与方会有相同的等待时间。这会非常消耗调用方的资源。因为调用方需要保存现场(Context原创 2020-08-07 19:24:42 · 1310 阅读 · 0 评论 -
SpringBoot 2.X中的@Async和Java8中的completableFuture的使用比较
背景看到項目中有使用到Async注解和completetableFuture的runApply方法的使用。兩者都是異步提交方法的方式。那他两都分别在什么场景底下比较适用呢?非常的明显的区别,一个是注解一个是方法调用。这样的话带来利好了。注解注释某个方法,那这个方法只要被调用就会产生异步。那使用的completableFuture的话你调用那个方法那个方法才会被异步。Async 产生的默认使用的线程池是不一样的。一个是forkJoinPool 一个是AsyncTaskExecutor。两个都是用默认原创 2020-08-03 23:18:21 · 4975 阅读 · 1 评论 -
Java8使用CompletableFuture的部分方法
背景CompletableFuture的使用是为了异步编程,异步编程可以解决同步编程的性能瓶颈问题。也就是将同步操作变为了并行操作。当我们有一大批数据需要处理的时候我们可以将这些数据分而治之,使用CompletableFuture通过线程池的多个线程进行异步执行。异步执行的意思就是下一个人不不用等上一个任务执行完成,也就是重新起一个线程池这里的线程池指的就是当上一个人任务没有执行完,需要新起一个的线程就在这个线程池里创建或者直接获取已有的线程。CompletableFuture介绍在1.8原创 2020-07-30 23:18:31 · 643 阅读 · 0 评论 -
java中的异常和异常处理
1. 异常机制的概述Java的基本理念是“结构不佳的代码不能运行”,在我们进行编写代码的时候一般通过编译的时候就可以看出代码是否有错误,但是在这一阶段并不能处理完成所有的异常,如一些不可预知的情况,在运行期间才会暴露。所以Java中对异常做出了如下归类。编译错误是因为程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误得原因和位置,ide很牛逼,可以直接在我们编辑的时候直接为我们提示,这也是我们在程序中遇到的err如下图:运行时错误是因为在Java在运行的过程中遇到不可以执行的错误当原创 2020-07-29 23:16:22 · 272 阅读 · 0 评论 -
程序員必須知道的面向对象设计六大原则
背景在程序设计领域, SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期 引入的记忆术首字母缩略字,指代了面向对象编程和面向对象设计的五个基本原则。当这些原则被一起应用时,它们使得一个程序员开发一个容易进行软件维护和扩展的系统变得更加可能。SOLID所包含的原则是通过引发编程者进行软件源代码的代码重构进行软件的代码异味清扫,从而使得软件清晰可读以及可扩展时可以应用的指南。SOLID被典型的应用在测试驱动开发上,并且是敏捷开发以及自适应软件开发的基本原则的原创 2020-07-29 19:43:55 · 247 阅读 · 0 评论 -
你真的理解序列化和反序列化吗?
背景序列化协议有哪些,这些在序列化协议有什么区别?redission的写入的时候采用的是什么序列化协议?在使用RPC调用的时候,他的序列化是如何实现的?灵魂拷问,感觉自己是个渣渣!序列化和反序列化的概念互联网的产生带来了机器间通讯的需求,而互联通讯的双方需要采用约定的协议,序列化和反序列化属于通讯协议的一部分。通讯协议往往采用分层模型,不同模型每层的功能定义以及颗粒度不同,例如:TCP/IP协议是一个四层协议,而OSI模型却是七层协议模型。在OSI七层协议模型中展现层(Presentation原创 2020-07-20 23:11:38 · 385 阅读 · 0 评论 -
java8 中的接口有什么变化?
背景接口里面可以写方法吗?接口里面不可以写实现好的方法。接口里面的方法可以被继承的类实现。还是对java8不够理解啊。看下面啪啪啪啪!!default 关键字default方法是在java8中引入的关键字,也可称为Virtual extension methods——虚拟扩展方法。是指,在接口内部包含了一些默认的方法实现(也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制),从而使得接口在进行扩展的时候,不会破坏与接口相关的实现类代码。为什么java8引进了defaul原创 2020-07-09 00:26:20 · 509 阅读 · 0 评论 -
你真的了解Java中的String吗(也太菜了)?
背景我们在开发的时候,在处理字段的时候遇到大量的字符拼接的时候会使用StringBuffer和StringBuild。这是为什么呢?那就是因为String会在每一次创建的时候都会新建一个对象,原来的对象也不会被删除,还有就是说还有StringBuffer和StringBuild有什么区别呢?带着这个疑问我们看一下源码源码阅读我们先看一下String类//从类上看,他使用了final关键字,说明这个类是不可以改变的,且继承了Serializable,他是可以被序列化的public final原创 2020-07-01 02:16:43 · 276 阅读 · 1 评论 -
【JUC】CyclicBarrier的了解和使用
概念权威指南一种同步辅助工具,它允许一组线程全部互相等待以到达一个公共的障碍点。CyclicBarriers在涉及固定大小的线程方的程序中很有用,该线程方有时必须互相等待。屏障被称为循环屏障, 因为它可以在释放等待线程之后重新使用。CyclicBarrier支持可选的Runnable命令,该命令在聚会的最后一个线程到达之后但在释放任何线程之前,每个障碍点运行一次。此屏障操作对于在任何一方继续之前更新共享状态很有用。个人理解给每个线程设置一个阈值,当每个线程逗达到这个阈值的时候才会去执行。再原创 2020-06-21 23:36:44 · 320 阅读 · 1 评论 -
java的内部类和静态内部类(嵌套类)
背景开发新项目,写Swager的mode的时候用到了嵌套Model,于是在代码中,出现了静态内部类。在codeReview的时候稍微和大家聊了一下。尤其是Static 修饰类和修饰对象和变量不一样呢?定义1. 内部类可以将一个类的定义放在另一个类的定义内部,这就是内部类;嵌套类是其封闭类的成员。非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有的也是如此。静态嵌套类无权访问封闭类的其他成员。为一体的一个部件OuterClass,一个嵌套类可以声明private,public,p原创 2020-06-20 02:13:43 · 541 阅读 · 2 评论 -
【JUC】CountDownLatch你真的了解吗?
背景在平时的开发中,我们如何让各个线程间协调工作呢?除了我们经常使用的线程同步锁Sychronized,ReentrantLOcak的使用,还有线程自有方法,sleep,yeid的使用。哪还有那些高级的使用呢?那就是JUC包中的CountDownLatch,CyclicBarrier,Semaphore。今天我们先了解一下CountDownLatch的使用。CountDownLatch1. 权威指南一种同步帮助,允许一个或多个线程等待,直到其他线程中执行的一组操作完成为止。一个CountDow原创 2020-06-17 01:11:29 · 214 阅读 · 0 评论 -
终于搞懂HashMap的源码了!!!
背景HashMap是我们在平时开发最常用的容器之一,但是我们有真正了解过他吗?他是线程安全的吗?他是以何种方式来存储的呢?为什么初始化的容器大小时2的n次幂呢?他是如何进行扩容的呢?他是如何实现并发安全呢?等等一系列问题。正是知己知彼才能百战百胜,所以我打算深入理解一下hashMaphashMap脑图为了理清思路和能快速记住hashMap的“面貌”就大概列了一下看完脑图,其中很多还是不够详细的。只是概述了内容。HashMaphashMap的概述hashMap,继承Map集合,以key-v原创 2020-06-14 00:11:15 · 656 阅读 · 0 评论 -
坑爹的一次堆内存分析!!
背景突然dingding 嗡嗡作响。内心一颤,打开一看。我早有一台服务内存95。机会来了,露一手。grafana 先观察了下。是慢慢的张上来的。说明有内存泄露。jps ,jstat 。命令baba一敲。一看机器起了20多天竟然有11万次FGC。说出来你都不信吧。忘记截图了。具体每次GC时间给忘了(有点不专业了)。于是使用jmap dump包(有风险,当时和同事还评估了一下,可以搞),完成后 ,然后重启这台服务。开始搞起由于是生产机器,root权限下没有同步环境变量。所以在刚开始使用jps j原创 2020-06-04 01:34:28 · 407 阅读 · 0 评论 -
秒懂Java并发和线程安全
背景在平时写代码的时候我们经常会说“这会不会有线程安全问题,是不是得加把锁呢?”,细细的品一下这句话,是包涵很多知识点在里面。线程?,线程安全?,什么时候才会出现线程安全?Java中的锁? 等等。知识点什么是线程?”线程是承载代码运行的载体“ 这是我脑子里飘出来的第一句话。看看WIKI百科是如何讲的: 线程(英语:thread)是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条原创 2020-05-27 01:12:07 · 376 阅读 · 0 评论 -
final关键字你真的会用?
背景codeReview的时候,看到各种final关键字的”骚“操作,今天认真复习一下final关键字。我们都知道final关键字可以使用到类上,也可以使用道方法上,也可以使用到数据上,但是他的使用会为我们提供哪些好处呢?final关键自的使用Java关键字final通常指的是“这是无法改变的”不想作出改变的原因有两种:设计和效率。由于一般使用这一方面对final不是很了解(例如我)导致使用目的不是很明确。导致使用错误。而达到反效果。final可以修饰数据,方法,和类final数据被final原创 2020-05-26 01:03:07 · 379 阅读 · 0 评论 -
中流砥柱java的动态代理
背景在我们学习Spring框架的时候我们是否思考过,Spring是如何实现bean实列注入到IOC容器中呢?我们如何去权威指南代理是基本的设计模式之一,他是为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象。这些操作通常涉及与“实际”对象的通信,因此代理通常充当着中间人的角色。Java的动态代理比代理的思想更迈进了一步,因为他可以动态地创建代理并动态的处理对所代理的方法的调用。在动态代理上所做的所有调用都会被重定向到单一的调用处理器上,他的工作是揭示调用的类型并确定相应的对策。原创 2020-05-15 01:59:49 · 221 阅读 · 1 评论 -
java的反射机制到底是做什么的?
背景在学习java的动态代理的时候用到了反射机制,那我们来对反射机制深入了解一下权威指南通过wiki百科可知: 在计算机学中,反射(英语:reflection)是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。[1]用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。在类型检测严格的面向对象的编程语言如Java中,一般需要在编译期间对程序中需要调用的对象的具体类型、接口、字段和方法的合法性进行检查。反射技术则允许将对需要调用的对象的信息检查工作从原创 2020-05-13 01:19:37 · 464 阅读 · 0 评论 -
Java中是否直接可以使用enum进行传输
背景我们在进行传输的时候 会有一些状态值,如Status为1代表删除,为0代表失败或者怎么样的。只传输一个)0或者1过去给第三方(此处不包括给前端),如果没有契约第三方会不认识你这个是什么意思,那我们在平时写业务逻辑的时候使用枚举很轻易就知道了什么状态什么值。所以我们在构建DTO对象的时候里面放一个枚举来表示。首先在阿里的规范里是这样说的:【强制】二方库里可以定义枚举类型,参数可以使用枚举类型,但是接口返回值不允许使用枚举类型或者包含枚举类型的 POJO 对象。那到底为啥不能用呢?枚举首先我们原创 2020-05-10 22:49:36 · 1494 阅读 · 0 评论 -
HashMap源码的解读
此文来自美团技术团队:在此给大家再安利两个网站:1. 美团技术团队博客:https://tech.meituan.com/2016/06/24/java-hashmap.html2. 阿里中间间团队博客:http://jm.taobao.org/HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JD...转载 2020-05-07 22:47:20 · 251 阅读 · 0 评论