java
文章平均质量分 70
赵丙双
这个作者很懒,什么都没留下…
展开
-
猜测、实现 B 站在看人数
猜测、实现 B 站在看人数原创 2024-09-07 18:22:52 · 1588 阅读 · 1 评论 -
spring boot jar 启动报错 Zip64 archives are not supported
spring boot 版本是 2.1.8.RELEASE,引入以下 phoenix 依赖之后启动报错:java.lang.IllegalStateException: Zip64 archives are not supported原创 2024-06-25 18:18:17 · 1027 阅读 · 0 评论 -
SortedMap、NavigableMap
SortedMap、NavigableMap 的方法原创 2024-01-03 18:24:31 · 499 阅读 · 0 评论 -
MySQL 普通查询、流式查询、游标查询以及使用 mybatis 如何实现
MySQL 普通查询、流式查询、游标查询以及使用 mybatis 如何实现原创 2023-03-18 14:54:33 · 6291 阅读 · 0 评论 -
Java 集合及其线程安全的替代
Java 集合及其线程安全的替代原创 2022-07-11 15:35:50 · 255 阅读 · 0 评论 -
JDK 的原子类
JDK 的原子类原创 2022-07-11 11:39:50 · 472 阅读 · 0 评论 -
ArrayBlockingQueue、LinkedBlockingQueue 区别
ArrayBlockingQueue、LinkedBlockingQueue 区别原创 2022-07-06 17:45:56 · 474 阅读 · 0 评论 -
FeignClient 支持占位符及其原理
问题与解决方案在使用 FeignClient 的时候,测试环境和线上环境的域名是不同的,可以使用占位符来动态配置。如下@FeignClient(name = "test-feign", url = "${feign.url}")public interface TestFeignClient { ...}application.propertiesfeign.url=localhost:8080原理坑人的是 FeignClient 的注释中只说了 value、name 支持占位符原创 2021-12-13 17:55:44 · 2737 阅读 · 3 评论 -
Springboot、EasyExcel 发送带附件的邮件
主要依赖<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.11</version></dependency><dependency> <groupId>org.springframework.boot</grou原创 2021-10-18 18:28:02 · 900 阅读 · 0 评论 -
springboot java mail 超时配置不生效
问题最近上线了定时发送电子邮件的功能,是基于 SpringBoot 的。但是经常出现卡死的情况,导致客户频繁咨询客服同志,使用 jstack 查看,发现线程每次都是卡在了如下的地方,很显然 SocketInputStream.socketRead0() 是在等待邮件服务器的响应,但由于某些原因一直没有响应,就会一直卡着。又因为是单线程的模型(xxl-job 的单机串行),所以一个卡着就会导致后面的都无法发送。"Thread-10" #54 prio=10 os_prio=0 tid=0x00005627原创 2021-10-08 21:51:03 · 2018 阅读 · 0 评论 -
Iterator、ListIterator 使用时的注意点
Iterator 是集合框架的重要组成部分,用来封装集合的遍历。ListIterator 扩展了 Iterator,添加了一些针对 List 的方法,比如向前遍历、添加、更新。同时迭代器在使用时会有一些坑。Iterator简介、测试public interface Iterator<E> { /** * 迭代器没有到达末尾则返回 true */ boolean hasNext(); /** * 返回下一个元素,或者抛出异常 NoSuc原创 2021-09-14 00:33:08 · 452 阅读 · 0 评论 -
TemporalAdjusters 与 TemporalAdjuster
TemporalAdjuster 是调整时间对象的策略接口。有两种使用方式,更推荐第二种用法:temporal = thisAdjuster.adjustInto(temporal);temporal = temporal.with(thisAdjuster);public interface TemporalAdjuster { Temporal adjustInto(Temporal temporal);}TemporalAdjusters 实现了一些标准的调整器:本月的第一天原创 2021-08-14 15:14:32 · 493 阅读 · 0 评论 -
Collectors.toMap 报错 NullPointerException
最近线上偶尔会报一个 NPE,是 Collectors.toMap 导致的,这里小记一下,防止再次踩坑。场景:批量查询用户信息,查询结果为 List<User>,然后将其转换成 Map<Integer, String>,以供其他地方使用,但在 Collectors.toMap 时抛出了异常 NullPointerException。复现问题public class ToMapTest { public static void main(String[] args)原创 2021-08-12 21:15:15 · 4314 阅读 · 4 评论 -
IntStream 的方法
上一篇介绍了 Stream 的用法,为了简化基本类型流使用,以及消除频繁自动装箱、拆箱的性能损耗,JDK 提供了三种基本类型的流:IntStream、 LongStream、DoubleStream。本篇将介绍一下 IntStream 中区别于 Stream 的方法。IntStream 中的元素类型是基本类型的 int,所以对应的方法参数从 Predicate、Function、ToLongFunction、Consumer、Supplier… 变成了 IntPredicate、IntFunction、I原创 2021-06-27 19:34:27 · 1463 阅读 · 0 评论 -
Stream 的方法
Stream 中的方法分为三类:静态方法:用于创建流中间操作:通常是将一种流转换成另一种流终止操作:通常是对流中的元素进行计算,得出一个结果流是惰性求值的,只有执行终止操作时才会正在执行计算。创建流empty生成一个空的流public static void empty() { Stream.empty().forEach(System.out::println);}of生成包含指定元素的串行流public static void empty() { Strea原创 2021-06-26 16:13:35 · 2119 阅读 · 0 评论 -
Collections
排序 List:sort// 以自然顺序排序,元素必须实现 Comparable 接口public static <T extends Comparable<? super T>> void sort(List<T> list);// 使用传入的 Comparator 进行比较public static <T> void sort(List<T> list, Comparator<? super T> c);public s原创 2021-06-17 21:44:25 · 198 阅读 · 0 评论 -
Arrays 的方法
排序:sort、parallelSort两种方法都可以排序整个数组或某个范围,parallelSort 会使用 ForkJoin common pool。// 排序整个数组void sort(int[] a);// 排序某个范围,左闭右开void sort(int[] a, int fromIndex, int toIndex)// 数组元素必须实现 Comparable 接口void sort(Object[] a);void sort(Object[] a, int fromIndex原创 2021-06-13 16:39:36 · 267 阅读 · 0 评论 -
Collectors 中的各种方法
Collectors 中提供了很多好用的 Collector 实现,大大提高了我们的生产力,比如,将元素放入 Collection,一些聚合、汇总、分组操作。转集合:toCollection、toList、toSettoCollection() 可以转成任意的 Collection 实现类toList 转成 ArrayListtoSet 转成 HashSetpublic static void main(String[] args) { String[] arr = {"a", "b"原创 2021-06-04 22:25:49 · 2170 阅读 · 1 评论 -
JDK 1.8 Map 新增方法
getOrDefaultV getOrDefault(Object key, V defaultValue)当 Map 中不包含指定的 key 时,返回默认值。Map<String, String> map = new HashMap<>();map.put("k1", null);map.put("k2", "a");String v1 = map.getOrDefault("k1", "v1");String v2 = map.getOrDefault("k2"原创 2021-05-28 18:54:23 · 806 阅读 · 0 评论 -
HashMap 源码详解
概述HashMap 允许 null 的键和值。Hashtable 既不允许 null 的值,也不允许 null 的键。都会抛出 NullPointerException。get put 时间复杂度是常数级别的。HashMap 有两个参数影响其性能:initial capacity 初始容量 和 load factor 负载因子。capacity 指的是 bucket 的数量,即数组的长度。load factor 控制可以满到什么程度,默认为 0.75,较好的权衡了时间与空间成本。当元素的个数超过原创 2021-05-06 19:17:25 · 157 阅读 · 0 评论 -
可变参数的坑
可变参数的坑当不传参时,默认为空数组,不是 null当传入一个 null 时,参数为 null当传入 N(N > 1) 个 null 时,参数为 length 为 N 的数组(数组中都是 null)当传入 N 个对象时,参数为 length 为 N 的数组当直接传入数组时,直接使用原数组总结测试代码public class T { public static void test(Object... args) { System.out.println(Arrays.toS原创 2021-03-28 12:38:58 · 980 阅读 · 0 评论 -
CountDownLatch 的用法
CountDownLatch 的用法方法构造方法 CountDownLatch(int count)countDown()long getCount()await()boolean await(long timeout, TimeUnit unit)两个实例CountDownLatch是一个同步工具类,它使用给定的count初始化,await()方法会一直阻塞,直到计数器的值变为零(由于countDown()方法被调用导致的),这时会释放所有等待的线程,且之后再调用await()方法会直接返回,不会阻塞。原创 2021-01-01 18:22:49 · 10261 阅读 · 3 评论 -
java.util.Properties 的使用
java.util.Properties 的使用方法简介代码示例Properties()、Properties(Properties defaults)load(Reader reader)、load(InputStream inStream)setProperty(String key, String value)getProperty(String key)、getProperty(String key, String defaultValue)propertyNames()、stringPropert原创 2020-12-26 17:14:07 · 1327 阅读 · 1 评论 -
监听器 Listener
ServletContextListener监听ServletContext的创建与销毁,一般是启动或停止服务器时会触发package me.zhao.listener;import javax.servlet.ServletContext;import javax.servlet.ServletContextEvent;import javax.servlet.ServletCont...原创 2019-08-31 16:27:14 · 126 阅读 · 0 评论 -
jvisualvm、jconsole 远程连接阿里云 ECS 中的 JVM
要连接远程 JVM, 需要远程的 Java 程序启动时添加额外的参数。 java -Djava.rmi.server.hostname=123.123.123.123 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.s原创 2020-12-08 22:04:21 · 537 阅读 · 1 评论 -
类、字段、代码块、构造方法的执行顺序
类、字段、代码块、构造方法的执行顺序测试代码执行结果参考测试代码有两个类 Father、Son,其中有实例变量、类变量、构造代码块、静态代码块、构造方法class Father { public Integer test = 100; public int i = test(); private static int j = method(); static { System.out.print("(1)"); } Father()原创 2020-11-29 17:44:43 · 196 阅读 · 0 评论 -
实例变量、构造代码块、构造方法的执行顺序
变量初始化、构造代码块、构造方法的执行顺序单个类的执行顺序父子类的执行顺序本文内容不涉及类加载、静态变量、静态代码块的知识。单个类的执行顺序测试代码public class InitTestFather { private P p1 = new P("父 - 变量1"); { System.out.println("父 - 代码块1"); } public InitTestFather() { System.out.println原创 2020-11-27 20:56:38 · 315 阅读 · 0 评论 -
ArrayList 源码详解 (JDK8)
文章目录类图声明RandomAccess 接口Cloneable 接口Serializable 接口List 接口AbstractList 抽象类属性DEFAULT_CAPACITYEMPTY_ELEMENTDATADEFAULTCAPACITY_EMPTY_ELEMENTDATAelementDatasize构造方法方法trimToSize()容量计算、扩容size()、isEmpty() 、 contains(Object o) 、indexOf(Object o)、lastIndexOf(Object原创 2020-06-07 18:14:57 · 251 阅读 · 0 评论 -
foreach 语法糖的原理
文章目录foreach 语法糖的原理集合 Collection测试代码反编译后的测试代码字节码数组测试代码反编译后的测试代码总结参考foreach 语法糖的原理foreach 是 Java 提供的语法糖,为了方便程序员使用而添加的。本文提供简单的例子说明一下原理。集合 Collection测试代码package me.zhao;import java.util.ArrayList;import java.util.List;public class ListTest { pub原创 2020-05-23 11:17:19 · 568 阅读 · 0 评论 -
HashMap线程不安全的场景
HashMap线程不安全的场景下图为HashMap的部分注解,大体意思是:如果多个线程同时访问HashMap,并且至少有一个线程做了结构上的修改,那么它必须在外部进行同步。 (结构修改是添加或删除一个或多个映射的任何操作;仅仅修改键值不是结构修改。)图片失效请点击put多个线程同时向Node[]的同一个位置插入时,会发生覆盖,只有一个线程的操作会被保留。如下图源码,假如有A、B两个线程...原创 2019-09-06 20:07:10 · 2539 阅读 · 0 评论 -
Java中的有序集合
Java中的有序集合面试的时候经常会被问道这样一个问题:Java集合中哪些是有序的,哪些不是?我们通常的回答是List、LinkedHashMap、LinkedHashSet、TreeMap、TreeSet是有序的,List、LinkedHashMap、LinkedHashSet、LinkedHashSet在遍历时会保持添加的顺序,TreeMap、TreeSet在遍历时会以自然顺序(Compa...原创 2019-09-07 19:59:13 · 25354 阅读 · 0 评论 -
HashMap自定义对象作为键的“失联”问题
HashMap自定义对象作为键的“失联”问题测试参考文章在改变已经存入HashMap的对象o的属性的时候,由于对象的hashCode依赖于对象的属性,所以hashCode同时也被改变了,但是HashMap不会重新计算对象的位置,也就是说这个对象存在了一个错误的位置,导致调用get(o)方法的时候拿到null(因为get方法计算的o的下标变化了,但是o还是存在老下标的位置),或者调用get(非o)...原创 2019-09-09 10:00:59 · 180 阅读 · 0 评论 -
为什么join会阻塞主(父)线程?
问题来源如下测试代码,输出的结果是主线程等待子线程 t 执行完成后,才会打印test,这是为什么? public static void main(String[] args) throws InterruptedException { Thread t = new Thread(() -> { System.out.println("t start"); try { ...原创 2019-09-10 12:21:31 · 3288 阅读 · 3 评论 -
java集合工具类Collections小记
同步集合 synchronizedXXX通过Collections的synchronizedXXX方法可以返回同步的线程安全的List、Set、Map,synchronizedXXX方法的内部实现方式也都比较简单粗暴,是将所有的方法调用以同步块包裹,比如SynchronizedCollection的部分源码如图。图片失效请点击public static <T> Collecti...原创 2019-09-13 15:06:38 · 339 阅读 · 0 评论 -
java的字段能被重写吗?
[TOP]问题的来源在看周志明先生的《深入理解java虚拟机》的时候看到这么一句:在Java语言中字段是无法被重载的,两个字段的数据类型、修饰符不管是否相同,都必须使用不一样的名称,但是对于字节码来讲,如果两个字段的描述符不一致,那字段重名就是合法的。描述符指的是字段的数据类型、方法的参数列表(包括数量、类型以及顺序)和返回值。简单的理解就是Java语言中(也就是我们编码时)字段不能重...原创 2019-09-26 17:26:36 · 1916 阅读 · 0 评论 -
java的switch支持包装类型吗?
TOP我们都知道java的switch支持6种数据类型:int、可以转换为int的byte、char、short以及String和枚举类型。那么支不支持基本类型的包装类型呢?包装类型能放在switch后面吗?下面两段代码都能正常运行并输出 1 ,说明包装类型能够放在switch后。package me.zhao.test;public class TestSwitchInt { ...原创 2019-09-27 17:08:59 · 1728 阅读 · 0 评论 -
java的switch支持String类型的原理
java的switch支持String类型的原理Java的Switch从1.7之后开始支持String类型,那么是怎么做到的那?下面是一个简单的测试,将TestSwitchString.class用javap进行反编译,查看字节码。可以看到在17行先调用了String.HashCode()方法,再执行的switch,switch中的3614、3614恰好是s1、s2的hashCode。这说明J...原创 2019-09-29 09:16:13 · 432 阅读 · 0 评论 -
对List中的对象排序
package me.zhao;public class Student implements Comparable { private String name; private int age; public Student() { super(); } public Student(String name, int age) {...原创 2019-08-26 16:44:35 · 316 阅读 · 0 评论