
Java
文章平均质量分 72
渣一个
这个作者很懒,什么都没留下…
展开
-
多种垃圾回收器
https://www.cnblogs.com/yanl55555/p/13365572.html原创 2021-08-18 11:25:08 · 215 阅读 · 1 评论 -
Java8 中的 Optional
从 Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异常。本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此。我们从一个简单的用例开始。在 Java 8 之前,任何访问对象方法或属.原创 2021-07-23 13:18:02 · 2309 阅读 · 0 评论 -
自定义Login注解
自定义Login注解,实现在controller增加注解登录拦截1.自定义Login注解import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)@Target({原创 2021-07-20 11:41:38 · 1608 阅读 · 0 评论 -
单元测试代码覆盖率的浅谈
转自:https://blog.youkuaiyun.com/shenggaofei/article/details/52905428在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或 90%。于是乎,测试人员费尽心思设计案例覆盖代码。用代码覆盖率来衡量,有利也有有弊。本文我们就代码覆盖率展开讨论,也欢迎同学们踊跃评论。首先,让我们先来了解一下所谓的“代码覆盖率”。我找来了所谓的定义:代码覆盖率 = 代码的覆盖程度,一种度量原创 2021-02-25 17:18:39 · 3904 阅读 · 2 评论 -
深入理解Java Stream流水线
转自:https://www.cnblogs.com/CarpenterLee/p/6637118.html前面我们已经学会如何使用Stream API,用起来真的很爽,但简洁的方法下面似乎隐藏着无尽的秘密,如此强大的API是如何实现的呢?Pipeline是怎么执行的,每次方法调用都会导致一次迭代吗?自动并行又是怎么做到的,线程个数是多少?本节我们学习Stream流水线的原理,这是Stream实现的关键所在。首先回顾一下容器执行Lambda表达式的方式,以ArrayList.forEach()方法为原创 2021-02-19 14:32:46 · 527 阅读 · 0 评论 -
Java Stream API进阶篇
上一节介绍了部分Stream常见接口方法,理解起来并不困难,但Stream的用法不止于此,本节我们将仍然以Stream为例,介绍流的规约操作。规约操作(reduction operation)又被称作折叠操作(fold),是通过某个连接动作将所有元素汇总成一个汇总结果的过程。元素求和、求最大值或最小值、求出元素总个数、将所有元素转换成一个列表或集合,都属于规约操作。Stream类库有两个通用的规约操作reduce()和collect(),也有一些为简化书写而设计的专用规约操作,比如sum()、max()原创 2021-02-19 12:25:35 · 251 阅读 · 0 评论 -
Java Stream API入门篇
转自:https://www.cnblogs.com/CarpenterLee/p/6545321.html你可能没意识到Java对函数式编程的重视程度,看看Java 8加入函数式编程扩充多少功能就清楚了。Java 8之所以费这么大功夫引入函数式编程,原因有二:代码简洁,函数式编程写出的代码简洁且意图明确,使用stream接口让你从此告别for循环。 多核友好,Java函数式编程使得编写并行程序从未如此简单,你需要的全部就是调用一下parallel()方法。这一节我们学习stream,也就是Ja原创 2021-02-19 11:44:30 · 193 阅读 · 0 评论 -
JUnit 4和JUnit 5区别
特征 JUNIT 4 JUNIT 5 声明一种测试方法 @Test @Test 在当前类中的所有测试方法之前执行 @BeforeClass @BeforeAll 在当前类中的所有测试方法之后执行 @AfterClass @AfterAll 在每个测试方法之前执行 @Before @BeforeEach 每种测试方法后执行 @After @AfterEach 禁用测试方法/类 @Ignore @Disa原创 2021-02-18 15:28:03 · 5761 阅读 · 0 评论 -
JVM垃圾回收
转自:https://mp.weixin.qq.com/s/XsZUF2nBUSEJoGIA8RimJwGC 对于Java 来说重要性不言而喻,不论是平日里对 JVM 的调优还是面试中的无情轰炸。这篇文章会以一问一答的方式来展开有关 GC 的内容。本文章所说的 GC 实现没有特殊说明的话,默认指的是 HotSpot 的。我先将十八个问题都列出来,大家可以先思考下能答出几道。好了,开始表演。young gc、old gc、full gc、mixed gc 傻傻分不清?这个问题的原创 2021-02-01 12:39:02 · 271 阅读 · 0 评论 -
JVM—浮动垃圾
问:CMS中的浮动垃圾理解?书上说:并发清理阶段用户线程还在运行,这段时间就可能产生新的垃圾,新的垃圾在此次GC无法清除,只能等到下次清理。这些垃圾有个专业名词:浮动垃圾。这个浮动垃圾如何理解?难道不是在本次GC重新标记remark的过程中被发现然后清理吗?为何还要等下次GC才能清理?答:重新标记(Remark) 的作用在于:之前在并发标记时,因为是 GC 和用户程序是并发执行的,可能导致一部分已经标记为 从 GC Roots 不可达 的对象,因为用户程序的(并发)运行,又可达 了,Rema原创 2021-02-01 12:28:09 · 5264 阅读 · 0 评论 -
Java Queue中 add/offer,element/peek,remove/poll区别
转自:https://blog.youkuaiyun.com/u012050154/article/details/60572567java Queue中 add/offer,element/peek,remove/poll中的三个方法均为重复的方法,在选择使用时不免有所疑惑,这里简单区别一下:1、add()和offer()区别:add()和offer()都是向队列中添加一个元素。一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,调用 add() 方法就会抛出一个 unchecked 异常,而调.原创 2020-11-30 19:06:50 · 423 阅读 · 0 评论 -
Java之PriorityQueue有序队列
转自:https://baijiahao.baidu.com/s?id=1665383380422326763&wfr=spider&for=pc最近在刷力扣题的时候不止一次看到过这个PriorityQueue,他的优良特性可以帮助我们解决大量的题目。这篇文章从用法、原理、源码以及力扣实际题目的角度进行一个全面的分析。希望对你有帮助。一、什么是优先级队列1、概念我们都知道队列,队列的核心思想就是先进先出,这个优先级队列有点不太一样。优先级队列中,数据按关键词有序排列,插入新数原创 2020-11-30 19:01:47 · 5071 阅读 · 0 评论 -
Java之transient关键字
转自:https://baijiahao.baidu.com/s?id=1636557218432721275&wfr=spider&for=pc这个关键字的作用其实我在写java的序列化机制中曾经写过,不过那时候只是简单地认识,只要其简单的用法,没有深入的去分析。这篇文章就是去深入分析一下transient关键字。先给出这篇文章的大致脉络首先,介绍了transient的基本概念和基本用法、然后,介绍深入分析一下transient关键字,并介绍几个需要掌握的问题最后,来个总.原创 2020-11-30 10:26:17 · 125 阅读 · 0 评论 -
ReentrantLock可重入锁
java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能。而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。这篇文章主要是从使用的角度来分析一下ReentrantLock。一、简介ReentrantLock常常对比着synchronized来分析,我们先对比着来看然后再一点一点分析。(1)synchronized是独占锁,加锁和解锁的过程自动进行,易于操作,但不够灵活。Reen...原创 2020-11-28 20:56:28 · 115 阅读 · 0 评论 -
Java解决CAS机制中ABA问题的方案
【原创】强哥Java架构之路2019-05-26 07:00:00通过对atomic包的分析我们知道了CAS机制,我们在看一下CAS的公式。CAS(V,A,B)1:V表示内存中的地址2:A表示预期值3:B表示要修改的新值CAS的原理就是预期值A与内存中的值相比较,如果相同则将内存中的值改变成新值B。这样比较有两类:第一类:如果操作的是基本变量,则比较的是 值 是否相等。第二类:如果操作的是对象的引用,则比较的是对象在 内存的地址 是否相等。总结一句话就是:比较并交换。..原创 2020-11-18 10:50:56 · 435 阅读 · 1 评论 -
深入理解多线程(一)——Synchronized的实现原理
synchronized,是Java中用于解决并发情况下数据同步访问的一个很重要的关键字。当我们想要保证一个共享资源在同一时间只会被一个线程访问到时,我们可以在代码中使用synchronized关键字对类或者对象加锁。那么,本文来介绍一下synchronized关键字的实现原理是什么。在阅读本文之间,建议先看下Java虚拟机是如何执行线程同步的。反编译众所周知,在Java中,synchronized有两种使用形式,同步方法和同步代码块。代码如下:/** * @author Hollis 1.原创 2020-11-17 14:56:48 · 218 阅读 · 0 评论 -
this引用逃逸
1、什么是This逃逸? 在构造器构造还未彻底完成前(即实例初始化阶段还未完成),将自身this引用向外抛出并被其他线程复制(访问)了该引用,可能会问到该还未被初始化的变量,甚至可能会造成更大严重的问题。 废话不多说,看一下代码1 /** 2 * 模拟this逃逸 3 * @author Lijian 4 * 5 */ 6 public class ThisEscape { 7 //final常量会保证在构造器内完成初始化(但是仅限于未发生this逃逸的情况下,原创 2020-11-17 14:27:18 · 206 阅读 · 0 评论 -
两个线程交替执行
方法一:公平锁解决两个线程交替执行public class LockDemo implements Runnable { // 定义一个数用来交替更改数字的正负号 private int j = 1; // 定义公平锁,用来是线程1和线程2交替执行 ReentrantLock lock = new ReentrantLock(true); @Override public void run() { for(int i = 1; i < 100; i++){ //获取原创 2020-11-04 13:46:37 · 1567 阅读 · 0 评论 -
Java的native方法
一. 什么是Native Method简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。"A native method is a Java method whose implementation is provide...原创 2020-09-23 08:22:58 · 1225 阅读 · 0 评论 -
Java中基本数据类型和包装类型的区别
1、包装类是对象,拥有方法和字段,对象的调用都是通过引用对象的地址;基本类型不是2、包装类型是引用的传递;基本类型是值的传递3、声明方式不同:基本数据类型不需要new关键字;包装类型需要new在堆内存中进行new来分配内存空间4、存储位置不同:基本数据类型直接将值保存在值栈中;包装类型是把对象放在堆中,然后通过对象的引用来调用他们5、初始值不同:...原创 2020-09-23 07:59:14 · 6128 阅读 · 1 评论 -
Java之 == 和 equals() 区别 hashCode() 解析
https://blog.youkuaiyun.com/qq_21688757/article/details/53067814https://wenwen.sogou.com/z/q906756704.htm原创 2020-09-21 20:21:08 · 135 阅读 · 0 评论 -
int和Integer区别
总结:*初始值不同,Integer是null,int是0。*泛型支持不一样,泛型支持Integer不支持int*Integer对象继承Object 可调用方法,int是基本数据类型无方法调用。*Integer属于Object类,对象存在堆中,被引用值存栈中。int存存栈中。* Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值延伸:1.由于Integer变量实际是对一个Integer对象的引用,所以两个...原创 2020-09-21 11:43:09 · 250 阅读 · 0 评论 -
Java之Set接口
转自:https://www.cnblogs.com/chanshuyi/p/4468470.html一、Set接口Set 接口与 List 接口相比没有那么多操作方法,比如:1、List 接口能直接设置或获取某个元素的值,而Set接口不能。2、List 接口能直接在指定位置删除、增加元素,而Set接口不能。3、List 接口有 listIterator 方法,可以获得 ListIterator 对象,而 Set 接口不能。Set 只能通过 iterator 迭代的方式获取元素。对比原创 2020-09-17 23:05:20 · 331 阅读 · 0 评论 -
finalize作用
转自:https://blog.youkuaiyun.com/a4171175/article/details/90749839finalize()是Object中的方法,当垃圾回收器将要回收对象所占内存之前被调用,即当一个对象被虚拟机宣告死亡时会先调用它finalize()方法,让此对象处理它生前的最后事情(这个对象可以趁这个时机挣脱死亡的命运)。要明白这个问题,先看一下虚拟机是如何判断一个对象该死的。判定死亡"GC ROOTS"定义:GC管理的主要区域是Java堆,一般情况下只针对堆进行垃圾回收。.原创 2020-09-14 08:00:11 · 4501 阅读 · 1 评论 -
Java动态代理与静态代理
https://blog.youkuaiyun.com/mulinsen77/article/details/84730087https://www.cnblogs.com/cC-Zhou/p/9525638.htmlAOP的原理就是动态代理机制。RPC框架也是实现了AOP机制。静态代理:由程序员创建或工具生成代理类的源码,再编译代理类,即代理类和委托类的关系再程序运行前就已经存在。动态代理:在运行期间使用动态生成字节码形式,动态创建代理类。使用的工具有 jdkproxy、cglibproxy 等。原创 2020-09-13 15:26:45 · 147 阅读 · 0 评论 -
Spring Bean的生命周期(非常详细)
转自:https://www.cnblogs.com/zrtqsk/p/3735273.htmlSpring作为当前Java最流行、最强大的轻量级框架,受到了程序员的热烈欢迎。准确的了解Spring Bean的生命周期是非常必要的。我们通常使用ApplicationContext作为Spring容器。这里,我们讲的也是 ApplicationContext中Bean的生命周期。而实际上BeanFactory也是差不多的,只不过处理器需要手动注册。一、生命周期流程图: Spring Bean的完原创 2020-09-13 12:49:57 · 534 阅读 · 0 评论 -
可作为GC Roots的对象
一、名词解释根搜索算法是JVM用来的判断对象是否存活的算法,此算法基本思路为通过一系列的“GC Roots”对象作为起始点,从这些节点往下搜索,当一个对象和GC Roots不可达时,则该对象是无用的,可被回收的。如下图所示:object5、object6、object7虽然互相有关联,但是他们到GC Roots是不可达的,因此他们都可以被回收。 在java中,可作为GC Roots的对象有:1.虚拟机栈(栈帧中的本地变量表)中引用的对象;2.方法区中的类静态属性引用的对象;...原创 2020-09-09 08:16:41 · 601 阅读 · 1 评论 -
Callable接口、Runable接口、Future接口
转自:https://www.cnblogs.com/felixzh/p/6044371.html参考:https://blog.youkuaiyun.com/qq_36761831/article/details/905173231. Callable与Runable区别Java从发布的第一个版本开始就可以很方便地编写多线程的应用程序,并在设计中引入异步处理。Thread类、Runnable接口和Java内存管理模型使得多线程编程简单直接。但Thread类和Runnable接口都不允许声明检查型异常,原创 2020-09-08 14:36:16 · 227 阅读 · 0 评论 -
线程状态切换之等待队列和同步队列
转自:https://blog.youkuaiyun.com/weixin_37695911/article/details/106668435线程的主要状态及切换:1.初始-NEW(还未调用start())2.运行-RUNNABLE(就绪(READY):调用了start(),运行中(RUNNING):获得了时间片这两者统称为运行)3.阻塞-BLOCKED因为synchronized没获取到锁的线程就会阻塞在同步队列中(同步队列中放的是尝试获取锁但失败的线程)4.等待-WAITING(具体情况见下.原创 2020-09-08 08:12:43 · 2248 阅读 · 1 评论 -
Thread.sleep() / Object.wait() / Condition.await() / LockSupport.park() / LockSupport.unpark() 区别
转自:https://www.cnblogs.com/tong-yuan/p/11768904.htmlThread.sleep()和Object.wait()的区别首先,我们先来看看Thread.sleep()和Object.wait()的区别,这是一个烂大街的题目了,大家应该都能说上来两点。(1)Thread.sleep()不会释放占有的锁,Object.wait()会释放占有的锁;(2)Thread.sleep()必须传入时间,Object.wait()可传可不传,不传表示一直阻塞下去原创 2020-09-08 07:58:41 · 427 阅读 · 0 评论 -
Thread.join的作用和原理
转自:https://www.jianshu.com/p/fc51be7e5bc0原文解释的有点歧义,注意看原文评论。本文在原文基础上修改部分语句。文章简介很多人对Thread.join的作用以及实现了解得很少,毕竟这个api我们很少使用。这篇文章仍然会结合使用及原理进行深度分析内容导航Thread.join的作用 Thread.join的实现原理 什么时候会使用Thread.joinThread.join的作用之前有人问过我一个这样的面试题Java中如何让多线程按照自己原创 2020-09-07 16:04:36 · 1072 阅读 · 0 评论 -
Hashmap扩容时出现循环链表(jdk1.8把头插法换成了尾插法的原因)
1.容量计算容量的阈值=容量*加载因子2.扩容容量扩容的容量大小会变成原来的两倍,用位移运算来加快计算的运行速率。3.单线程下的rehash1.初始化长度为2,加入11时开始扩容,数组长度变为原来的两倍2.依次加入5,9,11三个节点。4.多线程多线程操作rehash形成环。jdk1.8为了避免上述情况将头插法变幻成了尾插法。形成环以后,查找数据容易出现死循环。...原创 2020-09-07 08:05:52 · 1944 阅读 · 3 评论 -
Java JDK 动态代理(AOP)使用及实现原理分析
https://blog.youkuaiyun.com/jiankunking/article/details/52143504原创 2020-09-06 22:51:40 · 173 阅读 · 0 评论 -
String、StringBuffer与StringBuilder之间区别
转自:https://blog.youkuaiyun.com/itchuxuezhe_yang/article/details/89966303参考:https://blog.youkuaiyun.com/u011702479/article/details/82262823String StringBuffer StringBuilder String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间 Strin...原创 2020-09-06 22:11:27 · 374 阅读 · 0 评论 -
Java序列化与反序列化
转自:https://www.cnblogs.com/lukelook/p/11192677.html一、概念 java对象序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再生成相同状态的对象。对象序列化是对象持久化的一种实现方法,它是将对象的属性和方法转化为一种序列化的形式用于存储和传输。反序列化就是根据这些保存的信息重建对象的过程。 序列化:将java对象转化为字节序列的过程。 反序列化:将字节序列转化为java对象的过程。二、为什么...原创 2020-09-06 20:16:06 · 330 阅读 · 0 评论 -
JVM / Tomcat类加载机制
https://www.jianshu.com/p/3556a6cca7e5转载 2020-09-05 14:50:32 · 147 阅读 · 0 评论 -
BlockingQueue阻塞队列及其实现
转自:https://www.jianshu.com/p/7b2f1fa616c61. 前言BlockingQueue即阻塞队列,它是基于ReentrantLock,依据它的基本原理,我们可以实现Web中的长连接聊天功能,当然其最常用的还是用于实现生产者与消费者模式,大致如下图所示:在Java中,BlockingQueue是一个接口,它的实现类有ArrayBlockingQueue、DelayQueue、 LinkedBlockingDeque、LinkedBlockingQueue、Pr原创 2020-09-03 11:27:37 · 930 阅读 · 0 评论 -
Hash和HashCode深入理解
转自:https://blog.youkuaiyun.com/m0_37700275/article/details/82800590目录介绍1.Hash的作用介绍 1.1 Hash的定义 1.2 Hash函数特性 1.3 Hash的使用场景 2.如何判断两个对象相等 2.1 判断两个字符串 2.2 判断两个int数值 2.3 其他基本类型 3.HashCode深入分析 3.0 HashCode是什么 3.1 为什么要重写HashCode 3.2 HashCode源代码原创 2020-08-30 14:46:26 · 650 阅读 · 0 评论 -
JAVA中的引用四种引用类型
关于值类型和引用类型的话题,C++、JAVA、python、go、C#等等高级语言都有相关的概念,只要理解了其底层工作原理,可以说即使是不同的语言,在面试学习工作实践中都可以信手拈来(不要太纠集语言),当然此处我选择了JAVA,虽然我是搞C++的,具体原因都懂就不废话了。一、值类型与引用类型 1、变量初始化int num=10;String str="hello" 2、变量赋值 从上图可以显而易见,num是int基本类型变量,值就直接保存在变量中。str是String引.原创 2020-08-30 10:09:38 · 8463 阅读 · 0 评论 -
Java中的几种对象(PO、VO、DAO、BO、POJO)
1.VO POO/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写。通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据。在O/R Mapping的世界里,有两个基本的也是重要的东东需要了解,即VO,PO。 VO,值对象(Value Object),PO,持久对象(Persisent Object),它们是由一组属性和属性的get和set方法组成。从结构上看,它们并没有什么不同的地方。但从其意义和本质上来看是完全不同的。1.VO是用new关键原创 2020-08-30 09:36:35 · 577 阅读 · 0 评论