Java
文章平均质量分 84
wuychn
这个作者很懒,什么都没留下…
展开
-
时间轮
什么是时间轮直接上图:上面是一张时间轮的示意图,可以看到,这个时间轮就像一个钟表一样,它有刻度,图中画了9个格子,每个格子表示时间精度,比如每个格子表示1s,那么转一圈就是9s,对于钟表上的秒针来说它的最小刻度是1s,秒针转一圈就是60s。时间轮上每个格子储存了一个双向链表,用于记录定时任务,当指针转到对应的格子的时候,会检查对应的任务是否到期,如果到期就会执行链条上的任务。为什么使用时间轮我认为这个世界上任何事物的出现都有它的原因,只是大部分事物我们都无法找到它的原因而已,好在技术的出原创 2022-04-29 15:29:04 · 1338 阅读 · 0 评论 -
DelayQueue原理及应用场景
DelayQueue的原理DelayQueue是一个使用优先级队列实现的无界阻塞队列,加入其中的元素必需实现Delayed接口。当调用put之类的方法加入元素时,会触发接口中的compareTo方法进行排序,也就是说队列中元素的顺序是按到期时间排序的(当然,compareTo方法需要我们自己去实现,如果实现不当,可能导致队头元素是没有过期的,而其他元素可能已经过期了),而非它们进入队列的顺序。排在队列头部的元素是最早到期的,越往后到期时间赿晚。没有过期元素的话,使用poll()方法会返回null值,超时原创 2021-12-31 14:04:44 · 950 阅读 · 0 评论 -
线程池是如何重复利用空闲的线程来执行任务的
在Java开发中,经常需要创建线程去执行一些任务,实现起来也非常方便,但如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。此时,我们很自然会想到使用线程池来解决这个问题。使用线程池的好处降低资源消耗。java中所有的池化技术都有一个好处,就是通过复用池中的对象,降低系统资源消耗。设想一下如果我们有n多个子任务需要执行,如果我们为每个子任务都创建一个执行线程,而创建线程的过程是需要一定的系统消耗的,最后肯原创 2021-09-05 14:55:52 · 930 阅读 · 0 评论 -
java.util.BitSet
我们已经了解了BitMap,在Java中已经提供了BitMap的实现,即java.util.BitSet类。BitSet内部维护了一个long型的数组,long的大小是8 Byte,即 64 位,所以每个元素可以存储64个数字: /** * The internal field corresponding to the serialField "bits". */ private long[] words;存储元素: /** * Set.原创 2021-07-22 15:34:39 · 421 阅读 · 0 评论 -
hashCode真的是内存地址吗
本文内容基于 JAVA 8 HotSpot原创 2021-06-15 17:00:57 · 1114 阅读 · 0 评论 -
【Java 7】数字字面量的改进
Java 7之前支持十进制、八进制、十六进制,Java 7新增了对二进制的支持。另外,Java 7支持在数字中使用下划线(_)作为分隔符,如(1_000_000)。注意:下划线仅仅能在数字中间,编译时编译器自己主动删除数字中的下划线。 public static void main(String[] args) { int a = 15; // 二进制 ...原创 2018-10-12 13:22:39 · 124 阅读 · 0 评论 -
【Java 7】switch支持String类型
Java 7之前的版本中,switch语句支持的数据类型有byte、short、int、char和枚举类型,在Java 7中,增加了对String类型的支持: public static void main(String[] args) { String gender = "1"; String genderDes = ""; switc...原创 2018-10-12 11:03:39 · 12082 阅读 · 0 评论 -
【Java 8】使用 Java 8 的流获取 List 中的重复元素
直接看代码:public class ListDuplicate { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("hello"); list.add("hello"); ...原创 2018-12-14 10:06:34 · 14190 阅读 · 2 评论 -
【Java 8】新的日期时间API
本文参考书籍《Java 8实战》,陆明刚、劳佳 译,如有侵权,请联系删除!在Java 1.0中,对日期和时间的支持只能依赖java.util.Date类。正如类名所表达的,这个类无法表示日期,只能以毫秒的精度表示时间。更糟糕的是它的易用性,由于某些原因未知的设计决策,这个类的易用性被深深地损害了,比如:年份的起始选择是1900年,月份的起始从0开始。这意味着,如果你想要用Date表示Java...原创 2018-10-09 16:49:31 · 744 阅读 · 0 评论 -
【Java 8】使用Optional取代null
本文参考书籍《Java 8实战》,陆明刚、劳佳 译,如有侵权,请联系删除!如何为缺失的值建模假设你需要处理下面这样的嵌套对象,这是一个拥有汽车及汽车保险的客户。 public class Person { private Car car; public Car getCar() { return car; } } public...原创 2018-10-09 11:32:48 · 458 阅读 · 0 评论 -
【Java 8】默认方法
本文参考书籍《Java 8实战》,陆明刚、劳佳 译,如有侵权,请联系删除!默认方法简介我们知道,实现接口的类必须为接口中定义的所有抽象方法提供一个实现,如果向接口中加入了新的方法,那么实体类为了适配新的接口约定也需要进行修改。由于Java 8的API在现存的接口上引入了非常多的新方法,这种变化带来的问题也愈加严重:所有实现类都需要进行修改,这对程序员来说简直就是灾难!Java 8为了...原创 2018-10-09 10:53:42 · 772 阅读 · 0 评论 -
【Java 8】流(Stream API)
本文参考书籍《Java 8实战》,陆明刚、劳佳 译,如有侵权,请联系删除!在本章中,我们会使用这样一个例子:一个menu,它是一张菜肴列表: List<Dish> menu = Arrays.asList ( new Dish("pork", false, 800, Dish.Type.MEAT), new Dish("beef", f...原创 2018-10-08 10:44:06 · 1725 阅读 · 1 评论 -
【Java 8】Lambda表达式
本文参考书籍《Java 8实战》,陆明刚、劳佳 译,如有侵权,请联系删除!我们了解了利用行为参数化来传递代码有助于应对不断变化的需求,它允许我们定义一个代码块来表示一个行为,然后传递它。但我们也看到,使用匿名类来表示不同的行为并不令人满意:代码十分啰嗦。在本章中,我们会学习Java 8中解决这个问题的新工具——Lambda表达式。它可以很简洁地表示一个行为或传递代码。现在我们可以把Lamb...原创 2018-09-30 14:28:03 · 21875 阅读 · 2 评论 -
【Java 8】行为参数化
本文参考书籍《Java 8实战》,陆明刚、劳佳 译,如有侵权,请联系删除!行为参数化就是可以帮助你处理频繁变更的需求的一种软件开发模式。一言以蔽之,它意味着拿出一个代码块,把它准备好却不去执行它。这个代码块以后可以被你程序的其他部分调用,这意味着你可以推迟这块代码的执行。例如,你可以将代码块作为参数传递给另一个方法,稍后再去执行它。这样,这个方法的行为就基于那块代码被参数化了。应对...原创 2018-09-30 11:10:12 · 740 阅读 · 0 评论 -
synchronized的实现原理
https://www.cnblogs.com/paddix/p/5367116.html原创 2019-06-15 16:13:46 · 133 阅读 · 0 评论 -
Java并发之AQS详解
一、概述谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock、Semaphore、CountDownLatch等。二、框架它维护了一个volat...原创 2019-03-01 10:50:21 · 2006 阅读 · 1 评论 -
使用POI导出千万数据到Excel
一、导出导出的Excel可以有两种格式:Excel 2003、Excel 2007,二者的每个sheet下的行列限制如下:版本 行数 列数 生成文件后缀 2003 65536 256 .xls 2007 1048576 16384 .xlsx 当在POI中使用HSSF对象时,导出的Excel版本是2003版本,Excel 2...原创 2020-02-17 22:07:43 · 2662 阅读 · 0 评论 -
Java字节码增强
原文地址:https://mp.weixin.qq.com/s/Wa4JKQ5NAN_4_TVSO67ehQ一、字节码1.1 什么是字节码Java之所以可以“一次编译,到处运行”,一是因为JVM针对各种操作系统、平台都进行了定制,二是因为无论在什么平台,都可以编译生成固定格式的字节码(.class文件)供JVM使用。因此,也可以看出字节码对于Java生态的重要性。之所以被称之为字节码,...原创 2020-04-27 11:18:56 · 1399 阅读 · 0 评论 -
HashMap为什么是线程不安全的⭐
https://blog.csdn.net/loveliness_peri/article/details/81092360主要是同一个hashmap在多线程情况下执行扩容方法后,再去调用Get方法可能会发生死循环的。原创 2020-04-27 17:21:00 · 140 阅读 · 0 评论 -
Executors创建的四种线程池
1、newCachedThreadPool只要有任务就会创建新线程处理,但是如果有空闲线程就会进行重用。corePoolSize为0,maxPoolSize为Integer.MAX_VALUE,workQueue是SynchronousQueue实现。public static ExecutorService newCachedThreadPool() { return ...原创 2020-02-29 21:23:49 · 218 阅读 · 0 评论 -
Java类之间的关系
类与类之间主要有6种关系,他们分别是:依赖、关联、聚合、组合、继承、实现。他们的耦合度依次增强。一、依赖(Dependence)依赖关系的定义为:对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。定义比较晦涩难懂,但在java中的表现还是比较直观的:类A当中使用了类B,其中类B是作为类A的方法参数、方法中的局部变量...原创 2020-01-18 13:21:26 · 862 阅读 · 1 评论 -
Java 中的队列 Queue
一、队列的定义队列(Queue)是一种先进先出(FIFO)的数据结构,Java中定义了java.util.Queue接口用来表示队列。Java中的Queue与List、Set属于同一个级别接口,它们都继承于Collection接口。Java中还定义了一种双端队列java.util.Deque,常用的LinkedList就实现了Deque接口。我们看一下Queue和Dequeue的定义:Qu...原创 2019-11-22 15:04:08 · 1664 阅读 · 0 评论 -
SynchronousQueue
BlockingQueue之ArrayBlockingQueue和LinkedBlockingQueueSynchronousQueue是一个双栈双队列算法,无空间的队列或栈,任何一个对SynchronousQueue写需要等到一个对SynchronousQueue的读操作,反之亦然。SynchronousQueue更像是一个数据交换通道,生产者和消费者是需要组队完成工作,缺少一个将会阻塞线程...原创 2019-08-27 17:41:36 · 344 阅读 · 0 评论 -
线程池中workQueue的三种类型的区别
一、SynchronousQueueSynchronousQueue没有容量,是无缓冲等待队列,是一个不存储元素的阻塞队列,会直接将任务交给消费者,必须等队列中的添加元素被消费后才能继续添加新的元素。使用SynchronousQueue阻塞队列一般要求maximumPoolSizes为无界,避免线程拒绝执行操作。二、LinkedBlockingQueueLinkedBlockingQu...原创 2019-08-27 17:16:16 · 3149 阅读 · 5 评论 -
面向对象思想的基本原则
年前阿里面试,问到基本原则,答不出,故整理。面向对象思想的基本原则有:单一职责原则、开闭原则、里氏替换原则、依赖注入原则、接口分离原则和迪米特原则。单一职责原则其实就是常说的“高内聚、低耦合”。也就是说,每一个类应该只有一个职责,对外只能提供一种功能,而引起类变化的原因应该只有一个。在设计模式中,所有的设计模式都遵循这一原则。开闭原则核心思想是:一个类对扩展开发,对修改关闭。即...原创 2019-03-14 18:25:11 · 220 阅读 · 0 评论