
javase
文章平均质量分 60
JavaEdge聊AI
关注并私信我,获取更多大厂求职经验。《编程严选网》创始人
展开
-
Java集合运算实现集合的交、并、差集
【代码】Java集合运算实现集合的交、并、差集。原创 2024-04-02 16:13:08 · 400 阅读 · 1 评论 -
JDK21新特性Record Patterns记录模式详解
通过使用记录模式来增强Java编程语言,以解构记录值。记录模式和类型模式可嵌套使用,从而实现强大、声明式和可组合的数据导航和处理形式。原创 2023-09-25 16:09:07 · 810 阅读 · 0 评论 -
JDK21最终版协程实现之虚拟线程
虚拟线程是轻量级线程,极大地减少了编写、维护和观察高吞吐量并发应用的工作量。这是一个预览API。基于协程的线程,与其他语言中的协程有相似之处,也有不同。虚拟线程是依附于主线程的,如果主线程销毁了,虚拟线程也不复存在。原创 2023-09-24 23:29:18 · 5544 阅读 · 4 评论 -
Java的checked exception有意义吗?
这种异常必须在编译前就try/catch,又不一定会抛异常,小项目中不明显,大项目中,会造成不必要代码臃肿和可读性降低,完全可在编译出错时,通过单元测试和调试,得到正确代码。这设计还有啥意义?Checked Exception初衷很好,但事实上是没啥卵用设计。原创 2023-09-18 23:36:11 · 921 阅读 · 0 评论 -
@RequiredArgsConstructor(onConstructor=@_(@Autowired))是什么语法?
在我们写controller或者Service层的时候,需要注入很多的mapper接口或者另外的service接口,这时候就会写很多的@AutoWired注解。写在类上可以代替@AutoWired注解,需要注意的是在注入时需要用final定义,或者使用@notnull注解。这是 Lombok 语法糖写法。原创 2023-09-11 21:18:26 · 628 阅读 · 0 评论 -
JDK21新特性:虚拟线程正式发布及十多项新特性
Java 21进入发布候选阶段,其中包括15个最终特性,包括虚拟线程、分代Z垃圾收集器和密钥封装机制API。JDK21计划于9月19日作为Oracle标准Java实现的下一个LTS版本发布,已进入发布候选(RC)阶段。Java 21将具有15个新特性,之前提议的第16个特性实验性Shenandoah垃圾收集器已在6月被舍弃。进入终版的15个特性涵盖从字符串模板和结构化并发预览,到虚拟线程和密钥封装机制(KEM)API等。JDK 21于7月20日进入了第二阶段渐进开发,在6月8日首次渐进开发后。原创 2023-08-22 16:18:24 · 2915 阅读 · 8 评论 -
大厂原来都这么使用IDEA远程调试的!
总之,远程调试是一项非常有用的技术,它可以帮助我们快速诊断和解决问题。使用IDEA进行远程调试是一个相对简单而又强大的方法,它可以帮助我们更快地开发和维护我们的应用程序。希望这篇技术博客能够对你有所帮助!原创 2023-08-01 23:07:03 · 645 阅读 · 0 评论 -
-jar和 javaagent命令冲突吗?
命令是用于运行打包为 JAR 文件的 Java 应用程序的快捷方式。它会忽略其他命令行选项并直接运行 JAR 文件的主类。命令运行 Java 应用程序时,Java 虚拟机 (JVM) 会忽略任何设置的。命令来运行应用程序。是你想要使用的代理程序的 JAR 文件,命令会覆盖其他命令行选项,包括。是你的应用程序的 JAR 文件。原创 2023-07-26 15:46:41 · 1059 阅读 · 0 评论 -
查看、切换JDK版本及其安装目录
【代码】查看、切换JDK版本及其安装目录。原创 2020-10-20 14:31:09 · 1942 阅读 · 0 评论 -
想要精通Java8编程?学会Predicate接口,轻松搞定条件判断!
Java8中的Predicate接口是一个强大的工具,可以让你轻松进行条件判断。本文将详细介绍Predicate接口的用法,包括如何创建和组合Predicate,以及如何将它们用于集合过滤和流操作。掌握Predicate接口,让你的Java8编程更加高效、简洁!原创 2023-06-28 09:41:13 · 684 阅读 · 0 评论 -
Java元组实现库javatuples详解
元组可以看作是不同类型对象的有序集合。这些对象不一定以任何方式相互关联,但它们共同具有某种意义。例如,可以是一个元组,其中元组中的每个值都没有任何关系,但是这整套值在应用程序中可能具有某种意义。例如,给定元组可能代表具有姓名、部门和年龄的员工数据。原创 2023-03-13 14:40:55 · 1903 阅读 · 0 评论 -
深入理解Disruptor
Java基础库里面的BlockingQueue,都要通过显示地加锁来保障生产者之间、消费者之间,乃至生产者和消费者之间,不会发生锁冲突的问题。但加锁会大大拖慢性能。获取锁时,CPU没有执行计算相关指令,而要等待os或JVM进行锁竞争裁决。那些没有拿到锁而被挂起等待的线程,则需上下文切换。这上下文切换,会把挂起线程的寄存器里的数据放到线程的程序栈。即加载到高速缓存里面的数据也失效了,程序就变得更慢。RingBuffer采用无锁方案,通过CAS进行序号自增和对比,使CPU无需获取os锁。原创 2023-01-13 18:59:58 · 1584 阅读 · 0 评论 -
IDEA自动生成serialVersionUID
设置自动生成 serialVersionUID 的方式如下图所示。原创 2022-09-26 17:20:26 · 750 阅读 · 0 评论 -
Java反转List,逆序打印
【代码】Java反转List,逆序打印。原创 2022-09-03 15:25:37 · 368 阅读 · 0 评论 -
IDEA告警详解:Optional.isPresent can be replaced with functional-style expression
类似 if(Optional.isPresent()) 的条件语句,可以被重写成函数式风格。if (!response.isPresent()) { return Result.success(null);} else { return Result.success(response.get());}response.map(Result::success) .orElseGet(() -> Result.success(null));...原创 2022-05-09 11:57:42 · 1217 阅读 · 1 评论 -
Timestamp.valueOf API 使用详解
将使用 JDBC 时间戳转义格式的 String 对象转换为 Timestamp 值。Timestamp date = Timestamp.valueOf("2022-04-19 00:00:00");System.out.println(date);输出结果:2022-04-19 00:00:00.0原创 2022-04-19 15:07:37 · 1226 阅读 · 0 评论 -
Arrays.asList() vs Collections.singletonList()
与 Collections.singletonList(something) 相比,使用 Arrays.asList(something) 来制作一个列表是否有优势(或有很大的不同)?后者也使返回的列表不可变。Collections.singletonList(sth)不可变Arrays.asList(sth)是 Array 的固定大小的 List 表示,其中 List 和 Array 在堆中连接Arrays.asList(something) 允许对其进行非结构性更改,这会反映到 Li原创 2022-04-10 14:44:24 · 979 阅读 · 1 评论 -
IDEA告警:Unnecessary unboxing ‘xxx.intValue()‘
显式编码拆箱已包装的原始数值。在Java5及以上的版本,拆箱是不必要的,可以安全地删除。那么 JDK5 到底做了啥?自动装箱(auto-boxing)与自动拆箱(auto-unboxing)Java语言的基本类型都有包装(wrapper)类型。需要包装类型,是因为许多Java核心类库的API都是面向对象。如Java的容器类,就只支持引用类型。当需要一个能存储数值的容器类时,往往定义一个存储包装类对象的容器。对基本类型的数值,需先将其转换为对应包装类,再存入容器。在Java程序中,这个转换可显式,也可隐原创 2022-04-06 18:01:04 · 4012 阅读 · 1 评论 -
Java8原子弹类之LongAdder源码分析
Java8原子弹类之LongAdder源码分析JDK 8开始,针对Long型的原子操作, Java又提供了LongAdder. LongAccumulator; 针对Double类型,Java提供了DoubleAdder、DoubleAccumulator。Striped64 UMLAtomicLong内部是一个volatile long型变量,由多个线程对这个变量进行CAS操作。多个线程同时对一个变量进行CAS操作,在高并发场景下仍不够快,若再提高性能,咋办?把一个变量拆成多份,变为多个变量,类原创 2022-01-24 23:49:17 · 2177 阅读 · 5 评论 -
Java编程最佳实践之多态
文章目录第九章 多态向上转型回顾忘掉对象类型转机方法调用绑定产生正确的行为可扩展性陷阱:“重写”私有方法陷阱:属性与静态方法构造器和多态构造器调用顺序继承和清理构造器内部多态方法的行为协变返回类型使用继承设计替代 vs 扩展向下转型与运行时类型信息本章小结第九章 多态曾经有人请教我 “ Babbage 先生,如果输入错误的数字到机器中,会得出正确结果吗?” 我无法理解产生如此问题的概念上的困惑。 —— Charles Babbage (1791 - 1871)多态是面向对象编程语言中,继数据抽象原创 2022-01-10 17:55:38 · 1066 阅读 · 0 评论 -
TreeSet 核心源码解析
我的人生就像在白夜里走路。——东野圭吾《白夜行》0 前言上篇我们分析了HashSet,它是组合了 HashMap 实现的,那TreeSet会是怎么实现的呢?没错!组合 TreeMap 实现.1 继承体系继承了抽象类AbstracSet,方便扩展 实现的 SortedSet,解锁如下方法 实现 NavigableSet 接口,和 NavigableMap 接口类似,...原创 2020-04-12 20:49:33 · 1662 阅读 · 1 评论 -
跟面试官讲解CountDownLatch源码设计原理
1 基本设计一种同步辅助,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。CountDownLatch 是用给定的 count 初始化的。由于调用了countDown()方法,await 方法阻塞,直到当前计数为零,之后释放所有等待线程,并立即返回任何后续的 await 调用。这是一种一次性现象——计数无法重置。如果需要重置计数的版本,可以考虑使用CyclicBarrier。CountDownLatch 是一种通用的同步工具,可以用于多种用途。count为1时初始化的CountDownLa原创 2020-05-19 22:10:59 · 1598 阅读 · 3 评论 -
Java8的TreeMap源码解析
突然看源码估计看不懂.不急,喝口红牛,我们先看图首先庖丁解牛,类似于如何把大象装入冰箱,分三步走:以排序二叉树的方式新增节点因为红黑树首先本身就是一个排序二叉树标记它为红色如果设为黑色,就会导致根到叶的路径上有一条路上,多一个额外的黑节点,打破性质 5,这个很难调整但设为红色节点后,可能会导致出现两个连续红色节点的冲突,那么可以通过颜色调换(color flips)和树旋转调整...原创 2020-12-29 20:57:09 · 1174 阅读 · 0 评论 -
在阿里面试官面前现场手撕DelayQueue源码!
如果不想在世界上虚度一生,那就要学习一辈子。——高尔基0 前言延迟元素的无边界阻塞队列,在该队列中,仅当元素的延迟到期时才可以使用它.队首是该 Delayed 元素,其延迟在过去最远过期.如果没有延迟已经过期,就没有head, poll将返回null.当元素的getDelay(TimeUnit.NANOSECONDS)方法返回的值小于或等于零时,就会发生过期.即使未到期的元素无...原创 2020-05-03 02:52:28 · 3384 阅读 · 7 评论 -
终于有人能把Thread讲清楚了
1 类注释程序中执行的线程。JVM允许应用程序拥有多个并发运行的执行线程。每个线程都有一个优先级。优先级高的线程优先于优先级低的线程执行。每个线程可能被标记为守护线程,也可能不被标记为守护线程。当在某个线程中运行的代码创建一个新 Thread 对象时,新线程的优先级最初设置为创建线程的优先级,并且只有在创建线程是一个守护线程时,新线程才是守护线程。当JVM启动时,通常有一个非守护的线程(它...原创 2020-05-04 03:17:35 · 3648 阅读 · 3 评论 -
和阿里面试官对线FutureTask源码面试
1 引导语研究源码,一般我们都从整体以及实例先入手,再研究细节,不至于一开始就“深陷其中而"当局者迷".本文,我们来看最后一种有返回值的线程创建方式。使用继承方式的好处是方便传参,可以在子类里面添加成员变量,通过 set 方法设置参数或者通过构造函数进行传递使用 Runnable 方式,则只能使用主线程里面被声明为 final 变量不好的地方是 Java 不支持多继承,如果继承了 Thread 类,那么子类不能再继承其他 ,而 Runable接口则没有这个限制 。而且 Thread 类和 Ru原创 2020-05-25 22:36:29 · 1673 阅读 · 0 评论 -
连LinkedBlockingQueue源码都没看过,我怎么敢给你offer?
孤独,所有人都是孤独的,没有人能独自超脱这一切。——玛娅·安杰格0 前言LinkedBlockingQueue - 单链表实现的阻塞队列。该队列按 FIFO(先进先出)排序元素,新元素从队列尾部插入,从队首获取元素.是深入并发编程的基础数据结构.1 继承体系Queue 作为最基础的接口,定义了队列的三大类基本操作:BlockingQueue 即在 Queue 的基础...原创 2020-04-19 23:05:46 · 2340 阅读 · 7 评论 -
AtomicInteger 核心源码解析
原子类使用 CAS 替代锁,实现基本类似,我们本文以 AtomicInteger 为例来研究其究竟是如何实现无锁同步的.前言一个可以自动更新的int值。 AtomicInteger用于原子递增计数器之类的应用程序,并且不能用作Integer的替代品。 但是,此类确实继承了Number,以允许处理基于数字的类的工具和实用程序进行统一访问。继承关系继承关系easy由于继承了 Numbe...原创 2020-05-06 01:20:00 · 1758 阅读 · 3 评论 -
华为技术专家深度解析Java线程状态
0 线程状态概述分类6个状态定义: java.lang.Thread.StateNew: 尚未启动的线程的线程状态。Runnable: 可运行线程的线程状态,等待CPU调度。Blocked: 线程阻塞等待监视器锁定的线程状态。处于synchronized同步代码块或方法中被阻塞。Waiting: 等待线程的线程状态。下 列不带超时的方式:Object.wait、Thread.join、 LockSupport.parkTimed Waiting:具有指定等待时间的等待线程的线程状态。下原创 2021-04-15 13:47:21 · 7393 阅读 · 17 评论 -
和阿里面试官扯了半小时ArrayBlockingQueue源码
最聪明的人是最不愿浪费时间的人。——但丁0 前言由数组支持的有界阻塞队列。此队列对元素按 FIFO(先进先出)进行排序。队首是已在队列中最长时间的元素。队尾是最短时间出现在队列中的元素。新元素插入到队列的尾部,并且队列检索操作在队列的开头获取元素。这是经典的“有界缓冲区”,其中固定大小的数组包含由生产者插入并由消费者提取的元素。一旦创建,容量将无法更改。试图将一个元素放入一个完整的队列...原创 2020-04-23 20:03:16 · 5932 阅读 · 0 评论 -
【死磕JDK源码】ThreadPoolExecutor源码保姆级详解
位运算表示线程池状态,因为位运算是改变当前值的一种高效手段。线程池状态Integer 有32位:最右边29位表工作线程数最左边3位表示线程池状态,可表示从0至7的8个不同数值线程池的状态用高3位表示,其中包括了符号位。五种状态的十进制值按从小到大依次排序为:RUNNING < SHUTDOWN < STOP < TIDYING <TERMINATED这就能通过比较值的大小来确定线程池的状态。例如程序中经常会出现isRunning的判断:000-11111原创 2021-07-13 16:42:23 · 3092 阅读 · 15 评论 -
看完这篇ConcurrentHashMap源码解析,我又觉得能手撕面试官了
11q原创 2020-04-16 22:47:33 · 2335 阅读 · 10 评论 -
Java源码解析系列-ThreadLocal(不看血亏)
1 前言此类提供线程本地变量。这些变量与普通变量不同,因为每个访问一个变量(通过其get或set方法)的线程都有其自己的,独立初始化的变量副本。 ThreadLocal 实例通常是期望将状态与线程(例如,用户ID或事务ID)关联的类中的 private static 字段。例如,下面的类生成每个线程本地的唯一标识符。线程的ID是在第一次调用ThreadId.get() 时赋值的,并且在以后...原创 2020-05-07 23:11:02 · 1786 阅读 · 1 评论 -
讲完CopyOnWriteArrayList源码,面试官当场给我发了offer
正在上传…重新上传取消我不停奔跑只为追赶当年被寄予厚望的自己。——利文斯顿0 前言我们知道 ArrayList 非线程安全,需要自己加锁或者使用Collections.synchronizedList包装.从JDK1.5开始JUC里提供了使用 CopyOnWrite 机制实现的并发容器线程安全的 List - CopyOnWriteArrayList,简称 COW1 C...原创 2020-04-12 22:33:56 · 2123 阅读 · 5 评论 -
JDK源码解析之AbstractQueuedSynchronizer
AbstractQueuedSynchronizer 抽象同步队列简称 AQS ,它是实现同步器的基础组件,并发包中锁的底层就是使用 AQS 实现的.大多数开发者可能永远不会直接使用AQS ,但是知道其原理对于架构设计还是很有帮助的,而且要理解ReentrantLock、CountDownLatch等高级锁我们必须搞懂 AQS.1 整体感知1.1 架构图AQS框架大致分为五层,自上而下由浅入深,从AQS对外暴露的API到底层基础数据.当有自定义同步器接入时,只需重写第一层所需要的部分方法即可,原创 2020-05-09 09:30:47 · 1702 阅读 · 0 评论 -
教面试官ReentrantLock源码
学习完 AQS,本文我们就来研究第一个 AQS 的实现类:ReentrantLock。1 基本设计ReentrantLock 可重入锁,可重入表示同一个线程可以对同一个共享资源重复的加锁或释放锁。具有与使用 synchronized 方法和语句访问的隐式监视器锁相同的基本行为和语义的可重入互斥锁,但具有扩展功能。ReentrantLock 由最后成功锁定但尚未解锁的线程所拥有。当另一个线程不拥有该锁时,调用该锁的线程将成功返回该锁。如果当前线程已经拥有该锁,则该方法将立即返回。可以使用 isHeld原创 2020-05-17 16:32:45 · 1653 阅读 · 5 评论 -
Java 集合源码解析 - ConcurrentHashMap(JDK7)
ConcurrentHashMap是线程安全且高效的HashMap1 为什么要使用ConcurrentHashMap线程不安全的HashMapHashMap是Java中最常用的一个Map类,性能好、速度快,但不能保证线程安全,它可用null作为key/valueHashMap的线程不安全主要体现在resize时的死循环及使用迭代器时的fast-fail在多线程环境下,使用HashMap...原创 2019-01-11 14:15:31 · 1026 阅读 · 0 评论 -
ArrayList与Vector比较
这张图里的内容对我们学习Java来说,非常的重要,白色的部分是需要去了解的,黄色部分是我们要去重点了解的,不但要知道怎么去用,至少还需要读一次源码。绿色部分内容已经很少用了,但在面试题中有可能会问到,我们来看一个经常出现的面试题:Arraylist与Vector的区别是什么?首先我们给出标准答案: 1、Vector是线程安全的,ArrayList不是线程安全的。 2、ArrayList在底层数组原创 2017-08-18 20:14:00 · 4670 阅读 · 0 评论 -
线程方法:sleep( )、wait()、join( )、yield( )的区别
1 Sleep V.S waitsleep线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其 他线程,但是监控状态依然保持,到时后会自动恢复。调用 sleep 不会释放对象锁。 sleep() 使当前线程进入阻塞状态,在指定时间内不会执行waitObject 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待 此对象的等待锁定池,只有针对此对象发出 notify 方法(或 notifyAll)后本线程才进入对象 锁定池准备获得对象锁进入运行状态。区别比较1原创 2021-12-12 16:54:57 · 1354 阅读 · 0 评论 -
Java8使用stream操作两个list根据某字段匹配再对其中一个list进行赋值
import com.google.common.collect.Lists;import lombok.extern.slf4j.Slf4j;import java.lang.reflect.Field;import java.util.*;import java.util.stream.Collectors; @Slf4jpublic class ListUtils { /** * lambda表达式对两个List进行循环,根据符合条件,进行相关的赋值操作并原创 2021-11-24 22:24:30 · 14243 阅读 · 8 评论