![](https://img-blog.csdnimg.cn/20190918140145169.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
基础
文章平均质量分 79
java基础
桐花思雨
这个作者很懒,什么都没留下…
展开
-
public、private、default、protected的区别
【代码】public、private、default、protected的区别。原创 2022-10-31 20:04:17 · 423 阅读 · 1 评论 -
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 评论 -
使用 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 评论 -
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 评论 -
如何终止运行中的线程
目录`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 评论 -
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中的代码块
目录示例代码示例代码先看如下代码的执行结果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 评论 -
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 评论 -
线程之间的通信
目录什么是线程之间的通信线程之间的通信如何实现`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 评论 -
Java中的异常
目录前言异常的分类和类结构图前言程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?Java 提供了更加优秀的解决办法: 异常处理机制异常处理机制: 能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰Java 中的异常可以是函数中的语句执行时引发的,也可以是程序员通过 throw 语句手动抛出的,只要在 Java 程序中产生了异原创 2021-09-06 16:06:49 · 119 阅读 · 0 评论 -
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 评论 -
jdk动态代理实现原理
JDK 动态代理是什么在了解JDK动态代理前,有需要可以了解下代理模式参考:https://blog.csdn.net/yhl_jxy/article/details/52679882JDK 的动态代理是基于拦截器和反射来实现的JDK代理是不需要第三方库支持的,只需要 JDK 环境就可以进行代理,使用条件:必须实现 InvocationHandler 接口使用 Proxy.newProxyInstance 产生代理对象被代理的对象必须要实现接口JDK 动态代理简单实现使用 JDK 动态原创 2021-01-24 19:19:26 · 3805 阅读 · 2 评论 -
Java中的多态
目录什么是多态多态存在的前提条件为什么要用多态多态实现示例接口的引用指向了其接口的实现类对象父类的引用指向了子类对象(继承父类进行方法重写)同一个类中进行方法重载什么是多态概念:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性简单地说就是:父类的引用指向了子类对象,接口的引用指向了其接口的实现类对象多态存在的前提条件必须存在继承或实现关系为什么要用多态我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了代码重用多原创 2021-04-20 18:50:54 · 343 阅读 · 0 评论 -
Integer类的缓存机制
目录案列案列public class IntegerTest { public static void main(String[] args) { for (int i = 0; i < 150; i++) { Integer a = i; Integer b = i; System.out.println(i + ":" + (a == b)); } }}结果:从 12原创 2021-05-17 13:01:12 · 587 阅读 · 2 评论 -
lambda表达式学习使用实例
前言在对 Java8 发布的 Lambda 表达式进行一定了解之后,发现 Lambda 最核心的就是结合 Stream API 对集合数据的遍历、提取、过滤、排序等一系列操作的简化,以一种函数式编程的方式,对集合进行操作lambda 语法基本语法:(parameters) -> expression 或 (parameters) ->{ statements; }基本语法的具体示例:// 1. 不需要参数,返回值为 5 () -> 5 // 2. 接收一个参原创 2021-02-05 18:41:47 · 288 阅读 · 0 评论 -
Java中的JVM虚拟机
目录`JVM` 虚拟机的位置`JVM` 虚拟机的体系结构程序计数器虚拟机栈本地方法栈堆方法区运行时常量池每个区域存储的内容`HotSpot` 虚拟机的对象对象的创建对象的访问定位虚拟机的类加载机制类加载子系统的作用类加载的过程类加载器的体系类加载器的双亲委派模型`Java` 内存模型与线程`Java` 内存模型`volatile` 关键字`synchronized` 关键字JVM 虚拟机的位置JVM 是运行在操作系统之上的,它与硬件没有直接的交互JVM 虚拟机的体系结构程序计数器占用内存空间小原创 2021-04-07 16:55:53 · 1468 阅读 · 1 评论 -
数组与数组冒泡排序,选择排序
目录数组的创建数组的冒泡排序数组的创建public class ArrayTest { public static void main(String[] args) { // 第一种创建数组方式 int[] arr = new int[10]; int intValue = arr[1]; System.out.println(intValue); // 第二种创建数组方式 int[] array原创 2021-04-21 19:47:33 · 127 阅读 · 1 评论 -
数据结构之队列与栈
目录数据结构之队列简述数据结构之栈简述数据结构之队列简述队列 Queue 是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列的工作原理与现实生活中的队列完全相同。类似火车头进入山洞,先进入山洞的车厢就先出来山洞,后进入山洞的火车头后出来山洞。队列的工作原理与此相同队列是一种先进先出(First In First Out)的线性表,简称 FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。假设队列是 q = (a1,a2,…,an),那么 a1 就是队头元素,而 an 是队尾元素。原创 2021-05-26 20:22:12 · 83 阅读 · 0 评论 -
数据结构之链表
目录链表简介单向链表链表简介链表是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针使用链表结构可以克服数组需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大单向链表单链表是链表中结构最简单的。其数据在内存中存储是不连续的,它存储的数据是分散在内存中一个单链表的节点(Node)分为两个部分,一部分(data)保存关于节点原创 2021-05-17 23:01:24 · 528 阅读 · 0 评论 -
数据结构之树
树的定义树 (Tree) 是 n(n>=0)个结点的有限集。n=0 时称为空树。在任意一颗非空树中:有且仅有一个特定的称为根 (Root) 的结点当 n>1 时,其余结点可分为 m (m>0) 个互不相交的有限集 T1、T2、…、Tn,其中每一个集合本身又是一棵树,并且称为根的子树此外,树的定义还需要强调以下两点:n>0 时根结点是唯一的,不可能存在多个根结点,数据结构中的树只能有一个根结点m>0 时,子树的个数没有限制,但它们一定是互不相交的树的相关概念原创 2021-01-21 22:29:15 · 269 阅读 · 0 评论 -
数据结构之哈希表
目录哈希表简述几种典型数据结构特点哈希表简述散列表的英文名称为 hash table,因此散列表又被称为哈希表,散列函数又被称为哈希函数散列表通常基于数组来实现。借助散列函数对数组进行扩展,利用的是数组支持按照下标随机访问元素的特性存放数据的时候,散列函数根据 f(key) 计算出数据应该存储的位置即数组下标,从而将不同的数据分散在不同的存储位置,这也是散列的由来查找的时候,通过散列函数 f(key) 直接确定查找 hash 值所在位置即数组下标。而不需要一个个比较,直接找到数据,提升效率散列原创 2021-05-22 15:46:05 · 1023 阅读 · 0 评论 -
Java中的内存模型JMM与线程
目录计算机硬件内存架构计算机硬件内存架构CPU:一般在大型服务器上会配置多个 CPU,每个 CPU 还会有多个核,这就意味着多 个 CPU 或者多个核可以同时并行工作CPU Register:它是指 CPU 寄存器。CPU 寄存器是 CPU 已经内部集成的,在寄存器上执行操作的效率要比在主内存上高出几个数量级CPU Cache Memory:它是指 CPU 高速缓存。相对于 CPU 寄存器来说,通常也可以称为二级缓存。相对于硬盘读取速度来说它的读取的效率非常高,但是与 CPU 寄存器还是相差数量原创 2021-05-07 18:34:56 · 240 阅读 · 4 评论 -
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 评论 -
(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 评论 -
String、StringBuffer、StringBuilder的区别
java 中 String、StringBuffer、StringBuilder 是编程中常用的字符串类,他们之间的区别也是经常在面试中会问到的问题。现在总结一下,看看他们的不同与相同1:可变与不可变String 类中使用字符数组保存字符串,如下就是,因为有 final 修饰符,所以可以知道 string 对象是不可变的public final class String implements java.io.Serializable, Comparable<String>, Cha原创 2020-09-16 22:02:19 · 262 阅读 · 0 评论