![](https://img-blog.csdnimg.cn/20190828162852251.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java
文章平均质量分 74
崔显龙
简约至上
展开
-
后端项目结构管理
结合个人工作经验,对后端项目模块结构管理有一些见解,通过博文记录一下,欢迎各位博友指导。原创 2019-11-03 16:02:00 · 1785 阅读 · 1 评论 -
Java 踩坑记录
当原包装类属性为null时(age==null),拆箱操作导致NullPointerException异常。不同浏览器对数值长度有不同的限制,导致数值会被截取掉部分内容(后面部分二进制位1变成0),最终显示错误。目前没有找到根本解决方案,临时方案是提供String类型字段,将长数值以字符串类型返回给前端展示。Functions是com.google.common.base包中的类,使用了错误的类方法。Integer包装类在遇到操作符==时,会先进行拆箱操作,然后获取实际数值进行比较;原创 2019-11-03 14:52:34 · 1249 阅读 · 1 评论 -
图解ThreadLocal工作原理
多线程操作同一对象情况,如图所示:使用ThreadLocal定义的变量,将指向当前线程本地的一个LocalMap空间。ThreadLocal变量作为key,其内容作为value,保存在本地。多线程对ThreadLocal对象进行操作,实际上是对各自的本地变量进行操作,不存在线程安全问题,如图所示:...原创 2017-12-24 23:11:18 · 1558 阅读 · 1 评论 -
java.util.stream 简介
java.util.stream 是 Java 8 引入的新内容,提供以函数式的风格对流数据进行操作。简单示例:public static void fileStream(Collection<File> files) { Predicate<File> predicate = new Predicate<File>() { @Overr...原创 2017-03-09 06:20:37 · 1149 阅读 · 0 评论 -
SLF4J使用简介
Slf4J(Simple Logging Façade for Java),即简单日志门面,提供统一的日志调用接口,但并未提供相应的具体实现。应用程序启动时,动态绑定具体的日志框架,例如:log4j、logback、java.util.logging等。原创 2017-12-29 12:42:37 · 1780 阅读 · 1 评论 -
Log4j2使用简介
在接口实现中对ServletContext添加了Log4jServletContextListener,log4jConfigLocation默认为/WEB-INF/log4j2.xml。在Servlet 3.0及以后版本中,Servlet提供了ServletContainerInitializer接口,在Servlet容器初始化阶段执行该接口。应用中使用log4j2日志框架,通过适配器,实现log4j2底层转调slf4j接口。应用中使用slf4j日志框架,绑定log4j2作为接口的具体实现。原创 2017-12-28 10:38:03 · 890 阅读 · 0 评论 -
约束校验浅析
使用了表达式语言(Expression Language),依赖于javax.el:javax.el-api.jar和org.glassfish.web:javax-el.jar两个包。在Spring Boot项目中,tomcat-embed-el集成了el和el实现类,因此,不需要pom.xml添加依赖的el相关包。提供对Java Bean Validation的具体实现,并提供额外的约束接口及实现。元素必须是一个数字,其值必须大于等于指定的最小值。元素必须是一个数字,其值必须大于等于指定的最小值。原创 2017-12-29 20:45:05 · 647 阅读 · 0 评论 -
Metrics 简介
定期将Metric Registry对象发送至监控服务器,即定期将其中存放的所有Metric对象发送给监控服务器。记录1次,增加一个计时值duration记录,单位由unit指定;最近1/5/15分钟,每秒mark的指数加权移动平均值;获取75/95/98/99/99.9百分位记录值。自创建Meter时起,平均每秒mark多少次;自创建Meter时起,一共mark多少次;结束计时,记录1次,增加一个计时值记录;获取其中最小值/最大值/中位值/平均值。详见Meter对应方法。获取指定百分位记录值。原创 2018-01-29 16:51:16 · 3837 阅读 · 1 评论 -
Java动态代理
Proxy 利用 InvocationHandler 动态创建一个符合指定接口的代理实例,用于代理某个实现了指定接口的目标类的实例。(2)在 handler 的 invoke 方法中,通过反射机制,调用了目标实例 target 的相应方法,从而完成代理功能;(1)当通过 proxy代理实例 调用某接口方法时,内部实际调用的是 handler 的 invoke 方法;proxy 相当于创建了一个目标类接口的模板,target 则是实现了接口方法的目标类的实例。proxy 表示代理了目标类接口的代理实例。原创 2019-04-24 16:29:30 · 237 阅读 · 0 评论 -
Java 8 日期、时间与格式化
本文目录1 Instant2 ZoneId3 LocalDateTime4 ZonedDateTime5 关系图解6 时间格式化7 相关文章1 InstantInstant 表示基于世界标准时间(UTC)的时间线上的某一个时间点,通常用作事件的时间戳。Instant 取值为 基于世界标准时间 从1970/01/01 00:00:00.000 到 某一...原创 2019-05-13 18:32:50 · 10470 阅读 · 6 评论 -
Java i++ 与 ++i 原理
记得大学期间学习C语言的时候,对于 i++ 和 ++i (i-- 和 --i)的理解,一直似懂非懂的状态,因为很多人给出的解释都不够严谨,比如:i++是在操作之后增加,而++i是在操作之前增加。但是,如何确定“操作”的时间点呢?由于平时使用的时候,没有出现过什么问题,为了代码的可读性,也不会刻意写一些“看似很牛X”的复杂且冗长的代码,这个问题也就没有去深究。今天突然心血来潮,想弄清楚其中的原理,并以此文作为记录。原创 2019-08-30 11:22:29 · 16832 阅读 · 5 评论 -
java.util.concurrent.atomic
本文目录1 Compare And Swap(CAS)2 Atomic1 Compare And Swap(CAS)CAS是一种无锁的非阻塞算法。CAS是一种乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个可以更新变量的值,其它线程都将失败,并继续尝试更新。在CAS中有3个操作数:内存值V,预期旧值A,新值B。当且仅当预期旧值A与内存值...原创 2017-11-27 12:58:29 · 265 阅读 · 0 评论 -
Java内置锁与显式锁浅析
当某种条件不满足的时候,调用相应Condition对象的await方法进入暂停状态,当条件满足时,调用相应Condition对象的signal方法唤醒相应的线程,从而达到精准唤醒的目的。CyclicBarrier 的主要方法为 barrier.await() 方法,所有调用该方法的线程将被阻塞等待,直到所有分支都调用该方法(即await方法被调用 parties 次时),表示所有分支准备就绪,阻塞打开,所有线程继续开始执行各自剩下的逻辑,同时,执行 action 指定的逻辑。原创 2017-02-02 20:56:50 · 605 阅读 · 1 评论 -
try-with-resources 简介
try-with-resources 是 Java 7 引入的一种特殊的 try 语句,允许在使用时,声明一个或多个资源。这些资源,会在 try-with-resources 语句结束时,自动被关闭。在 try-with-resources 中使用的资源,必须实现 java.lang.AutoCloseable 接口。try-with-resources 示例(引自 Java 文档)...原创 2017-03-09 05:33:49 · 537 阅读 · 0 评论 -
Java线程浅析
本文目录1 线程概念2 线程任务3 线程操作4 Executor5 CompletionService1 线程概念运行程序,会使用到CPU、内存等资源。程序将通过“进程”来申请并管理所需要的相关资源。每个“进程”会有一个“主线程”,“线程”使用进程申请来的资源,去执行相关的逻辑操作。“主线程”可以创建其它新的“线程”,多个“线程”可以并行(同时)执行各自的逻辑操作...原创 2017-02-02 05:51:52 · 463 阅读 · 0 评论 -
Eclipse(4.6.2)导出JAR包
本文目录1 项目结构2 导出JAR file3 导出Runnable JAR file1 项目结构com.model.code用于存放代码文件,MainClass类中包含main入口函数。com.model.res.image用于存放图片资源文件,其中有一个logo.png图片。lib目录用于存放第三方JAR文件。sqlite-jdbc-3.19.3.jar是SQ...原创 2017-06-29 00:34:29 · 498 阅读 · 0 评论 -
Java路径问题
本文目录1 绝对路径与相对路径2 常见获取路径方法3 JAR文件内部路径4 打包JAR文件1 绝对路径与相对路径绝对路径:通常从盘符开始的路径(例如:G:/Eclipse/Model)。任何程序通过绝对路径都会“到达”一个相同的位置。相对路径:基于某个“根路径”开始的路径(例如:/Model)。对于不同的根路径,相对路径实际指向不同的位置。当根路径为“G...原创 2017-06-29 01:44:51 · 394 阅读 · 0 评论 -
字符串格式化:Formatter类
若无参数,格式化后的字符串会被存放在一个内部的StringBuffer中,此后,可通过formatter.toString()方法返回格式化后的字符串。若有参数,该参数表示要输出的目标位置,可以是一个StringBuffer对象,一个文件,或一个数据流,此后,格式化的字符串将直接输出到指定位置。表示多个参数对象,其内容将依次对应format中的占位符(格式化说明符),根据指定的内容格式填充到指定位置,从而形成一个满足要求的字符串。(4).precision:对于浮点型数据,表示显示的小数位数;原创 2017-11-20 18:14:39 · 22757 阅读 · 1 评论 -
反射
本文目录1 Class类2 反射1 Class类1.1 引用方式1.1.1 Class引用Class c1= ClassDemo.class;Classc2= Class.forName("demo.cla.ClassDemo");1.1.2 泛化Class引用通过泛化可以指定类型,只有满足要求的类型,才可以赋值。Class<ClassDemo...原创 2017-11-21 16:18:34 · 153 阅读 · 0 评论 -
四种引用类型及引用队列
本文目录1 强引用(StrongReference)2 软引用(SoftReference)3 弱引用(WeakReference)4 幽灵引用/虚引用(PhantomReference)5 引用队列(ReferenceQueue)1 强引用(StrongReference)效果:存在强引用的对象,不会被JVM回收。// 强引用String str = n...原创 2017-11-23 18:17:00 · 7102 阅读 · 1 评论 -
JVM调优
新创建的对象都会保存在Young Memory的Eden Memory中,满足一定条件的对象会被移至Young Memory的Survivor Memory中,进而再晋级至Tenured Memory中。所以,一般会将Total Memory设置与Max Memory相等,即不设置伸缩区,以减少从伸缩区申请和释放内存带来的开销。在一个良好的设计下,程序本身的优劣就决定了性能的高低。排除设计和程序层面的原因,出现性能问题时,可以通过一些系统参数设置,以匹配现实情况,使得资源使用最优化,从而提升性能。原创 2017-11-23 21:00:19 · 220 阅读 · 0 评论 -
try-catch-finally执行顺序及多return语句效果
文本内容1 执行过程2 return语句1 执行过程2 return语句规则:(1)根据执行过程,最后一个执行的return语句生效;(2)执行return语句时,返回值就已被确定,后续对相应变量的修改将无效。// 返回值:4public static int testFinally() { int a = 1; try { ...原创 2017-11-25 12:58:08 · 669 阅读 · 0 评论 -
HashMap、HashTable、ConcurrentHashMap
本文目录1 HashMap2 HashTable3 ConcurrentHashMap1 HashMap1.1 工作原理存入操作(put)(1) 调用key对象的hashCode()方法计算HashCode值;(2) 根据HashCode值确定数组位置;(3) 根据数组位置情况: ① 若为空(未冲突),直接将Entry对象(key-value对象)...原创 2017-11-26 12:29:49 · 228 阅读 · 0 评论 -
RMI 浅析
RMI是Remote Method Invocation的简称,即远程方法调用。通过RMI,Client可以调用Server的方法。首先,Server生成Stub和Skeleton,用于描述方法和解析方法调用。然后,Client获取Stub,即获取Server提供的方法的描述,从而知道Server提供了哪些方法及相应的参数(如图:步骤1)。接着,Client通过Stub调用Server的方法(如图:步骤2),调用信息被传递到Server(如图:步骤3),由Server的Skeleton解析。原创 2017-02-27 00:38:26 · 3557 阅读 · 1 评论