![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 84
java基础
桐花思雨
这个作者很懒,什么都没留下…
展开
-
public、private、default、protected的区别
【代码】public、private、default、protected的区别。原创 2022-10-31 20:04:17 · 423 阅读 · 1 评论 -
线程池中线程抛了异常,该如何处理?
在实际开发中,我们常常会用到线程池,但任务一旦提交到线程池之后,如果发生异常之后,怎么处理?怎么获取到异常信息?在了解这个问题之前,我们知道程池的提交方式有。两种方式,接下来分别使用他们执行带有异常的任务!我们先用伪代码模拟一下线程池抛异常的场景。原创 2022-10-15 20:50:17 · 436 阅读 · 0 评论 -
HashMap的几种遍历方式及循环删除
HashMap遍历从大的方向来说,可分为以下4类迭代器Iterator方式遍历For Each方式遍历Lambda表达式遍历遍历但每种类型下又有不同的实现方式,因此具体的遍历方式又可以分为以下6使用迭代器的方式进行遍历使用迭代器的方式进行遍历使用的方式进行遍历使用的方式进行遍历使用Lambda表达式的方式进行遍历使用的方式进行遍历接下来我们来看每种遍历方式的具体实现代码。原创 2022-09-28 20:48:45 · 5085 阅读 · 4 评论 -
Jackson解析JSON详细教程
Jackson和FastJson一样,是一个Java语言编写的,可以进行JSON处理的开源工具库,Jackson的使用非常广泛,Spring框架默认使用Jackson进行JSON处理Jackson有三个核心包,分别是,通过这些包可以方便的对JSON进行操作在模块。定义了一些流处理相关的API以及特定的JSON实现在模块,包含了Jackson中的注解在模块,在Streaming包的基础上实现了数据绑定,依赖于Streaming和包得益于Jackson高扩展性的设计,有很多常见的文本格式以及工具都有对。....原创 2022-07-23 23:45:07 · 8613 阅读 · 2 评论 -
为什么HashSet中使用PRESENT而不是null作为value
无意之中碰到了这个问题,在此记录一下 的部分源码如下原创 2022-06-12 23:45:24 · 495 阅读 · 0 评论 -
使用 Optional 来替代 if 判空
目录1. 前言2. 认识 `Optional` 并使用2.1 `Optional` 对象创建1. 前言相信不少小伙伴已经被 Java 的 NPE(Null Pointer Exception) 所谓的空指针异常搞的头昏脑涨,有大佬说过“防止 NPE,是程序员的基本修养。”但是修养归修养,也是我们程序员最头疼的问题之一,那么我们今天就要尽可能的利用 Java 8 的新特性 Optional 来尽量简化代码同时高效处理 NPE(Null Pointer Exception)2. 认识 Optional 并原创 2022-05-21 15:42:11 · 2422 阅读 · 0 评论 -
JDK动态代理为什么必须要基于接口
目录1. 前言2. 一个简单的例子2.1. 定义接口2.2. 接口实现类2.3. 自定义 `Handler`2.4. 测试2.5. 输出结果1. 前言JDK 动态代理的应用还是非常广泛的,例如在 Spring、MyBatis 以及 Feign 等很多框架中动态代理都被大量的使用,可以说学好 JDK 动态代理,对于我们阅读这些框架的底层源码还是很有帮助的2. 一个简单的例子在分析原因之前,我们先完整的看一下实现 JDK 动态代理需要几个步骤,首先需要定义一个接口2.1. 定义接口public in原创 2022-03-13 15:07:33 · 5255 阅读 · 1 评论 -
守护线程与用户线程
目录基本概念基本概念在 Java 中通常有两种线程:守护线程(Daemon Thread)和用户线程(User Thread)守护线程:是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程、JIT 线程都是守护线程用户线程:可以理解为是系统的工作线程,它会完成这个程序需要完成的业务操作。如我们使用 Thread 创建的线程在默认情况下都属于用户线程...原创 2022-03-03 20:23:39 · 1738 阅读 · 0 评论 -
深入理解Thread.sleep()函数
目录前言回顾操作系统原理时间片算法抢占式操作系统前言我们可能经常会用到 Thread.sleep() 函数来使线程挂起一段时间。那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题假设现在是 2008-4-7 12:00:00.000,如果我调用一下 Thread.sleep(1000) ,在 2008-4-7 12:00:01.000 的时候,这个线程会不会被唤醒?某人的代码中用了一句看似莫明其妙的话:Thread.sleep(0) 。既然是 sleep 0 毫秒,那么他跟去掉这句代码相原创 2022-02-28 14:45:37 · 1573 阅读 · 0 评论 -
ArrayList的动态扩容机制
目录前言`ArrayList` 的动态扩容机制`ArrayList` 的主要属性`ArrayList` 的构造器`ArrayList` 的动态扩容小结初始容量动态扩容大小动态扩容大小测试前言对于 ArrayList 的动态扩容机制想必大家都听说过,之前的文章中也谈到过,不过由于时间久远,早已忘却。所以利用这篇文章做做笔记,加深理解记忆ArrayList 的动态扩容机制要了解其动态扩容机制就必须先看它的源码,源码是基于 jdk 1.8 的ArrayList 的主要属性// 如果不指定容量(空构造器原创 2022-02-26 13:15:28 · 1548 阅读 · 0 评论 -
Java中的线程池回顾总结
目录线程池介绍线程池的优势线程池的状态线程池介绍线程池的优势降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁所造成的系统资源消耗提高系统响应速度,当有任务到达时,通过复用已存在的线程,任务可以不需要等待新线程的创建便能立即执行提高线程的可管理性,方便线程并发数的管控。如果线程无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,可能也会导致内存占用过多而产生 OOM提供更强大的功能,延时定时线程池线程池的状态ThreadPoolExecutor 类中使用 int 的高 3 位原创 2022-01-23 21:37:34 · 552 阅读 · 0 评论 -
List和数组的相互转换
目录`List` 转数组List 转数组public class TestMain { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("aa"); list.add("bb"); list.add("cc"); list.add("dd"); // 第原创 2022-01-23 19:54:26 · 14508 阅读 · 0 评论 -
HashMap为什么是线程不安全的
目录`HashMap` 的线程不安全`HashMap` 中的 `put()` 方法HashMap 的线程不安全HashMap 的线程不安全主要体现在下面两个方面在 jdk 1.7 中,当并发执行扩容操作时会造成环形链和数据丢失的情况在 jdk 1.8 中,在并发执行 put 操作时会发生数据覆盖的情况对于 jdk 1.7 中 HashMap 的线程不安全,暂且不谈了,我们主要看看 jdk 1.8 中的HashMap 中的 put() 方法该 put() 方法是 jdk 1.8 中的pub原创 2022-01-19 22:21:30 · 493 阅读 · 0 评论 -
ConcurrentHashMap是如何实现线程安全的
目录前言`ConcurrentHashMap` 是如何实现线程安全的初始化数据结构时的线程安全前言我们知道,在日常开发中使用的 HashMap 是线程不安全的,而线程安全类 HashTable 和 SynchronizedMap 只是简单的在方法上加锁实现了线程安全,效率低下,所以在线程安全的环境下我们通常会使用 ConcurrentHashMap,那么 ConcurrentHashMap 又是如何实现线程安全的呢?ConcurrentHashMap 是如何实现线程安全的针对这个问题,可以从以下几原创 2022-01-17 13:58:58 · 7793 阅读 · 3 评论 -
关于Arrays.asList()方法的使用
Arrays.asList 创建的 ArrayList 的使用Arrays.asList() 方法生成的 ArrayList 类对象,在调用 add(),remove() 等方法时会报错public static void main(String[] args) { List<String> list = Arrays.asList("Java", "C++", "Python"); list.add("C#");}通过源码分析 Arrays.asList() 生成的 Array原创 2022-01-15 13:54:18 · 2801 阅读 · 0 评论 -
如何终止运行中的线程
目录`Java` 中如何终止运行中的线程Java 中如何终止运行中的线程Java 中终止线程,通常意味着在线程处理任务完成之前停掉正在做的操作,也就是放弃当前的操作,在 Java 中有以下 3 种方法可以终止正在运行的线程使用退出标志,使线程正常退出,也就是当 run() 方法完成后线程中止使用 stop() 方法,已被弃用。原因是:stop() 是立即终止,会导致一些数据被到处理一部分就会被终止,而用户并不知道哪些数据被处理,哪些没有被处理,产生了不完整的“残疾”数据,不符合完整性,所以被废弃原创 2022-01-08 20:58:21 · 1055 阅读 · 0 评论 -
main方法能重载么?能被其他方法调用么? 能继承么?
目录`main` 方法的格式main 方法的格式public static void main(String[] args) {}public:main 方法在启动的时候由 JVM 进行加载的,public 的可访问权限是最高的,所以需要声明为 publicstatic:方法的调用要么是通过对象,要么是通过类,而 main 方法的话因为是由虚拟机调用的,所以无需生成对象,那么声明为 static 即可main:至于为什么方法名称叫 main,我想应该是参考的是 C 语言的方法名吧void原创 2021-12-31 16:50:21 · 930 阅读 · 0 评论 -
Java泛型通配符T,E,K,V
目录前言泛型带来的好处前言Java 泛型是 JDK 1.5 中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数泛型带来的好处在没有泛型的情况的下,通过对类型 Object 的引用来实现参数的 任意化,任意化 带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是本身就是一个原创 2021-12-08 17:43:20 · 534 阅读 · 0 评论 -
Comparable接口和Comparator接口
目录前言`Comparable` 接口前言在实际应用中,我们往往有需要 比较两个自定义对象 大小的地方。而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的。所以 Java 中要 比较对象的大小 或者要 对对象的集合 进行排序,需要通过比较这些对象的某些属性的大小来确定它们之间的大小关系一般 Java 中通过接口来实现两个对象的比较,比较常用就是 Comparable 接口和Comparator 接口Comparable 接口原创 2021-12-06 23:51:09 · 697 阅读 · 0 评论 -
finally语句与return语句相关问题
目录`finally` 语句块`finally` 语句与 `return` 语句执行的顺序finally 语句块finally 语句块一般和 try-catch 代码块搭配一起使用,finally 语句块不管 try-catch 中的异常是否发生,只要对应的 try 执行了,则它一定也执行。 finally 语句块通常用来做资源释放操作,关闭文件,关闭数据库连接等finally 语句与 return 语句执行的顺序public class FinallyTest { public stat原创 2021-10-18 19:02:29 · 153 阅读 · 0 评论 -
递归与循环
目录递归的简介递归与循环的区别递归的简介递归:递归的基本思想就是 自己调用自己,一个使用递归技术的方法将会直接或者间接的调用自己递归尽头:什么时候不调用自己,如果没有头,将陷入死循环。就算没有递归头,java 中递归不会无限的递归下去,递归太深,堆栈内存会溢出递归与循环的区别...原创 2021-10-18 18:14:10 · 161 阅读 · 0 评论 -
String类的常用方法
目录`String` 的常用方法字符串的查找字符串的比较String 的常用方法字符串的查找// 判断指定内容是否存在,返回布尔,jdk1.5之后才有public boolean contains(String s)// 由前向后查找指定位置,返回整型,表示存在的具体索引位置(第一个字符位置),jdk1.5之前就有,没找到就返回-1public int indexOf(String str)// 从指定位置查找某字符串的指定位置,找到就返回第一个字符的位置,找不到就返回-1,这是index原创 2021-10-18 00:12:06 · 75 阅读 · 0 评论 -
i++与++i
目录`i++` 与 `++i` 的区别示例i++ 与 ++i 的区别i++:先赋值,再相加++i:先相加,再赋值示例public class Demo { public static void main(String[] args) { int i = 1; int k = i++; int j = ++i; System.out.println("k=" + k); // 结果: k=1 Syste原创 2021-10-17 23:59:33 · 76 阅读 · 0 评论 -
Java并发之Condition接口
目录`Condition` 接口简介Condition 接口简介任意一个 Java 对象都拥有一组监视器方法(定义在 java.lang.Object 上),主要包括 wait()、wait(long timeout)、notify() 以及 notifyAll() 方法,这些方法与 synchronized 同步关键字配合,可以实现线程之间的等待,通知(通信)Condition 接口也提供了类似 Object 的监视器方法,与 Lock 配合也可以实现线程之间的等待,通知(通信),但是这两者在使用方原创 2021-10-06 13:27:22 · 240 阅读 · 0 评论 -
Java中的代码块
目录示例代码示例代码先看如下代码的执行结果public class CodeBlock { public static void main(String[] args) { new Test(); System.out.println("----------------"); new Test("1"); }}class Test { // 构造代码块 { System.out.println("原创 2021-10-05 16:57:43 · 77 阅读 · 0 评论 -
Java中的DES加密与解密工具类
DES 加密与解密工具类/** * DES 加密与解密(主要用于数据库的存储与解密) */public class DesUtil<BASE64Encoder> { private SecretKey key = null;// 密钥 // 定义加密算法,可用(DES,DESede,Blowfish,AES)不同的加密方式结果会不同 private static String algorithm = "AES"; private static DesUtil de原创 2021-10-02 17:34:27 · 517 阅读 · 0 评论 -
Semaphore源码解读
目录`Semaphore` 概述`Semaphore` 源码类图构造器及内部类Semaphore 概述Semaphore 来自于 JDK 1.5 的 JUC 包,直译过来就是 信号量,被作为一种多线程并发控制工具来使用Semaphore 可以控制同时访问共享资源的线程个数,线程通过 acquire() 方法获取一个信号量,信号量减一,如果没有就等待;通过 release() 方法释放一个信号量,信号量加一它通过控制信号量的总数量,以及每个线程所需获取的信号量数量,进而控制多个线程对共享资源访问的并原创 2021-09-22 12:48:27 · 226 阅读 · 0 评论 -
Java中的反射与JDK动态代理
目录反射的概述反射的概念反射的前提反射的概述反射的概念Java 反射机制是在 运行状态 中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释。一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作Apple apple = new Ap原创 2021-09-17 14:19:10 · 2296 阅读 · 1 评论 -
Java中的类加载器ClassLoader
目录类加载机制的层次结构类加载机制的层次结构每个编写的 .java 拓展名类文件都存储着需要执行的程序逻辑,这些 .java 文件经过 Java 编译器编译成拓展名为 .class 的文件,.class 文件中保存着 Java 代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的 .class 文件,并创建对应的 class 对象,将 class 文件加载到虚拟机的内存,这个过程称为类加载,这里我们需要了解一下类加载的过程,如下...原创 2021-09-14 23:28:23 · 121 阅读 · 0 评论 -
Java中的泛型
目录前言泛型类定义及使用前言在日常的开发中,我们会看到别人的框架很多地方会使用到泛型,泛型是 Java SE 1.5 的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。泛型的类型参数只能是类类型(包括自定义类),不能是简单类型泛型类定义及使用使用泛型有什么好处呢?首先我们先看一个例子,假设我们有两个类public class StringClass { private String原创 2021-09-14 13:04:50 · 2487 阅读 · 0 评论 -
(String)、toString()、String.valueOf区别
目录前言代码示例基本类型前言将对象转为 String 常用的方法有:(String) 要转换的对象,Object.toString(),String.valueOf(Object) 等代码示例基本类型基本类型是没有 toString() 方法的推荐使用 String.valueOf() 方法public class StringTest { public static void main(String[] args) { int a = 10; S原创 2021-09-12 23:57:59 · 174 阅读 · 0 评论 -
线程之间的通信
目录什么是线程之间的通信线程之间的通信如何实现`join()`什么是线程之间的通信线程一旦开始运行,就会拥有自己独立的栈空间,那多个线程如何相互配合完成工作,这就涉及到了线程间的通信线程之间的通信:是使线程间能够互相发送信号,使线程能够等待其他线程的信号。比如线程 A 在执行到某个条件时,通知线程 B 再执行某个操作,我们希望多个线程协同工作来完成某个任务线程之间的通信如何实现join()需求说明:假设有 A,B,C 三个线程,要求三个线程分别依次打印 1~3 三个数字。针对这个需求,要求线程原创 2021-09-10 09:21:40 · 2576 阅读 · 0 评论 -
Thread类中的常用方法
目录`Thread` 类中的常用方法`join()``join()` 应用示例Thread 类中的常用方法join()join() 方法是 Thread 类中的一个方法,该方法的定义是等待该线程终止。其实就是 join() 方法将挂起调用线程的执行任务,直到被调用的对象完成它的执行任务join() 应用示例现在有 T1、T2、T3 三个线程,你怎样保证 T1 执行完成后 T2 才执行,T2 执行完后 T3 执行?这个问题是网上很热门的面试题目(这里除了用 join() 之外还有很多其他方法能够实现原创 2021-09-09 20:45:13 · 290 阅读 · 0 评论 -
Object类中的wait()和notify()
目录前言线程之间的通信实现`Thread` 类的 `join()`前言线程一旦开始运行,就会拥有自己独立的栈空间。正常情况下,每个子线程完成各自的任务就可以结束了。不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了线程间的通信:使线程间能够互相发送信号,等待其他线程的信号。比如线程 A 在执行到某个条件时通知线程 B 执行某个操作线程之间的通信实现Thread 类的 join()public final void join() throws InterruptedE原创 2021-09-09 00:27:47 · 422 阅读 · 0 评论 -
线程的创建方式及Runnable与Callable的区别
目录线程的创建方式及 Runnable 与 `Callable` 的区别线程的创建方式继承 `Thread` 类实现 `Runnable` 接口`Runnable` 与 `Callable` 的源码线程的创建方式及 Runnable 与 Callable 的区别线程的创建方式线程的创建方式继承 Thread 类实现 Runnable 接口实现 Callable 接口线程池创建线程继承 Thread 类public class ThreadTest extends Thread {原创 2021-09-07 20:12:05 · 378 阅读 · 0 评论 -
Java中的异常
目录前言异常的分类和类结构图前言程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?Java 提供了更加优秀的解决办法: 异常处理机制异常处理机制: 能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰Java 中的异常可以是函数中的语句执行时引发的,也可以是程序员通过 throw 语句手动抛出的,只要在 Java 程序中产生了异原创 2021-09-06 16:06:49 · 119 阅读 · 0 评论 -
为什么阿里巴巴禁止在foreach里进行集合(List、Map)元素的remove/add操作
目录`list` 遍历删除元素的问题问题案列一原因分析问题案列二原因分析`modCount` 和 `expectedModCount``list` 遍历删除元素的正确方法倒序移除`foreach` 遍历删除时使用 `CopyOnWriteArrayList`迭代器遍历移除`jdk 1.8` 写法list 遍历删除元素的问题问题案列一public class ArrayTest { public static void main(String[] args) { List<原创 2021-09-04 18:01:55 · 1042 阅读 · 1 评论 -
Java中的IO流
目录初识 `IO` 流`IO` 流的分类初识 IO 流IO:即 in 和 out,也就是输入和输出,指应用程序和外部设备之间的数据传递流(Stream):是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中 流 动一样IO 流的分类...原创 2021-09-03 19:49:30 · 174 阅读 · 0 评论 -
hashCode()和equals()的若干问题
目录`equals()` 的作用equals() 的作用equals() 的作用是:用来判断两个对象是否相等equals() 是 Object 类中的方法。通过判断两个对象的地址是否相等来区分它们是否相等public boolean equals(Object obj) { return (this == obj);}这就意味着所有的 Java 类都拥有了 equals() 方法,所有的类都可以通过 equals() 去比较两个对象是否相等但是使用默认的 equals() 方法,它原创 2021-08-30 17:20:03 · 209 阅读 · 0 评论 -
StringUtils工具类中isEmpty和isBlank的用法区别
简述StringUtils 工具类是在 org.apache.commons.lang3 包中常用的工具类;另外 Spring 也有一个StringUtils 工具类,但它在org.springframework.util 包中,此处不再赘述。我们只总结 org.apache.commons.lang3 包中 StringUtils 工具类的一些常用方法及区别...原创 2021-08-05 17:58:03 · 1040 阅读 · 4 评论