Java
文章平均质量分 80
斯沃福德
这个作者很懒,什么都没留下…
展开
-
如何用 Maven 将java项目打包可运行的jar
Maven可以使用mvn package指令对项目进行打包,如果使用Java -jar xxx.jar执行运行jar文件,会出现 “”(没有设置Main-Class)、ClassNotFoundException(找不到依赖包)等错误。原创 2024-05-16 17:01:04 · 357 阅读 · 0 评论 -
ZIP4J 的压缩与解压缩
ZIP4j 压缩与解压的实例详解转载 2024-05-09 16:11:01 · 231 阅读 · 0 评论 -
修改 OkHttp3 的超时时间
OkHttp是一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司开发。。原创 2023-11-22 13:46:03 · 2056 阅读 · 0 评论 -
@JsonFormat 注解的使用
@JsonFormat 是Jackson中定义的一个注解,可以在数据返回前端时进行格式化;原创 2023-10-31 18:45:05 · 4336 阅读 · 0 评论 -
SM3和SM4密钥
两种加密算法的基本Java实现原创 2023-03-13 21:50:24 · 5697 阅读 · 0 评论 -
雪花算法以及具体实现
雪花算法以及具体的实现转载 2023-03-07 13:24:09 · 474 阅读 · 0 评论 -
用Java实现多线程打印奇偶数
多线程小题,使用到synchronized同步锁和wait()、notify() 指令原创 2023-02-19 17:19:05 · 2161 阅读 · 0 评论 -
常见设计模式
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、提高代码的可靠性。原创 2023-02-09 11:49:43 · 406 阅读 · 0 评论 -
静态代理和动态代理
在一些情况下,一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时就出现了代理对象,代理对象在客户端和目标对象之间起到中介的作用,为客户端提供一种代理去控制对目标对象的访问原创 2023-02-04 15:18:25 · 641 阅读 · 0 评论 -
JVM 知识点补充——永久代和元空间
Java 的内存中有一块称之为方法区的部分,在 JDK8 之前, Hotspot 虚拟机中的实现方式为永久代(Permanent Generation),别的JVM都没有这个东西。转载 2022-09-23 13:03:55 · 2624 阅读 · 0 评论 -
使用容量 10000 的HashMap 存9000条数据,会触发扩容吗 ?
面试官:使用容量 10000 的HashMap 存9000条数据,会触发扩容吗 ?先说结论,不会!众所周知,Hashmap有负载因子为0.75,达到负载因子就会触发扩容,但这是无参构造即初始容量为16的Hashmap,而这里容量是10000,使用了有参构造的Hashmap,不一样。原创 2022-09-22 18:03:07 · 1248 阅读 · 4 评论 -
ArrayList 扩容源码浅析
ArrayList是List接口下的一个实现类,它可以动态的修改数组,数组元素①有序②可重复;ArrayList中维护了一个Object类型的数组;可以加入null,并且可以加入多个;ArrayList基本等同于Vector,但是ArrayList是线程不安全的;add()添加元素时,先判断数组是否需要扩容,将size+1作为参数传入,判断size+1是否小于10,如果当前是即数组为空,就将容量初始化为10;会执行,参数是minCapacity也就是之前的siez+1,而当。原创 2022-09-22 14:55:49 · 174 阅读 · 0 评论 -
ConcurrentHashMap 源码浅析
引入:【多个线程访问一个Map时】,使用concurrentHashMap,以保证线程安全;原创 2022-09-17 13:50:03 · 591 阅读 · 2 评论 -
Semaphore 基本原理
Semaphore 信号量是一个计数器,用来限制访问资源的线程的个数;而不是限制的资源的个数;ReentrantLock只允许同一时刻线程的独占,而Semaphore用在共享资源有多个,也允许多个线程来访问这些资源;只是希望对访问的线程上限加以限制;两者底层都基于AQS;1.使用 semaphore限流,访问高峰期时,让超出线程上限的请求线程阻塞,高峰期过去再释放许可;......原创 2022-08-04 11:56:23 · 488 阅读 · 0 评论 -
JVM垃圾回收总结
A和B的引用记数都是1,而没有其他对象引用A或B,导致记数无法归零,造成内存泄露------------早期python虚拟机使用的引用计数法,而java用的是可达性分析法;使用可达性分析法,沿着GCroot的引用链去找,扫描整个堆中对象,如果对象被GCroot根对象引用,则保留。解决标记-清除算法的内存碎片问题,将可用的对象向前移动,让内存更为紧凑,连续的空间更多;,如果是则不能被回收,反之一个对象没有被根对象直接/间接引用,则可以被回收。【在垃圾回收前】,会对堆中的所有对象扫描,找出是否有对象被。...原创 2022-08-03 17:38:34 · 444 阅读 · 0 评论 -
ReentrantLock 基本原理
ReentrantLock底层基于AQS,其构造方法返回的就是NonfaireSync和faireSync;两种同步器都继承自Sync,Sync又继承自AQS!newReentrantLock时,返回的就是同步器,默认是非公平的;原创 2022-07-31 13:24:50 · 2086 阅读 · 0 评论 -
JVM概述和内存管理
首先代码会被javac编译器编译成.class字节码(类的基本信息、常量池、方法定义)存于方法区;然后字节码被JVM通过(方法区的)类加载器进行加载到方法区(元空间);接着字节码中的方法定义中的虚拟机指令被解释器解释成机器码(根据不同的平台生成不同的机器码),这个过程会去常量池中查表;然后分配执行这段指令需要的资源—主要是内存。CPU执行指令把结果写回内存了。..........................................原创 2022-07-27 14:53:23 · 645 阅读 · 0 评论 -
解决哈希冲突的几种方式
哈希函数是一个映像,把任意长度的输入,通过Hash算法变换成固定长度的输出,这个输出就是Hash值;当两个不同的输入,产生了同一个输出值即为哈希冲突。原创 2022-07-26 14:06:15 · 3451 阅读 · 0 评论 -
ThreadLocal 总结
ThreadLocal为每一个线程都提供一个专属的变量副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突;如果你创建了⼀个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的本地副本;可以使⽤get()和set()⽅法来获取默认值或将其值更改为当前线程所存的副本的值,从而避免了线程安全问题;例ThreadLocal的数据是隔离的,每个线程都能拿到变量的副本,线程2拿到的还是null!.................................原创 2022-07-25 16:45:51 · 1240 阅读 · 0 评论 -
多线程与并发编程常见问题(未完待续)
概括来说就是当前任务在执⾏完CPU时间⽚切换到另⼀个任务之前会先保存⾃⼰的状态,以便下次再切换回这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是⼀次上下⽂切换。①保存原数据到PCB②对新进程数据的恢复。.....................原创 2022-07-24 14:02:04 · 333 阅读 · 1 评论 -
Synchronized同步锁的基本原理
线程在加锁时,先清空工作内存→在主内存中拷贝最新变量的副本到工作内存→执行完代码→将更改后的共享变量的值刷新到主内存中→释放互斥锁。1.synchronized()内要放引用类型的对象,不能放基本类型,Synchronized同步锁主要以阻塞的方式保证数据的。2.不加synchronized的对象不会关联监视器。..................原创 2022-07-23 13:31:04 · 536 阅读 · 0 评论 -
JDK线程池的总结
线程是系统资源,每创建新的线程会占用资源,且创建和销毁对象开销较大;高并发时,如果为每个任务都创建新的线程,则对内存占用太大,可能会内存溢出;线程池技术的引入,就是为了解决这一问题.一个线程集合用来控制线程的数量,会先创建一定数量的线程放入空闲队列中,当任务来了之后就给任务分配线程去执行;当线程被任务占满后,会将任务放到阻塞队列排队,等待其他线程执行完毕,再从队列中取出任务来执行;如果选的是有界队列,当阻塞队列满了,再来新的任务,就会创建救急线程;当救急线程也满了,会执行拒绝策略;.............原创 2022-07-20 14:31:04 · 1188 阅读 · 0 评论 -
HashMap 源码浅析
putVal() 原理总结:因为计算索引时是 即将( 数组长度-1 ) 和Key的哈希值进行与运算,只有当数组的长度是2的n次方,则(数组长度-1)的二进制才能保持后面全是1,全是1才能保证数组中的任意一位置都能取到;如数组长度5 ,则5-1=4 ,4的二进制为00000100 ,那么索引 1 2 3都无法获取到! (与运算中真真才能为真);getNode()原理总结:由于在Java中两个不同的对象可能有一样的哈希值,因为不同的键可能有一样hashCode,从而导致冲突的产生;HashMap使用链式地原创 2022-07-14 11:50:52 · 272 阅读 · 0 评论 -
双亲委派机制源码浅析
每⼀个类都有⼀个对应它的ClassLoader类加载器,类加载器在⼯作时会默认使⽤双亲委派机制;ClassLoader的具体作用就是将class字节码文件加载到jvm虚拟机中去,程序就可以正确运行了;但是,jvm启动时并不会一次性加载所有的class文件,而是根据需要去动态加载;所谓双亲委派机制,就是调用ClassLoader的loadClass的规则:为什么要从下到上检查?为了避免重复加载;某些情况下需要打破双亲委派机制:JDBC的DriverManager默认是由启动类加载器加载,但启动类加载原创 2022-06-24 12:33:21 · 262 阅读 · 0 评论 -
JVM中类加载过程
java源代码编译为字节码后,然后通过类加载器加载字节码到方法区中,并根据Class 文件描述在堆中创建 java.lang.Class 对象验证字节码是否符合虚拟机规范 ,不合法的将会报错ClassFormatError2.为static静态变量分配空间,设置默认值JDK1.6中静态变量在方法区,现在的JDK1.8 中静态变量在堆中static静态变量分配空间和赋值是两个步骤,分配空间在准备阶段完成,赋值在初始化阶段类的构造中完成· 如果是static final 基本类型特殊,值在编译阶段就确定了原创 2022-06-21 17:28:23 · 159 阅读 · 0 评论 -
简述CMS垃圾回收器
CMS的全称:Concurrent Mark Sweep,即「并发标记清除」基于标记-清除算法(会产生内存碎片)引入:使用Serial 单线程和Parallel并行垃圾回收器,在垃圾回收时,用户线程会完全stop the world为了缩短老年代STW的时间,使用并发垃圾回收器。CMS能够在「部分场景」下让GC线程和用户线程并发执行优点:使用多核CPU来缩短STW的时间缺点:1.由于使用标记-清除算法,会产生内存碎片,分配对象时内存不足,造成并发失败出发FullGC,这时老年代并发垃圾回收器会退化原创 2022-06-19 16:02:46 · 939 阅读 · 1 评论 -
简述G1垃圾回收器
OopMap 用于枚举 GC Roots根对象,记录栈中引用数据类型的位置。OopMap 记录了栈上本地变量到堆上对象的引用关系。其作用是:垃圾收集时,收集线程会对栈上的内存进行扫描,看看哪些位置存储了 Reference 类型。如果发现某个位置确实存的是 Reference 类型,就意味着它所引用的对象这一次不能被回收。但问题是,栈上的本地变量表里面只有一部分数据是 Reference 类型的(它们是我们所需要的),那些非 Reference 类型的数据对我们而言毫无用处,但我们还是不得不对整个栈全部扫原创 2022-06-17 13:45:57 · 800 阅读 · 0 评论 -
StringTable字符串常量池的常见问题
StringTable常见问题原创 2022-06-05 22:26:55 · 503 阅读 · 0 评论 -
ArrayDeque类的使用
一.概述Deque接口是Queue接口的子接口,它代表一个双端队列,该队列允许从两端来操作队列中的元素。Deque不仅可以当成双端队列使用,而且可以当成栈来使用。ArrayDeque集合是Deque接口的实现类,它是一个基于数组的双端队列,创建Deque时同样可以指定一个numElements参数,该参数用于指定Object[]数组的长度;如果不指定该参数,Deque底层数组长度为16。二.常用方法1.添加元素 addFirst(E e)在数组前面添加元素addLast(E e)在数组后面添加原创 2022-05-03 15:40:53 · 600 阅读 · 0 评论 -
如何使用Maven打 带有依赖的jar包
1. 先在pom.xml中添加插件信息:<build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source原创 2022-04-13 12:08:15 · 4101 阅读 · 0 评论 -
生产者消费者模式的Java实现
一.概述1. 什么是“生产者消费者模式”?生产线程负责生产,消费线程负责消费生产线程和消费线程要达到均衡。生产满了就不能继续生产了,必须让消费线程进行消费消费完了就不能再消费了,必须让生产线程进行生产这是一种特殊的业务需求,在这种特殊的情况下,需要使用wait()和notify()方法2.wait和notify方法wait和notify方法不是线程当中的方法,是任何一个Java对象都有的方法(Object自带的,不是线程去调用)3.wait()方法的作用?①让正在当前线程(o对象上活动原创 2022-02-25 11:08:31 · 768 阅读 · 0 评论 -
死锁的Java实现
一.概述条件:T1线程设计为先锁住对象1,再锁住对象2。T2线程设计为先锁住对象2,再锁住对象1。只有当两个对象都被锁住时,代码才会结束。分析: 当T1线程锁住了对象1,要往下锁住对象2的时候,此时对象2被T2线程锁住,所以T1锁不了对象2。而T2先锁住了对象2,往下锁对象1的时候也锁不了,因为此时T1锁住了对象1。 而且,T1必须在两个对象都被T1锁住的时候才会结束代码,所以对象1的锁不会放开,T2也就无法去锁T1.死锁会让程序停在那,不出任何异常和错误。程序一直僵持在那里,这种情况程序非常难原创 2022-02-25 10:57:48 · 1239 阅读 · 0 评论 -
Volatile:可见性保证+禁止指令重排
volatile是java语言中的关键字,用来修饰会被多线程访问的共享变量,是JVM提供的轻量级的同步机制,相比同步代码块或者重入锁有更好的性能。它主要有两重个作用,一是保证多个线程对共享变量访问的可见性,二防止指令重排序。1.可见性保证1.1 何为可见性volatile在Java中能够保证变量对多线程的可见性,那么何为可见性?在Java8语言规范中的定义:volatile Fields: A field may be declared volatile, in which case the Ja原创 2021-12-29 17:50:59 · 1743 阅读 · 0 评论 -
Java8新特性:Lambda 表达式
一.概述笔者最初是在javaGuide中一个死锁的例子中遇到了表达式“()-> ” ,不知道啥意思,逐上网查找,在此记录。Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。Lambda 表达式主要用来定义行内执行的方法类型接口;免去了使用匿名方法的麻烦lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。格式:(pa原创 2021-12-29 14:29:49 · 240 阅读 · 0 评论