Java
文章平均质量分 63
lizc_lizc
好好学习,天天向上。
展开
-
HibernateValidator手动调用校验
HibernateValidator手动调用校验原创 2023-01-12 11:08:36 · 690 阅读 · 0 评论 -
指定Java列表字段进行排序
指定Java列表字段进行排序原创 2023-01-11 11:10:00 · 364 阅读 · 0 评论 -
分布式id生成算法
分布式ID生成算法原创 2022-10-10 13:39:03 · 400 阅读 · 0 评论 -
JDK命令行监控工具
JDK命令行监控工具jstat查看JVM统计信息jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] gc、gcutil查看GC信息,class查看类加载信息,...... 通过jps查看进程的进程号[ []] 每隔interval毫秒执行一次,一共执行count次内存溢出@RestControllerpublic class MemoryController原创 2021-07-17 17:41:30 · 150 阅读 · 1 评论 -
ConcurrentHashMap
1.7JDK 1.7采用数组 + 链表的数据结构,插入时使用头插法,多线程访问时可能出现死循环问题。变量// 默认初始容量为16,并且必须为2的n次方static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16// 数组的最大容量static final int MAXIMUM_CAPACITY = 1 << 30;// 默认加载因子static final float DEFAULT_LOAD_FAC原创 2021-01-18 22:48:12 · 144 阅读 · 0 评论 -
HashMap
1.7JDK 1.7采用数组 + 链表的数据结构,插入时使用头插法,多线程访问时可能出现死循环问题。变量// 默认初始容量为16,并且必须为2的n次方static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16// 数组的最大容量static final int MAXIMUM_CAPACITY = 1 << 30;// 默认加载因子static final float DEFAULT_LOAD_FAC原创 2021-01-16 10:15:45 · 141 阅读 · 0 评论 -
String字符串
实现原理在 Java6 以及之前的版本中,String 对象是对 char 数组进行了封装实现的对象,主要有四个成员变量:char 数组、偏移量 offset、字符数量 count、哈希值 hash。从 Java7 版本开始到 Java8 版本,String 类中不再有 offset 和 count 两个变量了。这样的好处是 String 对象占用的内存稍微少了些。从 Java9 版本开始,将 char[]字段改为了 byte[]字段,又维护了一个新的属性 coder,它是一个编码格式的标识。一个原创 2020-12-26 10:30:47 · 170 阅读 · 0 评论 -
Synchronized同步锁
原文出处:https://time.geekbang.org/column/article/101244在并发编程中,多个线程访问同一个共享资源时,我们必须考虑如何维护数据的原子性。**在 JDK1.5 之前,Java 是依靠 Synchronized 关键字实现锁功能来做到这点的。Synchronized 是 JVM 实现的一种内置锁,锁的获取和释放是由 JVM 隐式实现。到了 JDK1.5 版本,并发包中新增了 Lock 接口来实现锁功能,它提供了与 Synchronized 关键字类似的同步功.原创 2020-12-17 19:30:55 · 211 阅读 · 0 评论 -
分布式事物
分布式事务解决方案在单个数据库的情况下,数据事务操作具有 ACID 四个特性,但如果在一个事务中操作多个数据库,则无法使用数据库事务来保证一致性。也就是说,当两个数据库操作数据时,可能存在一个数据库操作成功,而另一个数据库操作失败的情况,我们无法通过单个数据库事务来回滚两个数据操作。而分布式事务就是为了解决在同一个事务下,不同节点的数据库操作数据不一致的问题。在一个事务操作请求多个服务或多个数据库节点时,要么所有请求成功,要么所有请求都失败回滚回去。通常,分布式事务的实现有多种方式,例如 XA 协议实原创 2020-12-17 19:28:38 · 194 阅读 · 0 评论 -
字节码基础
字节码基础虚拟机栈和栈帧Hotspot JVM是一个基于栈的虚拟机,每个线程都有一个虚拟机栈用来存储栈帧,每次方法调用都伴随着栈帧的创建、销毁。Java虚拟机栈的释义如图所示当线程请求分配的栈容量超过Java虚拟机栈允许的最大容量时,Java虚拟机将会抛出StackOverflowError异常,可以用JVM命令行参数 -Xss来指定线程栈的大小,比如 -Xss:256k用于将栈的大小设置为256KB。每个线程都拥有自己的Java虚拟机栈,一个多线程的应用会拥有多个Java虚拟机栈,每个栈拥有自己原创 2020-09-12 08:56:46 · 772 阅读 · 1 评论 -
Java内存布局
Java对象内存布局在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)实例数据(Instance Data)对齐填充(Padding)对象头:HotSpot虚拟机对象的对象头包括三部分信息。第一部分是用来存储对象自身的运行时数据。如哈希码(HashCode)、分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32bit和64bit的虚拟机(未开启压缩指针)中分别为32bit和64bit,官方称它为“Ma原创 2020-09-12 08:49:59 · 243 阅读 · 0 评论 -
位图算法
前言本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。相信大家都有过抢票、刷票的经验,每年年底,这都是一场盛宴。然而,你有没有想过12306的抢票算法是怎么实现的呢?没有吧,想过,还是没有头绪?今天,我们就来曝光让人又爱又恨的12306是如何实现抢票的。位运算回顾我们知道计算机只能识别0和1,要操作这些0和1,只能通过位运算来进行,那么,一共有几种位运算呢?让我们来回顾一转载 2020-09-05 13:38:53 · 1689 阅读 · 3 评论 -
AtomicStampedReference
简介AtomicStampedReference内部使用Pair来存储元素值及其版本号,主要用来解决ABA问题。ABA问题CAS操作可能存在ABA的问题,就是说:假如一个值原来是A,变成了B,又变成了A,那么CAS检查时会发现它的值没有发生变化,但是实际上却变化了。如下代码存在ABA问题:public static void main(String[] args) { AtomicInteger atomicInteger = new AtomicInteger(1); new T原创 2020-08-08 17:35:08 · 130 阅读 · 0 评论 -
AtomicInteger
CAS简介CAS的全称为compare and swap简单的解释为比较交换,这个过程其实是发生在内存中的,应该说是汇编语言的一个操作过程。AtomicIntegerincrementAndGet()方法,将当前值加1并返回。// AtomicInteger.javapublic final int incrementAndGet() { // getAndAddInt返回的是旧值并不是更新后的值,所以这里返回的是旧值加1 return unsafe.getAndAddInt(th原创 2020-08-08 17:34:33 · 189 阅读 · 0 评论 -
Unsafe原子性
UnsafeJDK的rt.jar包中的Unsafe类提供了硬件级别的原子性操作,Unsafe类中的方法都是native方法,它们使用JNI的方式访问本地C++ 实现库。下面我们来了解一下Unsafe提供的几个主要的方法以及编程时如何使用Unsafe类做一些事情。long objectFieldOffset(Field field)方法:返回指定的变量在所属类中的内存偏移地址,该偏移地址仅仅在该Unsafe函数中访问指定字段时使用。boolean compareAndSwapLong(Object o原创 2020-08-08 17:33:54 · 487 阅读 · 0 评论 -
CompletableFuture
CompletableFuture概述CompletableFuture是一个可以通过编程方式显式地设置计算结果和状态以便让任务结束的Future,并且其可以作为一个CompletionStage(计算阶段),当它的计算完成时可以触发一个函数或者行为;当多个线程企图调用同一个CompletableFuture的complete、cancel方式时只有一个线程会成功。CompletableFuture除了含有可以直接操作任务状态和结果的方法外,还实现了CompletionStage接口的一些方法,这些方法遵原创 2020-08-08 17:32:55 · 381 阅读 · 0 评论 -
ThreadLocal原理
文章目录用法ThreadLocal源码分析内部类setreplaceStaleEntryexpungeStaleEntrycleanSomeSlotsgetgetEntrygetEntryAfterMissremoveThreadLocal副作用内存泄露为什么使用弱引用ThreadLocal 提供了一种方式,在多线程环境下,每个线程都可以拥有自己独特的数据,并且可以在整个线程执行过程中,从上而下的传递。用法public class Main { static final ThreadLocal原创 2020-08-01 14:35:06 · 189 阅读 · 0 评论 -
序列化与反序列化
序列化与反序列化原创 2020-06-13 11:37:57 · 211 阅读 · 1 评论 -
SPI 原理
JDK版本为1.8SPISPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。系统设计的各个抽象,往往有很多不同的实现方案,在面向的对象的设计里,一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的.原创 2020-06-10 23:34:30 · 215 阅读 · 0 评论 -
Java8常用方法
文章目录MapcomputecomputeIfAbsentcomputeIfPresentOptional获取对象值返回默认值返回异常转换值过滤值StreamforEachfilterdistinctsortedlimitskipmapflatMapanyMatchallMatchcollectjoiningtoList/toSetgroupingBypartitioningByMapcomputeV compute(K key, BiFunction < ? super K, ? super原创 2020-05-13 22:29:45 · 849 阅读 · 0 评论 -
静态内部类的加载时间
只有当静态内部类被主动调用的时候,JVM才会去初始化这个静态内部类。代码public class Main { public static void main(String[] args) { Outer outer = new Outer(); System.out.println("------------------------"); ...原创 2020-01-12 17:28:36 · 481 阅读 · 0 评论 -
JDK动态代理
Java动态代理原创 2019-12-04 21:41:55 · 283 阅读 · 1 评论 -
AtomicStampedReference
### 简介AtomicStampedReference内部使用Pair来存储元素值及其版本号,主要用来解决ABA问题。ABA问题CAS操作可能存在ABA的问题,就是说:假如一个值原来是A,变成了B,又变成了A,那么CAS检查时会发现它的值没有发生变化,但是实际上却变化了。如下代码存在ABA问题:public static void main(String[] args) { A...原创 2019-11-09 17:12:05 · 980 阅读 · 0 评论 -
AtomicInteger
CAS简介CAS的全称为compare and swap简单的解释为比较交换,这个过程其实是发生在内存中的,应该说是汇编语言的一个操作过程。incrementAndGet()方法将当前值加1并返回。public final int incrementAndGet() { // getAndAddInt返回的是旧值并不是更新后的值,所以这里返回的是旧值加1 return un...原创 2019-11-09 17:10:58 · 91 阅读 · 0 评论 -
LinkedList
文章目录简介主要属性内部类构造方法添加元素获取元素修改元素简介通过查看LinkedList的继承与实现,可以发现它不仅实现了List接口,还实现了Queue和Deque接口,所以它既能作为List使用,也能作为双端队列使用,当然也可以作为栈使用。LinkedList是使用链表来实现的,它实现了一个内部类来保存链表节点信息。主要属性/** * 元素个数 */transient int ...原创 2019-11-09 17:09:05 · 96 阅读 · 0 评论 -
CopyOnWriteArrayList
文章目录简介属性构造方法新增元素删除元素获取元素修改元素简介CopyOnWriteArrayList是ArrayList的线程安全的变体,添加数据时会将原来的数组内容复制到新创建的数组中,然后再把新添加的元素插入到数组中,添加完元素之后,再将原数组的引用指向新创建的数组。CopyOnWriteArrayList也是通过数组来实现的。属性/** 写数据时用来加锁 */final trans...原创 2019-11-09 17:05:19 · 109 阅读 · 0 评论 -
ArrayList
简介ArrayList主要是使用数组来实现的,默认数组长度为DEFAULT_CAPACITY,也可以自己初始化数组长度。每次新增元素之前,都需要进行一个判断,size+1 是否大于 elementData.length,根据这个结果来判断是否需要进行扩容。/** * 默认的数组容量 */private static final int DEFAULT_CAPACITY = 10;/...原创 2019-11-09 17:01:13 · 96 阅读 · 0 评论 -
GC知识
对象被判定为垃圾的标准没有被其他对象引用判断对象是否为垃圾的算法引用计数算法通过判断对象的引用数量来决定是否可以被回收每个对象实例都有一个引用计数器,被引用则+1,完成引用则-1任何引用计数为0的对象可以被当做垃圾收集优点:执行效率高,程序执行受影响较小缺点:无法检测出循环引用的情况,导致内存泄漏可达性分析算法判断对象的引用链是否可达来决定对象是否可以被回收...原创 2019-03-20 00:09:54 · 200 阅读 · 0 评论 -
java基础-反射
java反射Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为 Java 的反射机制。实体类package com.lzc.reflect;public class Person { public Integer id; ...原创 2018-09-03 19:17:09 · 123 阅读 · 0 评论 -
CountDownLatch基本用法
假设现在有A任务和B任务,而B任务需要A任务的计算结果,因此需要A任务执行完毕才能执行B任务。现在假设A任务是一个十分耗时的任务,因此我们需要开启10线程同时运行以减少运行时间,那么如何判断A任务的10个线程已经执行完毕了呢?我们可以用CountDownLatch来解决这个问题,代码如下:@Slf4jpublic class CountDownLatchExample1 { pri...原创 2018-07-21 12:55:45 · 281 阅读 · 0 评论 -
Java定时器
方法一使用Thread,通过sleep达到定时任务尚未效果。package timer;import java.util.Date;public class Main { public static void main(String []args) { new Thread(new Runnable() { @Override ...原创 2018-06-19 20:10:05 · 2562 阅读 · 0 评论 -
Java8日期API
参考链接转载 2018-06-23 22:57:19 · 200 阅读 · 0 评论 -
使用 SimpleDateFormat 格式化日期
SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行。例如:import java.text.SimpleDateFormat;import java.util.Date;public class Main { public static void main(String [...原创 2018-05-06 15:27:44 · 945 阅读 · 0 评论 -
N皇后问题
public class NQueens { public static int N = 8; public static int count = 0; public static void main(String[] args) { int[][] array = new int[N][N]; Queen(array,0); System.out.println(count...原创 2018-03-04 10:46:13 · 238 阅读 · 0 评论 -
Java全排列算法
解法一public class Arrange { public static void main(String[] args) { int[] a = {1,2,3,4}; arrange(a,0,a.length); } //交换 public static void swap(int a[],int i,int j) { int temp = a[i]; ...原创 2018-03-04 09:32:18 · 4047 阅读 · 0 评论