Java
文章平均质量分 53
灵颖桥人
长风破浪会有时,直挂云帆济沧海。
展开
-
Java Map 的 forEach 函数遍历
入职新公司,查看代码规范的时候,看到一条:“Map 遍历慎用 Map.forEach()”举了一个内网例子:一个 Map<>原创 2021-06-11 23:17:53 · 4345 阅读 · 1 评论 -
http下载服务器本地Excel文件demo
模拟通过 http 下载本地 Excel 数据文件:/** * 模拟下载本地Excel文件 * @param response * @throws IOException */ @GetMapping("/downloadLocal") public void downloadFromLocalFile(HttpServletResponse response) throws IOException { response.setC原创 2021-04-07 17:01:39 · 563 阅读 · 1 评论 -
Java 排序算法之堆排序实现
最大堆的构建:采用直接插入算法,从空堆开始,依次插入各个关键码,时间复杂度为 O(n * log n)。采用筛选法构建堆,可以将时间复杂度降低到 O(n)。筛选法步骤:以最大堆为例,由于最大堆是完全二叉树的一种特殊形式,因此参照完全二叉树的性质,可以将最大堆存储到数组中,用数组下标来表示节点之间的关系。从第一个具有孩子的节点 i =n / 2 -1 开始,如果以这个元素为根的子树已是最大堆,则不需调整,否则需调整子树使之成为堆。继续检查 i - 1,i - 2等节点为根的子树,直到该二叉树的..原创 2021-04-05 15:12:34 · 271 阅读 · 1 评论 -
Java ScheduledExecutorService 使用学习
Java 中的 ScheduledExecutorService 接口用来实现延迟执行或者定时执行的任务。在阅读 RocketMQ 源码(release-4.7.1版本)的过程中,发现很多地方都是使用的 ScheduledExecutorService 来实现定时任务。比如,在 broker 启动过程,BrokerController 类中使用 scheduledExecutorService 执行 broker 启动后的定时任务,比如消息消费偏移量 offset 的持久化定时任务,大致如下...原创 2021-04-03 00:06:15 · 10742 阅读 · 0 评论 -
Java将多种字符串格式解析为Date
项目在解析 Excel 的时候,日期数据可能有多种格式:"2020-10-1"、"2020.10.1"、"2020/10/1"、"2020年10月1日"四种格式,需要解析成 Java 中的 Date 类型。方法一:定义好对应的日期格式数组,如“yyyy-MM-dd”、“yyyy.MM.dd”、“yyyy/MM/dd”、“yyyy年MM月dd日”,循环遍历直到解析得到 Date 返回,所有的格式均解析失败则返回 null。实现参考:java 将多种字符串格式 解析为Date格式方法二:换一原创 2021-03-25 17:29:43 · 1366 阅读 · 0 评论 -
MySQL 日期类型小数秒的处理
一、 MySQL 日期类型对小数秒的支持注:本文所使用MySQL版本为 5.7 版本。官方文档:https://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html1、小数秒位数精度MySQL 支持小数秒的展示,比如官网的例子m在建表时,指定 DATETIME(6)、TIME(3)的位数:CREATE TABLE t1 (t TIME(3), dt DATETIME(6));需要注意的是,MySQL 对小数秒的精度支持最原创 2020-11-06 15:20:10 · 3497 阅读 · 0 评论 -
Java 枚举对象获取Class对象
背景 在写状态机框架的时候,在状态枚举类型上面加了注解,当通过 getClass() 得到 Class 对象得到注解时,有些情况得不到注解。发现是自己对 Java 枚举了解不够导致,特记录一下。定义一个方法 getStateDescField(S s) :从注解@StateConfig指定的字段名称,获取传入 s 对应的字段值。public static <S> Object getStateDescField(S s) { Class clazz = ...原创 2020-09-18 00:37:26 · 3603 阅读 · 0 评论 -
Hutool 封装JDK的对称加密AES算法使用
Hutool Hutool 是一个小而全的Java工具类库,提供了很多常用的工具类。官网:https://www.hutool.cn/docs/#/AES封装 遇到一个场景,透出了业务的订单号,该订单号是由年月日+自增ID拼成,如20200916000066。用户查询订单详情时,本应该根据登录用户的id和订单号去数据库中查询,但是因为历史原因(直接用订单号查询了!)以及一些其他的因素,暂时没能这么做。这样就会有数据泄漏问题,因为很容易构造出一个正确的且数据库内存在的这种...原创 2020-09-16 23:58:06 · 13918 阅读 · 1 评论 -
Java中与Serializable接口相关的一些方法执行顺序
自定义 writeObject 方法和readObject 方法如果在实现Serializable接口的类中自定义 writeObject 方法和readObject 方法,则不会调用默认的方法:package serializable;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;i..原创 2020-09-16 00:19:58 · 547 阅读 · 0 评论 -
JNI 描述符和 Class.forName方法
在手头一个框架开发的时候,遇到了需要处理 JNI 字段或者方法描述符的情况,记录一下JNI描述符(Java Native Interface Descriptors)相关知识。JNI 描述符在Oracle官网上查了一些文档(Java8):https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.3.2https://docs.oracle.com/javase/8/docs/technotes...原创 2020-09-11 00:39:29 · 694 阅读 · 0 评论 -
MapStruct Map 转换成对象
背景 调用公司影像识别服务接口,返回值都是 Map<String,Object>类型。想把这种 map 结果转为项目中对应的JavaBean如DTO 或者 VO,又不想写很多的 dto.setXxx(map.get("xxx")) 的代码。结果 查阅了一下,MapStruct 目前(1.3.1.Final 及之前)的版本暂不支持直接将 map 转换成 JavaBean,很早之前有人在 GitHub提了这个feature(Please ad...原创 2020-08-23 21:59:33 · 12205 阅读 · 8 评论 -
Java中的Map【十二】ConcurrentHashMap 类
所使用的jdk版本为1.8.0_172版本,先看一下 ConcurrentHashMap<K,V> 在JDK中Map的UML类图中的主要继承实现关系: 我们知道Java中的 HashMap 是线程不安全的(比如数组table扩容、put 操作多线程下值覆盖等都会导致数据不一致问题),ConcurrentHashMap 就是为了解决这个问题存在的。Java 8 中的 ConcurrentHashMap 和 HashMap 一样,结构设计都和 Java 7 中...原创 2020-08-15 16:25:44 · 991 阅读 · 0 评论 -
Java Object 的 notify() 方法
我们都知道Java Object 中的 wait()和 notify() 方法可以进行线程间的通信。wait() 方法在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。notify() 方法唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并且根据实现进行选择。线程通过调用其中一个wait方法,在对象的监视器上等待。 这里说的一点就是,调用当前线程 noitfy()...原创 2020-08-08 16:45:31 · 8398 阅读 · 3 评论 -
Java中的Map【十一】TreeMap 类
所使用的jdk版本为1.8.0_172版本,先看一下 TreeMap<K,V> 在JDK中Map的UML类图中的主要继承实现关系:概述 TreeMap<K,V> 是基于红黑树的Navigable接口实现的Map。TreeMap 根据key的自然顺序(参见 java.lang.Comparable 接口)或者根据创建TreeMap时指定的比较器(java.util.Comparator)进行排序存放键值映射,具体取决于使用的构造方法。 ...原创 2020-07-18 19:29:41 · 660 阅读 · 0 评论 -
Java中的Map【十】IdentityHashMap类
所使用的jdk版本为1.8.0_172版本,先看一下IdentityHashMap<K,V> 在JDK中Map的UML类图中的主要继承实现关系:概述 IdentityHashMap 利用哈希表实现Map接口,比较键(和值)时使用引用相等性代替对象相等性。换句话说,在IdentityHashMap中,当且仅当(k1==k2)时,才认为两个键k1和k2相等(在正常Map实现(如HashMap)中,当且仅当满足下列条件时才认为两个键...原创 2020-06-21 13:02:30 · 1048 阅读 · 0 评论 -
Java中的Map【九】WeakHashMap类
所使用的jdk版本为1.8.0_172版本,先看一下 WeakHashMap<K,V> 在JDK中Map的UML类图中的主要继承实现关系:概述 WeakHashMap 是基于 弱引用(WeakReference)类型实现的。在WeakHashMap中,对键K的引用是弱引用类型,当某个键不再正常使用,比如只被弱引用关联时,我们知道此时垃圾回收器会回收该键,此时WeakHashMap将自动移除该键对应的映射条目。null 值和 null 键都被支持。...原创 2020-06-14 19:00:11 · 533 阅读 · 0 评论 -
Java中的引用类型
Java 中的引用类型我们都知道有 强引用、软引用(SoftReference)、弱引用(WeakReference)、虚引用(PhantomReference),除此之外,今天翻看JDK 8 【jdk1.8.0_172】源码时,还看到一种 FinalReference ,只不过这种引用类型是提供给JVM使用的,自己编程写代码用不上的。java.lang.ref 包 Java 中引用相关的类定义在 java.lang.ref 包中,类图如下: Final...原创 2020-06-13 12:56:52 · 313 阅读 · 0 评论 -
Java中的Map【八】LinkedHashMap类
所使用的jdk版本为1.8.0_172版本,先看一下 LinkedHashMap<K,V> 在JDK中Map的UML类图中的主要继承实现关系:概述 从上图中我们可以看到LinkedHashMap是HashMap的子类,在继承HashMap的功能之上,LinkedHashMap主要实现了具有可预知迭代顺序的功能。我们知道HashMap中迭代遍历顺序与我们 put 映射的顺序是无关的,而HashMap提供了两种映射迭代遍历顺序的实现,一是映射的放入顺序,另一种是...原创 2020-06-07 17:30:39 · 787 阅读 · 0 评论 -
Java中的Map【七】HashMap类
所使用的jdk版本为1.8.0_172版本,先看一下 HashMap<K,V> 在JDK中Map的UML类图中的主要继承实现关系:概述 在JDK 1.7 中,HashMap的底层数据结构使用的是 Entry数组 + Entry链表,如果HashMap中的key值数hashCode都一样(极端hash碰撞情况), 那所有数据就会一直都落在同一条Entry链表上, 此时设计初衷为实现快速查找的HashMap就退化为链表, 操作的时间复杂度成为O(n)。JDK 8 中采用N...原创 2020-05-23 19:00:23 · 381 阅读 · 0 评论 -
Java中的Map【六】Hashtable类
所使用的jdk版本为1.8.0_172版本,先看一下 Hashtable<K,V> 在JDK中Map的UML类图中的位置:2.1Hashtable<K,V> 类概述 上图中的继承实现关系不够详尽,先看一下 Hashtable 定义:public class Hashtable<K,V> extends Diction...原创 2020-04-11 18:16:56 · 390 阅读 · 0 评论 -
Java中的Map【五】ConcurrentNavigableMap接口
所使用的jdk版本为1.8版本,先看一下ConcurrentNavigableMap<K,V>在JDK中Map的UML类图中的位置:2.1.5ConcurrentNavigableMap接口 通过对前面NavigableMap接口和ConcurrentMap接口的分析,ConcurrentNavigableMap接口就很简单了,从定义上看,...原创 2019-11-18 13:58:19 · 1785 阅读 · 0 评论 -
Java中的Map【四】ConcurrentMap接口
所使用的jdk版本为1.8版本,先看一下ConcurrentMap<K,V>在JDK中Map的UML类图中的位置:2.1.4ConcurrentMap接口ConcurrentMap<K,V>接口继承Map<K,V>接口,是一种提供线程安全性和原子性保证的Map。分析一下里面的方法:1、非default方法:V putIfAbsent(...原创 2019-11-17 17:11:23 · 910 阅读 · 0 评论 -
Java中的Map【三】NavigableMap接口
所使用的jdk版本为1.8版本,先看一下NavigableMap<K,V>在JDK中Map的UML类图中的位置:2.1.3NavigableMap接口 接口NavigableMap<K,V> extends SortedMap<K,V>,是一个扩展的SortedMap,在继承SortedMap接口的基础之上,扩展了一些返...原创 2019-11-16 19:40:33 · 2383 阅读 · 0 评论 -
Java中的Map【二】SortedMap接口
所使用的jdk版本为1.8版本,先看一下SortedMap在JDK中Map的UML类图中的位置:2.1.2SortedMap接口 SortedMap<K,V>继承Map<K,V>接口,是一个更进一步提供基于键key的总体排序的 Map。该映射是根据其键key的自然顺序(自然排序的定义可以参见java.lang.Comparable接...原创 2019-11-12 16:22:20 · 2257 阅读 · 0 评论 -
Java中的Map【一】Map接口
一 JDK中的Map继承实现关系 不经意间看了Java中LinkedHashMap和LinkedHashSet的源码实现,觉得一些地方还是挺有意思的。之前阅读过一些,但没有进行系统性地总结,打算尝试一下Map源码的系统性整理学习。因为Java中的Set底层基本上是借助对应的Map实现的,故Set打算放在Map之后学习。所使用的jdk版本为1.8版本,先看一下JDK中Map的UML...原创 2019-11-11 18:00:30 · 687 阅读 · 1 评论 -
java 类的对象比较大小以及排序实现方式
java中类的对象比较大小进行排序,不像C++那样可以重载运算符比较大小,java中需要实现特定的接口或者自己给类加上逻辑大小比较函数,个人认为有以下三种方式吧:一、类实现java.util.Comparator<T>接口Comparator中有个接口,如下: int compare(T o1, T o2);比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数...原创 2018-07-11 23:59:07 · 7652 阅读 · 0 评论 -
Java打印对象信息(二)
上一篇我们观察了System.out.println()方式打印简单类对象信息的一些注意事项,本篇我们仍以Person类为例看一下Log4j下对这种对象的处理。《二》采用Log4j打印对象信息: 首先引入Log4j的jar包,本篇采用的是<dependency> <groupId>log4j</groupId> ...原创 2018-08-05 19:15:12 · 11530 阅读 · 0 评论 -
Java打印对象信息(一)
在日常开发中,我们总需要打印日志,记录程序中一些关键对象的信息,大大提高bug的排查速度。但是如果类的设计不规范,这些类的对象信息是不能被Log框架或者System.out.println()语句规范地打印出来的。比如下面这个Person类,这种只有成员变量以及成员变量的get/set函数的类,常被用作VO、DTO、DO等,如果直接按照以下方式,其对象信息打印出来对日志分析基本没有用...原创 2018-08-03 00:04:31 · 36074 阅读 · 7 评论 -
Intellij idea 报错:Error : java 不支持发行版本5
在Intellij idea中新建了一个Maven项目,运行时报错如下:Error : java 不支持发行版本5 本地运行用的是JDK9,测试Java的Stream操作,报错应该是项目编译配置使用的Java版本不对,需要检查一下项目及环境使用的Java编译版本配置。 《1》在Intellij中点击“File” -->“Project Str...原创 2018-09-04 23:47:31 · 331638 阅读 · 205 评论 -
【Java】关于String.intern()函数在JDK8 和 JDK9 下结果不同的问题
今天准备opentalk资料的时候,无意间发现一段很有意思的代码,特此记录一下:/** * @author dxc * @date 2018/11/4 */public class StringInternTest { public static void main(String[] args) { String s = new String("1"); ...原创 2018-11-04 21:42:28 · 3518 阅读 · 3 评论 -
策略模式
策略模式(Strategy):定义了一系列算法家族,将每种算法分别封装起来,使得各种算法之间可以互相替换。策略模式可以让算法的变化不影响使用算法的客户,符合开放-封闭原则(OCP,Open Closed Principle)。 策略模式举例比较多的就是商场打折优惠(原价、打八折、满99减50等)和用户折扣策略(普通用户、白金用户、钻石王老五等)。我们就以商场打折优惠来...原创 2019-04-16 17:00:02 · 224 阅读 · 0 评论 -
【Java】synchronized关键字及其实现原理
Java中关键字synchronized修饰方法或者同步块,它保证多个线程在同一时刻只有一个线程处于被修饰的方法或者同步块中,保证线程对变量访问的可见性和排他性。 synchronized底层是用监视器(monitor)机制实现的。任意一个对象都拥有自己的监视器,当这个对象在同步块被synchronized修饰或者这个对象的方法被synchronized修饰时,执行该区域代...原创 2019-05-26 00:52:56 · 1497 阅读 · 0 评论 -
对象作为HashMap的key
在实际使用中如果遇到对象作为HashMap结构的key,则一定要注意重写equals和hashCode两个方法。以JDK8为例,HashMap在put(K key, V value)方法和containsKey(Object key)方法都会进行当前HashMap中是否已有待放入的key,比如containsKey(Object key)方法: /** * Ret...原创 2019-08-02 23:29:58 · 8279 阅读 · 0 评论 -
JaCoCo覆盖率插件引起的Maven报ArrayIndexOutOfBounds异常问题
最近在执行单元测试的时候,发现一个奇怪的问题:本地Junit的单测单独执行,程序正常;但是在集成了JaCoCo覆盖率插件后,执行maven test命令一直会报ArrayIndexOutOfBounds数组越界异常,查了好久,才找到最终原因。单测代码如下: @Test public void getSingleProductProperty(){ Stri...原创 2019-08-26 22:30:33 · 2542 阅读 · 0 评论 -
Java中Integer与int的分析
注:下文中的测试代码实在JDK9版本下执行的 Integer是int的包装类,一般情况下两者转换有个自动装箱或者拆箱的操作,但要注意的是Integer是一个类,默认值是null,而int是一个基本数据类型,int的默认值是0.下面进行一些简单的测试:1.注意此时的数值选用的是1222,不在-128~127之间(后面会讲到这点);public class MyTest { pu...原创 2018-07-02 23:46:49 · 719 阅读 · 0 评论