
JAVA
文章平均质量分 71
HD243608836
这个作者很懒,什么都没留下…
展开
-
java锁synchronized(this) 与synchronized(class) 有啥区别
synchronized(this) 与 synchronized(class) 相同处:均对代码加锁,实现互斥性。synchronized(this) 与 synchronized(class) 区别:作用域不同。转载 2024-04-01 17:44:34 · 534 阅读 · 0 评论 -
接口和抽象类分别在什么时候使用?其中我对基本功能在不断变化为什么使用抽象类而不使用接口类的理解
由此上述代码示例,可以看出如果使用接口的话在Duck类中就不能有默认的方法实现。必须全部是abstract方法,使用接口的实现类必须重写方法才能调用。也正因为抽象类可以有默认的方法实现,故基本功能在不断变化最好选择使用抽象类,因为可以在抽象类实现默认的方法。转载 2024-03-06 11:34:45 · 157 阅读 · 0 评论 -
java方法中return 、break和continue的区别和作用
不管是哪种循环,一旦在循环体中遇到break,系统将完全结束循环,开始执行循环之后的代码。1.return关键字并不是专门用于跳出循环的,return的功能是结束一个方法。一旦在循环体内执行到一个return语句,return语句将会结束该方法,循环自然也随之结束。与continue和break不同的是,return直接结束整个方法,不管这个return处于多少层循环之内。2.continue的功能和break有点类似,区别是continue只是中止本次循环,接着开始下一次循环。转载 2023-06-13 16:54:46 · 678 阅读 · 0 评论 -
List 去重的 6 种方法
本文我们介绍了 6 种集合去重的方法,其中实现最简洁,且去重之后的顺序能和原集合保持一致的实现方法,只有两种:LinkedHashSet 去重和 Stream 去重,而后一种去重方法无需借助新集合,是我们优先考虑的去重方法。版权声明:本文为CSDN博主「子午谷」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qq_40068304/article/details/122044814。转载 2023-03-02 20:39:07 · 1736 阅读 · 1 评论 -
springboot的@Scheduled()注解以及cron表达式详解
比如例2中的第四个位置的。转载 2023-02-23 20:21:42 · 2443 阅读 · 0 评论 -
关于java8的List的stream流的foreach()方法问题探究(坑)与替代方案
今天发现线上系统出现了一个bug,① 定时调用的系统暴漏的接口,来定时获取List数据。② 然后我会筛选出该List中符合条件的Object,对筛选出来的Object的某个属性进行。③ 最后将该List全部保存到数据库(包括修改和未修改的都保存下来)。原创 2023-02-22 20:42:24 · 4306 阅读 · 3 评论 -
volatile内存可见性
内存可见性是指当一个线程修改了某个变量的值,其它线程总是能知道这个变量变化。也就是说,如果线程 A 修改了共享变量 V 的值,那么线程 B 在使用 V 的值时,能立即读到 V 的最新值。我们如何保证多线程下共享变量的可见性呢?也就是当一个线程修改了某个值后,对其他线程是可见的。加锁volatile因为当一个线程进入 synchronizer 代码块后,线程获取到锁,会清空本地内存,然后从主内存中拷贝共享变量的最新值到本地内存作为副本,执行代码,又将修改后的副本值刷新到主内存中,最后线程释放锁。转载 2022-09-13 17:21:24 · 256 阅读 · 0 评论 -
java三种类加载方式
常见的三种类加载方式如下:new转载 2022-09-03 13:00:51 · 2642 阅读 · 1 评论 -
Java new一个对象的过程中发生了什么:类加载过程、创建对象过程
需要注意的是,每个子类对象持有父类对象的引用,可在内部通过super关键字来调用父类对象,但在外部不可访问补充:通过实例引用调用实例方法的时候,先从方法区中对象的实际类型信息找,找不到的话再去父类类型信息中找。如果继承的层次比较深,要调用的方法位于比较上层的父类,则调用的效率是比较低的,因为每次调用都要经过很多次查找。这时候大多系统会采用一种称为虚方法表的方法来优化调用的效率。转载 2022-09-03 12:25:22 · 1561 阅读 · 0 评论 -
jvm不同版本(jdk6、jdk7、jdk8)之间的class常量池、运行时常量池、字符串常量池与堆、方法区的种种关系
问:传说中的R大出现了,再问一下StringTable本身又存在哪里呢,有人说是方法区,又有人说是native memory?答:HotSpot VM的StringTable的本体在native memory里。原创 2022-09-01 03:28:20 · 1554 阅读 · 3 评论 -
从Java的《jvm虚拟机规范》看HotSpot虚拟机的内存结构和变迁
至此,本文对Java虚拟机规范中关于JVM内存区域的描述做了简单的解读,并以HotSpot虚拟机为例说明了具体实现和规范之间的联系。Java虚拟机规范是一份与实现无关的文档,它在描述时没有规定具体的实现细节,显得"模棱两可",但所有的Java虚拟机实现都应该遵循这个规范。其中还有关于类文件格式,字节码指令等相关内容的描述,感兴趣的读者可以自行前往阅读。关于字符串常量池的细节,放在下一篇文章来讨论。.........转载 2022-09-01 02:42:31 · 420 阅读 · 0 评论 -
jvm从HotSpot VM源码看字符串常量池(StringTable)和intern()方法
字符串常量池可以简单理解为就是一个hashmap的结构,记录的是字符串序列和String对象引用的映射关系为了在不同的Java进程之间共享字符串池,StringTable还有另外一个名为的MapJDK6中,会在永久代创建String对象再放入StringTable,而在JDK7中则直接将堆中的String对象放入StringTable中OpenJDK中包含HotSpot VM的源码,是完全开源的。OpenJDK源代码如果嫌Github下载太慢也可以去Gitee找国内的镜像。...转载 2022-09-01 02:35:22 · 599 阅读 · 0 评论 -
java的hashmap中value存放的是引用
【代码】hashmap中value存放的是引用。转载 2022-08-31 20:26:01 · 743 阅读 · 0 评论 -
【透彻】java关于HashMap多线程扩容导致死循环(JDK1.7)的详细过程
本篇主要通过图解的方式,解释了为什么JDK1.7中的HashMap在多线程情况下扩容可能死循环,也解释了JDK1.8如何解决这个问题。不得不说,画图是个很好的分析方式,根据代码,一步一步把结构图画出来,比对着代码瞎琢磨效果好多了。我在原文基础上把第二张图(多线程那张图)修改了一下,因为原作者画的图有些问题(原图的最后9个隔断应该是newTable的,而原作者给画成了table的)HashMap多线程扩容导致死循环(JDK1.7),为什么?- 知乎。.....................转载 2022-08-31 19:45:46 · 2303 阅读 · 0 评论 -
Java中ArrayList中存放的是值还是引用?
这里我们试了Integer和Double两种,看一下结果:由此可见,修改int和double不会对之前的内容造成影响,但是修改User会对之前的内容造成影响。所以,ArrayList中如果是基本数据类型,那么存放的就是值,如果是对象,那么存放的就是对象的引用而不是对象的拷贝。看样子这个结论是正确的,但是需要注意的一个问题就是ArrayList可以存放基本数据类型吗?.........转载 2022-08-30 01:51:37 · 947 阅读 · 0 评论 -
String为什么是不可变的?为什么要有字符串常量池?String和StringBuilder和StringBuffer
我们使用平时都了解到的方式去通过new去创建对象,即使它的字面量一致,他也是创建了多个对象,这样会导致资源的浪费,同时也占用空间。对象的不可变性是指对象本身的属性或者说本身的数据不会改变,将变量重新赋值,是创建了一个新对象,然后将新对象的引用赋值给了变量,之前的对象是没有受到影响的。当我们使用String进行字符串拼接时,他的底层会创建StringBuilder对象,并调用sb.append()方法。当我们对字符串进行大量操作时,就必须产生很多新的对象,这会导致性能低下。从源码我们可以看到,它继承的。...转载 2022-08-29 18:03:17 · 777 阅读 · 0 评论 -
Java方法区、永久代、元空间、常量池详解
其实,“使用常量池”对应的字节码是一个 ldc 指令,在给 String 类型的引用赋值的时候会先执行这个指令,看常量池中是否存在这个字符串对象的引用,若有就直接返回这个引用,若没有,就在堆里创建这个字符串对象并在字符串常量池中记录下这个引用(jdk1.7)。这里的字面量是指字符串字面量和声明为 final 的(基本数据类型)常量值,这些字符串字面量除了类中所有双引号括起来的字符串(包括方法体内的),还包括所有用到的类名、方法的名字和这些类与方法的字符串描述、字段(成员变量)的名称和描述符;........转载 2022-08-27 12:11:40 · 1806 阅读 · 1 评论 -
springboot上传文件落盘存储(MultipartFile转File)
——— 可以替换成FileUtils.forceMkdir(new File(patchPath))File dir = new File(patchPath);dir.exists()){ //如果不存在。要创建文件,必须先创建路径,路径不存在则会报错。,实例化一个File对象。,实例化File对象。原创 2022-08-22 14:41:50 · 864 阅读 · 0 评论 -
ConcurrentSkipListMap——跳表原理
为了引出 ConcurrentSkipListMap,先来简单理解下什么是跳表。对于单链表,即使链表是有序的,如果想要在其中查找某个数据,也只能从头到尾遍历链表,这样效率自然就会很低,跳表就不一样了。跳表是一种可以用来快速查找的数据结构,有点类似于平衡树。它们都可以对元素进行快速的查找。但一个重要的区别是:对平衡树的插入和删除往往很可能导致平衡树进行一次全局的调整;而对跳表的插入和删除,只需要对整个数据结构的局部进行操作即可。这样带来的好处是:在高并发的情况下,需要一个全局锁,来保证整个平衡树的线程安全;而转载 2022-06-30 15:17:13 · 487 阅读 · 0 评论 -
Socket原理讲解(在哪、是什么、怎么用)
对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问:1. 什么是TCP/IP、UDP?2. Socket在哪里呢?3. Socket是什么呢?4. 你会使用它们吗?什么是TCP/IP、UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集转载 2022-06-12 11:52:17 · 1243 阅读 · 1 评论 -
Java取模和取余,你真的弄懂了吗? 二者区别
前言Java 中常见的取模和取余(求余)计算,在我们日常的很多业务领域都有用到。比如当我们做数据加密时,密码学中不同的加密方案底层会采用不同的模运算来决定其复杂度;做游戏的同学游戏引擎中的取余求最高点;银行金融系统计算中间件开发;随机函数、一致性Hash等等。问了办公室同样做开发几年的同事,居然对两者区别毫不知晓。转问办公室另一即将科班毕业研究生,对概念也是模糊不清。于是决定总结一下,写下这篇文章。概念通常取模运算也叫取余运算,它们返回结果都是余数.rem和mod唯一的区别在于:...转载 2022-05-14 13:54:27 · 4188 阅读 · 0 评论 -
java 值传递与址(引用)传递
一、java中方法参数传递方式是本质上都是“值”传递如果参数是基本类型(传“实际值”):由于栈中存的就是“实际值”(java基本类型的值存储在栈中,不在堆中),所以传递的是基本类型的“实际值”的拷贝。如果参数是引用类型(传“地址值”):由于栈中存的是地址(该地址指向堆内存中存储位置,即引用),所以传递的是“堆中的地址”的拷贝。所以我们说成是“引用(址)传递”。注意:1. “String和8大基本类型的包装类”是不可变类型,即特殊的引用类型,所以每次修改操作都是新创建的对象,栈中的地.原创 2022-03-21 21:12:47 · 3019 阅读 · 0 评论 -
位(bit)、字节(byte)、字符之间的关系(数字占即为字节)
1、位:数据存储的最小单位。每个二进制数字0或者1就是1个位;2、字节:8个位构成一个字节;即:1 byte (字节)= 8 bit(位);1 KB = 1024 B(字节);1 MB = 1024 KB; (2^10 B)1 GB = 1024 MB; (2^20 B)1 TB = 1024 GB; (2^30 B)3、字符:a、A、中、+、*、の......均表示一个字符;一般 utf-8 编码下,一个汉字 字符 占用 3 个 字节;转载 2022-03-18 14:23:10 · 23154 阅读 · 2 评论 -
Netty巧妙的规避了JDK在linux中NIO的epoll的空轮询Bug
一、NIO的空轮询bug描述JDK1.5开始引入了epoll基于事件响应机制来优化NIO。相较于select和poll机制来说,epoll机制将事件处理交给了操作系统内核(操作系统硬中断)来处理,优化了elect和poll模型的无效遍历问题。但是JDK中epoll的实现却是有漏洞的,其中最有名的就是NIO空轮询bug(该bug只存在于Linux,因为Linux中NIO底层是使用epoll实现的,而Windows不是)。理论上无客户端连接时Selector.select() 方法会阻塞,但空轮询b.转载 2022-03-16 03:30:14 · 1642 阅读 · 0 评论 -
雪花分片算法(SnowFlake)Java实现
https://math.jianshu.com/math?formula=2%5E%7B41%7D-1分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种。算法原理SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 1bit,不用,因为二进制中最高位是符号位,1表示负数,0表示正数。生成的id一般都是用整数,所以最高位固定为0。 41bit-时间戳,用来记录时间戳,毫秒级。 - 41位可以表示个数字, - .转载 2022-03-01 22:22:55 · 727 阅读 · 0 评论 -
按位与、或、非、异或总结
位运算符有:&(按位与)、|(按位或)、^(按位异或)、~ (按位取反)。优先级从高到低,依次为~、&、^、|记住:1是true真,0是false假1. 按位与(&)运算符(都1才1——都真才真)运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1例子:10&9:0000 1010 & 0000 1001 = 0000 1000 = 8负数按补码形式参加按位与运算“与运算”的转载 2022-03-01 22:11:17 · 1274 阅读 · 0 评论 -
-128的二进制怎么表示
-128的二进制表示 今天看到8位2进制表示的范围是-128-127。原来没有想过为什么是这个范围,仔细一想,奇怪呀,-128是怎么表示的。127是0111 1111,而-128为什么是1000 0000呢,这不是-0吗?于是就有了下文要说的一些内容。STEP1 为了从根本上明白-128为什么是1000 0000,我们需要从一个叫【模】的东西讲起,并且把你原来关于原码补码反码的一些东西都暂时忘掉。‘模’是什么,简单来讲就是一个范围内的极限。举一个经典的例子,我们日常生活中的12个刻度...转载 2022-03-01 20:29:52 · 4183 阅读 · 4 评论 -
java的int类型中-128的二进制补码是怎么得来的?
什么是补码?怎么求补码?看看书,就会知道,补码,是有严格定义的。求补码方式一:按照定义来求补码,就用不着涉及原码反码(即使用公式 “[ X ]补 = 模-| X |” )。方式二:如果,你非要用求反加一的做法,就难免碰上原码反码。但是,int类型的八位码长的限制下,-128,既没有原码,也没有反码。这时,你还要用求反加一的做法,就一定会碰的头破血流。所以------------按照补码的定义,负数的补码,定义如下: [ X ]补 = 模-| X |按照定义,-128,如转载 2022-03-01 20:22:32 · 874 阅读 · 1 评论 -
手写一致性hash算法中的hash值为负数的问题解决
大家都知道,int型的值取值范围为Integer.MIN_VALUE(-2147483648)~Integer.MAX_VALUE(2147483647)hash结果取到负数时怎么修改呢?可以想到取绝对值,但是若恰好是Integer.MIN_VALUE取绝对值,就会导致时int正数发生了溢出!!Math.abs(Integer.MIN_VALUE) = Integer.MAX_VALUE+1(溢出)看来这样行不通,如果对hash做数据偏移,统一加2147483647呢?No no,转载 2022-02-28 21:06:26 · 2998 阅读 · 0 评论 -
Java 接口和抽象类可以被new(实例化)么?
答案:不能!!背景: 最近有同事跟我说了他面试时遇到的问题,考官问:“接口和抽象类可以被new嘛?”。这可能不是考官的原话,但是据他表达考官大概就是这个意思了。听到这个问题,我的第一反应是肯定不行啊,直接对接口和抽象类调用new,编译器都过不去。但是他说,考官说可以,用匿名内部类实现。听见这个回到,我感觉那个考官太………,有点无语。我们可以仔细分析下这个问题。直接new接口和抽象类 首先先明确一点,直接new接口和抽象类,这肯定行不通,编译器会提示Cannot instan...转载 2022-01-18 20:13:21 · 4369 阅读 · 0 评论 -
java继承了抽象类的子类是否一定需要重写抽象方法?
1. 子类是抽象类如果你的新类也是抽象类的话,可以重写部分,也可以不重写;2. 子类是普通类如果是普通类,就必须要全部重写。转载 2022-01-18 19:29:46 · 5275 阅读 · 1 评论 -
java反射机制作用与具体使用方法
一、反射获取class对象Class<?> cls = Class.forName("cn.mldn.demo.Person"); // 取得Class对象传入一个包名+类名的字符串就可以得到Class对象二、反射后我们主要可以做什么获得对象,构造方法,普通方法,属性 Object obj = cls.newInstance() //反射实例化对象 Constructor<?> cons = cls.getConstructor(String.转载 2021-12-28 16:00:25 · 156 阅读 · 0 评论 -
java 按日期范围统计数据并填补缺失日期数据
1. 情景展示 如上图所示,按日期进行数据统计,我们知道,数据的来源肯定是数据库,一旦指定时间段,必然存在日期空缺的情况(也就是当天没有产生数据) 除了使用 SQL 填补空缺日期记录外,有时我们不得不在 java 中做处理,填补空缺日期,并造当天的数据(最好还是使用 SQL,实在实现不了再用 java) 这种情况也很常见,今天我们一起来看下,如何通过 java 填补空缺的数据,并返回给前端?2. 解决方案 不用在意语法问题,关键看思路,难点在于从返回的数据中如何确定缺.转载 2021-10-12 15:26:06 · 3111 阅读 · 0 评论 -
ssl证书双向认证访问https—解决javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure(好文章)
背景今天尝试用Java去访问一个https接口,但抛出下面的异常:javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure解决过程(个人发现)建议如果是ssl双向认证的,先看看是不是客户端证书文件路径获取有问题(debug一下,看看是不是null),导致没携带证书访问https服务器,也会报这个handshake_failure错误。遇到问题首先去Google,然后在 javax.n.转载 2021-07-14 11:14:32 · 6646 阅读 · 0 评论 -
java实现HTTPS单向认证&TLS指定加密套件(文章很详细,好文章!)
1、HTTPS介绍 由于HTTP是明文传输,会造成安全隐患,所以在一些特定场景中,必须使用HTTPS协议,简单来说HTTPS=HTTP+SSL/TLS。服务端和客户端的信息传输都是通过TLS进行加密。这样就能在一定程度上避免敏感信息被截取。在通信过程中,请求方称为客户端,响应方称为服务端。HTTPS请求流程如图:1、客户端向服务端发送加密版本、加密算法种类、随机数信息等。2、服务端返回客户端发送的信息并带上服务端证书(公钥证书)。3、客户端效验服务端证书的合法性。4、...转载 2021-07-13 19:26:42 · 7218 阅读 · 0 评论 -
如何使用Java访问ssl双向认证的Https资源——三种方式(好文章!)
本文的相关源码位于https://github.com/dreamingodd/CA-generation-demo0.Nginx配置Https双向认证首先配置Https双向认证的服务器资源。可以参考:http://www.cnblogs.com/dreamingodd/p/7357029.html完成之后如下效果:1.导入cacerts进行访问首先将服务器证书导入keystore cacerts,默认密码为changeit,如果需要修改密码就改一下。keytoo..转载 2021-07-13 17:52:29 · 3377 阅读 · 0 评论 -
ssl证书CA双向认证完整实现步骤(附java客户端代码)(好文章!)
一、基础概念注:以下概念除专业名词外,均为个人理解,不具备权威性。1、什么是系统安全管理置于公网的系统,通常都需要一定的安全管理,据我个人理解,这里的安全管理主要分三个方面:一是应用内的权限控制,比如具体应用的用户名、密码等;二是应用数据传输过程中的安全机制,例如各种报文的加解密方案;三是数据传输前的通讯安全机制,保证通讯双方都是可靠可信任的,PKI就是其中一个解决方案。2、什么是PKIPKI是 Public Key Infrastructure的简称,意思是公钥基础设施。公钥基转载 2021-07-13 17:45:58 · 6262 阅读 · 0 评论 -
java使用keytool 的ssl证书的导入、查看与删除——彻底解决unable to find valid certification path to requested target(好文章!)
安装证书。一、下载证书第一步是要下载证书去你程序要访问的网站,点击那个锁按钮,并点击查看详情(chrome浏览器)点击View certificate点击详细信息复制到文件下一步选择格式生成的名称,最后保存这里我保存在的D盘根目录下叫abc.cer二、导入证书切换到jre的/lib/security/下执行如下命令keytool -import -alias abc -keystore cacerts -file转载 2021-07-13 17:19:43 · 4670 阅读 · 0 评论 -
关于getClass(),Object.class,getClassLoader的理解
1、对Class类的理解:Class类包含了类的信息,如构造方法、方法、属性,可用于反射。以下是所有方法2、获取Class类对象的几种方法:Test test = new Test();(1).test.getClass(); 在运行时确定,所以运行实例才是该类对象。super.getClass()不能获得父类的类对象,仍然是当前类对象。 获得父类类对象:test.getClass().getSuperclass()class Father{ public...转载 2021-07-08 13:13:08 · 484 阅读 · 0 评论 -
解决spring循环依赖的问题:has been injected into other beans——使用@Lazy(好文章!!)
首先说一下什么是依赖循环,比如:我现在有一个ServiceA需要调用ServiceB的方法,那么ServiceA就依赖于ServiceB,那在ServiceB中再调用ServiceA的方法,就形成了循环依赖。Spring在初始化bean的时候就不知道先初始化哪个bean就会报错。publicclassClassA{@AutowiredClassBclassB;} publicclassClassB{@AutowiredClassAclassA;} 解决办法是进...转载 2021-05-26 10:39:45 · 638 阅读 · 0 评论