Java ABC
文章平均质量分 70
Java基础知识
天然玩家
请大家不要再订阅了!!!如遇到专栏里可以解决您问题的文章,您可以私信我。为了保护之前订阅用户的权益,专栏内容依旧保留,但是不会再更新内容了。
展开
-
再谈StringBuilder为什么线程不安全以及带来的问题
StringBuilder多线程不安全是什么?造成多线程不安全的原因以及带来的后果?原创 2023-06-24 15:21:21 · 1698 阅读 · 0 评论 -
JUC包:CyclicBarrier源码+实例讲解
CyclicBarrier是如何实现线程等待,又如何实现线程重用,本文通过实践和源码的方式讲解。原创 2023-03-04 21:32:11 · 940 阅读 · 0 评论 -
JUC包:CountDownLatch源码+实例讲解
在多线程执行聚合任务时,我们知道使用CountDownLatch,但是,他是如何实现线程等待的呢?当某个线程出现异常,无法执行countDown又该如何处理呢?原创 2023-02-26 09:15:52 · 610 阅读 · 0 评论 -
Java基础:异常与错误(Exception&Error)
Java的Error和Exception是不同的,可以通过源码注释了解一二。而Exception可以分成三类:IOException、RuntimeException和ReflectiveOperationException,详见文章。原创 2023-02-15 15:10:06 · 1055 阅读 · 0 评论 -
Java基础:IO相关的类
(1)字节流:使用InputStream和OutputStream抽象类的子类;(2)字符流:使用Reader和Writer抽象类的子类;(3)File:文件和目录路径的抽象表达,用于操作文件和目录;(4)RandomAccessFile:随机写入和读取文件。原创 2023-02-07 17:57:06 · 1163 阅读 · 0 评论 -
Java基础:源码讲解Collection及相关实现List、Set、Queue
对于Collection,简单理解是根接口,提供通用方法,符合面向接口编程,常用的集合实现接口类有:List、Set和Queue,这些接口类的实现才是应用的重头戏。表面上看,List、Set和Queue都是单值类集合,但是,具体的封装实现还是有差异的,如使用NavigableMap、HashMap、LinkedHashMap以及Object[]存储元素,本文就从源码的角度解读集合Collection的实现。原创 2023-02-02 21:23:32 · 698 阅读 · 0 评论 -
源码讲解ThreadLocal父子线程通信问题(图+文+源码)
(1)ThreadLocal无法获取父线程数据,ThreadLocal获取数据时直接通过线程的threadLcoals属性获取ThreadLocalMap,由于Thread初始化时没有针对threadLocals进行操作,在子线程中,无法获取父线程的数据;(2)InheritableThreadLocal可以获取父线程数据,InheritableThreadLocal获取数据时通过线程的inheritableThreadLcoals属性获取ThreadLocalMap,由于Thread初始化时...原创 2023-01-04 14:59:16 · 1258 阅读 · 3 评论 -
实战讲解时区处理基于SimpleDateFormat和LocalDateTime
(1)全球分为24个时区,其中,包括零时区,东12区和西12区;(2)计时方式:UTC和GMT,精度有差异;(3)SimpleDateFormat处理时区,无法指定时间所在的时区,指定使用系统时区;(4)SimpleDateFormat处理UTC时区时,需要转换为GMT;(5)LocalDateTime可同时指定时间所在的时区和目标时区,可直接转换UTC时区时间。原创 2022-12-24 22:01:23 · 2764 阅读 · 0 评论 -
线上问题之Java数字范围引发的异常
(1)数据取值在对应的范围内,直接使用,超出范围,重新进行计算,并使用在数据范围内轮转;(2)数据轮转规则:绝对值按位取反;加1;变更符号。原创 2022-10-19 17:31:23 · 535 阅读 · 0 评论 -
实践讲解死锁及死锁检测(图+文+代码)
(1)死锁:多个线程间相互申请锁住对方尚未释放的资源,如对象,方法等,线程间依赖等待对方释放资源,造成的死循环。(2)Thread以标记弃用:Thread.suspend、Thread.resume和Thread.stop,因会造成死锁;(3)Thread停止推荐使用Thread.interrupt。原创 2022-10-09 11:52:07 · 1241 阅读 · 0 评论 -
源码硬讲HashMap结构及数据结构转换过程(图+文)
(1)HashMap由3种数据结构构成:数组、单向链表和红黑树;(2)数据结构转换过程:(2.1)key没有Hash冲突,则按照kv形式存储,如key2对应的形式;(2.2)key有Hash冲突且冲突的key个数小于7个,使用链表存储,如key1对应的形式;(2.3)key有Hash冲突且冲突的key个数大于等于7个,使用红黑树存储,如key3对应的形式。(3)红黑树转换时,先构建TreeNode数组,然后转换为红黑树,红黑树转换的核心方法为:treeify。原创 2022-09-20 17:27:13 · 533 阅读 · 0 评论 -
Log4j2配置属性详解(图+文+案例)
(1)Log4j2配置日志共有三个部分:Configuration、Appenders和Loggers,核心配置Appenders和Loggers;(2)Appenders配置日志持久化和控制台输出,Loggers日志拦截器,引用Appenders的配置,即生效持久化或控制台配置;(3)ThresholdFilter是层次性日志过滤,如需使用该过滤器提取某个级别的日志,需要配置多个ThresholdFilter,放在Filter中;可以使用LevelRangeFilter替代;原创 2022-09-17 09:37:55 · 533 阅读 · 0 评论 -
源码解析Java数组如何选择排序的算法
Java源码中的数组排序分两大类:(1)基础数据类型数组排序;(2)包装数据类型数组排序;这两类数组排序方法,都依据排序的数量量级选择不同的排序算法,以达到较优的计算性能。原创 2022-09-10 18:49:56 · 346 阅读 · 0 评论 -
反编译字节码分析java包装类型和引用类型及装箱与拆箱
(1)基础数据类型存储在栈中,直接申请内存,Java提供8中基础数据类型,int、long、float、double、boolean、char、byte和short;(2)包装类型:基础数据类型对应的类。在栈中存储引用,堆中存储数据;(3)装箱:将数据存储为对象,如Integer.valueOf()T;拆箱:将对象转为基础类型,如var1.intValue();(4)引用类型有三种:类、接口和数组,栈中存储引用,堆中存储实际内容。.........原创 2022-08-13 08:00:00 · 277 阅读 · 0 评论 -
实战详解java反编译字节码(操作指令助记符)
【新建对象分为4步】new:新建对象,在堆中为对象分配存储空间,并压入操作数栈顶;dup:复制栈顶部一个字长内容,入栈(此时栈有两个相同地址);invkespecial:构造函数调用初始化方法:()V,操作数栈顶弹出ByteCodeTest对象引用(dup);astore_1:从操作数栈顶取出ByteCodeTest对象存入局部变量1。【方法调用有5种方式:】invokespecial:调用当前类方法;invokevirtual:调用引入类的方法;invokeinterface:调用接口方法;......原创 2022-08-12 14:41:30 · 1915 阅读 · 0 评论 -
实践详解javap命令(反编译字节码)
(1)javap命令反汇编一个或多个class文件。输出依赖使用的参数,若不使用参数,直接使用javap命令会打印protected和public限定的类属性和方法。(2)javap命令不支持多版本jar。通过类路径形式使用javap命令只能查看当前jar文件的类文件反编译结果,通过URL形式使用javap命令只能查看指定版本类文件的反编译结果。(3)javap命令直接将结果打印到控制台。(4)常用查看汇编的命令:javap -c。......原创 2022-08-11 15:40:08 · 8875 阅读 · 0 评论 -
超详细讲解Redis基础类型String增删改查及加减数据(带Java库源码)
(1)增加数据: - 单条新增:直接新增:set,key不存在则新增,key存在则覆盖旧值; - 单条新增:条件新增:setnx,key不存在则新增,key存在不操作; - 批量新增:mset,msetnx; - 添加过期时间:setex,时间单位:秒,只能单条新增;(2)删除数据:可以单条也可批量删除;(3)修改:修改数据使用set或者mset,直接覆盖旧值。如果需要增加或减少数据,可以使用纯数字的数据,加一或减一,指定步长加或减;(4)查询数据:单条查询(get),返回单条数据;多条查询原创 2022-06-26 18:24:01 · 2947 阅读 · 0 评论 -
Java调用接口get,post
GetPost【参考文献】[1]https://blog.csdn.net/fsy9595887/article/details/84143573原创 2019-09-09 19:45:51 · 1854 阅读 · 0 评论 -
耐心读懂AQS节点入队操作
(1)AQS构造的队列为双向链表,先进先出原则;只能保证先入队先获取机会,不能保证一定成功,若失败, 则继续等待;(2)入队:新节点添加到队尾,使tail指向最新入队的节点,即每次新入队的节点都会用tail标识,保证,下一次有新节点入队时,可是通过tail直接找到,无需遍历,提高插入效率;(3)出队:设置head即可;(4)使用compareAndSetHead和compareAndSetTail保证自旋。原创 2022-05-13 12:23:56 · 1135 阅读 · 2 评论 -
final关键字的作用
final关键字:一次性成型,无法编辑。(1)提高性能;(2)多线程共享,无需额外同步开销;(3)JVM对final有优化;原创 2022-05-05 15:26:43 · 131 阅读 · 0 评论 -
详解ReentrantLock为什么是可重入锁
- 可重入,即一个线程可以多次(重复)进入同类型的锁而不出现异常(死锁);- ReentrantLock提供两类锁:公平锁和非公平锁;- 可重入是因为可重锁lock中核心逻辑:如果CAS,成功,则继续执行设置独占,setExclusiveOwnerThread;CAS失败,进入可重入逻辑;- 可重入执行逻辑入口:acquire(...),java.util.concurrent.locks.AbstractQueuedSynchronizer#acquire原创 2022-04-25 12:15:03 · 2571 阅读 · 0 评论 -
Java如何通过Thread创建多线程测试程序(不包括线程池)
- Java通过Thread创建线程可分为4类:(1)继承Thread,重写run方法;(2)在Thread中写方法,构建Runnable类型,通过`::`或者`()->`构建;(3)实现Runnable接口,重写run方法;(4)实现Callable接口,重写call方法。- 前三类无法获取方法返回值,第四类可以获取方法返回值。- 启动线程使用start方法,该方法执行时有两个线程工作,即调用start的当前线程和调用run方法的其他线程(new Thread创建的线程)。原创 2022-04-22 15:33:04 · 3190 阅读 · 0 评论 -
Java基础系列:读取yml文件
通过yml映射实体,直接实例化实体。原创 2022-04-01 17:30:53 · 9974 阅读 · 0 评论 -
Java基础系列:IO模型
- BIO:同步阻塞。服务端:一个连接一个线程,客户端有连接请求时,服务器随即启动一个线程进行处理。- NIO:同步非阻塞。服务端:一个请求一个线程,客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询连接有I/O请求时才启动一个线程进行处理。- AIO:异步非阻塞。服务端:一个有效请求一个线程,客户端的I/O请求,均有操作系统先完成,再通知服务器应用程序启动线程处理。原创 2022-03-23 16:51:11 · 1409 阅读 · 0 评论 -
Java基础系列:注解
注解:元数据。方便后续使用这些数据。(1)提供描述程序所需的额外信息。(2)提高代码易读性和简洁性。(3)编译期类型检查,可由编译器进行测试和验证注解的正确性,如标准注解@Override、@Deprecated、@SuppressWarngings。元注解:注解其他注解,修饰自定义的注解,使其按照既定的轨迹运行。原创 2022-03-21 11:41:50 · 496 阅读 · 0 评论 -
IDEA插件:协议生成插件Protobuf Generator
使用原生的协议生成类文件,需要每次查找命令,IDEA提供了插件可视化操作生成类文件。原创 2022-03-07 16:23:21 · 3275 阅读 · 0 评论 -
Java虚拟机默认参数
|序号| 参数 |默认值|--|--|:--| 1 | 最小堆空间(Xms/InitialHeapSize) |65.0M| 2 | 最大堆空间(Xmx/MaxHeapSize) |974.0M| 3 | 新生代空间 |20.5M| 4 | 最大新生代空间 |324.5M|5|老年代空间|41.5M||6|元空间(最小)|20.79M|7|垃圾回收器|UseParallelGC原创 2022-02-11 18:18:42 · 2075 阅读 · 0 评论 -
OpenJDK没有垃圾回收器
K8S中,使用openjdk:8-jdk-alpine作为基础镜像,启动服务后,查看垃圾回收器,发现,没有启动垃圾回收器。原创 2022-02-11 16:45:11 · 1352 阅读 · 0 评论 -
Java基础系列:httpclient请求GET和POST接口
本章讲解httpclient请求接口。原创 2022-01-12 15:50:16 · 1901 阅读 · 0 评论 -
Java基础系列:HttpURLConnection请求GET、POST接口
本章讲解:HttpURLConnection,该类继承URLConnection。原创 2022-01-12 15:48:43 · 4135 阅读 · 0 评论 -
Java基础系列:URLConnection请求POST和GET接口
Java原生请求接口:发送GET和POST请求。包:java.net.URLConnection原创 2022-01-11 20:04:49 · 2675 阅读 · 0 评论 -
Java基础系列:Class.forName、static及应用
(1)Class.forName(String name)生成指定类名或接口名的类对象(Class)。与方法等价:Class.forName(className, true, currentLoader),currentLoader即定义当前类的类加载器。(2)Class.forName:在方法区生成java.lang.Class对象。即类加载过程:通过全限定名获取类的二进制字节流,将二进制字节流转化为方法区的运行时数据结构。(3)生成Class对象后,即可执行不依赖对象的静态块代码,如MySQL驱动原创 2022-01-01 14:03:30 · 1363 阅读 · 0 评论 -
Java基础系列:泛型
(1)泛型:编译期检查类型,运行时忽略类型;(2)泛型应用于类、接口和方法;(3)类型安全,消除强制类型转换:泛型消除源码中的诸多强制类型转换,增加代码可读性;(4)减少重复代码:提高代码利用率,使用泛型后,兼容不同类型数据的逻辑处理。原创 2021-12-16 20:16:58 · 553 阅读 · 0 评论 -
Java基础系列:判断空指针的三种方式
空指针:针对对象类型,对象在堆中分配“房子”。空指针(null)的对象没有分配到“房子”,所以,无法使用该对象。使用任何的对象数据时,都要进行空指针判断。通用的方式有三种:(1)null显式判断(2)Objects.isNull(Object)隐式判断(3)CollectionUtils工具判断空指针和空数据原创 2021-12-16 20:02:19 · 8114 阅读 · 0 评论 -
Java基础系列:随机数及随机字符串
生成指定右区间的随机整数及指定范围和长度的随机字符串。原创 2021-12-01 20:29:35 · 608 阅读 · 0 评论 -
Java基础系列:JavaBean
Java BeanMBeanEJBJMX原创 2021-11-09 17:23:28 · 127 阅读 · 0 评论 -
synchronized与volatile的区别
- synchronized:保证可见性和原子性,线程安全;- volatile:保证可见性,不保证原子性,线程不安全。可见性:变量值修改后,立即更新到公共内存区,保证其他线程是可见的。原子性:一个线程从获取变量,到变更结束,不会被其他线程改变。原创 2021-11-01 19:36:16 · 228 阅读 · 0 评论 -
MySQL原生查询:查不到数据是如何判断的?
1 原生查询MySQL原生查询,结果存放在集合java.sql.ResultSet中。当查询的查询的数据不存在时,ResultSet集合为空。不会走ResultSet.next逻辑。封装的数据为空。因此,使用原生查询时,判断是否查到数据,根据封装的对象是否为空即可。如,将ResultSet遍历的结果存储在Map中,判断Map是否为空即可。2 测试样例package com.monkey.java_study.functiontest;import com.monkey.java_stud原创 2021-10-25 09:57:32 · 2074 阅读 · 0 评论 -
Google Protobuf基础系列:Builder与build
1 Builder与buildBuilder:新建对象,不初始化;build:初始化对象。2 生成协议2.1 协议内容syntax = "proto3";message User { string username = 1; string sex = 2; int32 age = 3; Team team = 4; repeated Team team_list = 5; message Team { string ceo原创 2021-10-24 09:19:49 · 3118 阅读 · 0 评论 -
Java基础系列:HashMap与null
1 插入数据1.1 插入null键/** * 添加null键. */ @Test public void mapPutNullKeyTest() { Map<String, String> map = new HashMap<>(); map.put(null, "test1"); String value = map.get(null); logger.info(">>原创 2021-10-19 16:34:17 · 1238 阅读 · 0 评论