Java基础
文章平均质量分 88
对java基础知识的整理
落英神剑碧海潮生
桃花影落飞神剑,碧海潮生按玉箫
展开
-
CaffeineCache基本使用 & SpringBoot集成缓存
文章目录一、常用API二、缓存回收(清除):1. 显式回收2. 隐式回收2.1 基于容量2.2 基于时间2.3 基于引用2.4 基于权重三、刷新缓存(reload)四、监听器五、外部存储本地缓存相比Redis缓存以及其他存储避免了网络IO的开销,而且基于内存的读写效率很高,所以在需要的时候合理使用本地缓存可以有效提高系统的吞吐量。CaffeineCache是非常优秀的开源本地缓存框架。本篇不分析其原理,只关注其简单用法。<dependency> <groupId>co原创 2021-11-28 18:58:16 · 4760 阅读 · 0 评论 -
Java中的加解密
一、Base64编码Base64,它是一种编码方式,算不上一种加密算法。它就是使用64个可打印字符来表示二进制数据的方法。Base64一般用于在HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换为字符数据。然而直接转换是不行的,此时可以将子节序列用Base64编码。Java提供了Base64的编解码器,直接使用即可。public class Base64Test { public static final Base64.Encode原创 2021-11-23 20:53:21 · 877 阅读 · 0 评论 -
Java读写Excel
一、Excel基本概念Workbook:工作簿,代表一个Excel文件。Excel分为两种,后缀名为xls的HSSFWorkBook(2003版本及以前),和后缀名为xlsx的XSSFWorkBook(2007版本及以后)Sheet:表格,一个Workbook中可以有多个表格。Row:行(通过Sheet可以获取到某一行)Col:列(通过Row可以获取到某个单元格)Cell:单元格(单元格中存放数据)apache提供了poi可供我们操作Excel文件,需要引入依赖如下:<depende原创 2021-11-23 10:59:18 · 5127 阅读 · 0 评论 -
Java8 函数式编程
函数式编程:这里“函数”应该理解为数学上的函数,即y=f(x)。函数式编程的理解出发点,比如给Swing中Button添加监听器addListener(Listener接口)为例,没有lambda表达式时一般都是通过匿名内部类new XXXListener()做,由于Java一切皆对象,所以我们传递了一个监听器对象。但是这块语义层面,传递对象并不是最终目的,我们的最终目的就是想传递一个“行为”(比如用户点击Button后的行为),所以采用Lambda表达式这种简洁写法只是在语义层面能够更好一些,本质还.原创 2021-09-20 18:03:46 · 2300 阅读 · 0 评论 -
【读书笔记】改善Java程序的151个建议
1.三元操作符的类型必须一致三元操作符是if-else的简化写法,它被使用的比较频繁。在Java中三元操作符中非常需要注意的问题就是类型转换,隐式的拆装箱问题。对于类型转换,规则如下:若两个操作数不可转换,则不做转换,返回值为Object类型。 若两个操作数是明确类型的表达式(比如变量),则按照正常的二进制数字来转换,int类型转换为long类型,long类型转换为float类型等。 若两个操作数中有一个是数字S,另外一个是表达式,且其类型标示为T,那么,若数字S在T的范围内,则转换为T类型;若原创 2021-01-25 20:36:28 · 377 阅读 · 0 评论 -
ThreadLocal总结整理
概述:ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量,ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程上下文。ThreadLocal的作用:提供线程内的局部变量,不同的线程之间不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂度。一个简单示例:public class Threa.原创 2020-07-08 13:41:15 · 270 阅读 · 0 评论 -
CopyOnWriteArrayList
CopyOnWriteArrayList是java.util.concurrent包下的一个类。与ArrayList的最大区别是,ArrayList不能保证线程安全,这个就相当线程安全版的ArrayList。写入时复制什么叫写入时复制? 表达上我不是很在行。从网上复制出一段话。解释的很清楚了。如下:写入时复制(CopyOnWrite,简称COW)思想是计算机程序设计领域中的一种优化策略。其核心思想是,如果有多个调用者同时要求相同的资源(如内存或者是磁盘上的数据存储),他们会共同获取相同..原创 2020-07-14 12:34:06 · 142 阅读 · 0 评论 -
模拟LinkedList
链表结构链表是由一系列结点node (链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分: 一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域(链域)。我们常说链表有两种:单向链表和双向链表。多个结点之间,通过地址进行连接。 特点:查询慢,增删快。双向链表的节点既要能连接前一个节点,还要能连接下一个节点。LinkedList的数据结构就是不带头结点的双向链表双向链表示意图(不带头结点)定义接口IList(规范行为)publ...原创 2020-07-13 12:33:38 · 147 阅读 · 0 评论 -
ArrayList源码学习(JDK1.8)
ArrayList使用数组来操作数据属性成员和构造方法:看一下三种构造方法源码。注意两个属性EMPTY_ELEMENTDATA和DEFAULTCAPACITY_EMPTY_ELEMENTDATA这两个都是static final修饰的空数组。API里面介绍无参构造是创建一个默认初始容量为10的集合。其实无参构造实例化成功之后,底层数组还是空数组。并不是容量为10的。源码里面也很清楚。源码是纯纯的拷贝的ArrayList的,只是方便我查看和操作就自己建了一个使用。public class A.原创 2020-07-12 15:35:19 · 112 阅读 · 0 评论 -
HashMap源码学习(JDK 1.8)
什么是hash?把任意长度的输入通过一个hash算法之后,映射成固定长度的输出。在这个过程中会产生一种情况,就是两个不同的值通过hash算法计算出的结果是相同的,这个就是造成了哈希冲突。hash冲突理论上是无法避免的,只能说尽量取避免它。比如说通过该hash算法计算出来的值区间为[m , n] 。 但是现在有(n- m)* 2 个值要用该hash算法计算,那总会造成冲突。以String类来打个比方,String重写了Object类的hashCode() , 该方法返回的是一个int类型的值,也就是.原创 2020-07-26 18:38:12 · 161 阅读 · 0 评论 -
线程池---ThreadPoolExecutor
线程池的优势Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁的消耗。比如BIO编程过程中,需要利用线程来解决阻塞问题,如果不用线程池,那么可能会造成很多线程被频繁的创建和销毁,这个时候就可以利用线程池。 提高响应速度。当任务到达时,任务不需要等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还原创 2020-12-20 23:49:46 · 258 阅读 · 0 评论 -
Java中的阻塞队列
什么是阻塞队列?首先它是一个队列,满足FIFO的特性,它可以保证多线程情况下元素存取的安全。Java中阻塞队列的具体实现都实现了BlockingQueue<E>接口。该接口中定义了除过常规队列的操作之外,还支持阻塞式的插入和移除。支持阻塞的插入方法:当队列已满时,如果某个线程要进行插入操作,那么该线程会被阻塞直到队列不满。 支持阻塞的移除方法:当队列为空时,如果某个线程要进行移除操作,那么该线程会被阻塞直到队列不为空。阻塞队列常用于生产者和消费者的场景,生产者是想队列里面添加元.原创 2020-12-10 15:15:55 · 401 阅读 · 0 评论 -
Java并发队列同步器(AQS)
队列同步器(AbstractQueuedSynchronizer)它是用来构建锁或者其他同步组件的基础框架,他使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态。同步器自身并没有实现任何同步接口,他仅仅是定义了若干同步状态获取和释放的方法来供自定义同步组件使用,同步器支持独占/共享两种模式获取同步状态,这样就可以方便实现不同类型的同步组件(如:ReentrantLock、Ree.原创 2020-12-07 19:56:25 · 140 阅读 · 0 评论 -
字节码对象和类加载器getResourceAsStream区别
再学习MyBatis的时候学习到的一个小知识点。使用MyBatis需要先加载全局配置文件。然后在程序中将该文件的资源路径传递过去。由于习惯的原因,刚开始的时候写的路径如下:String resource = "/SqlMapConfig.xml";InputStream inStream = Resources.getResourceAsStream(resource);运行程序发现报错:资源没找到。点进去源码是这样定义的:InputStream getResourceAsStre原创 2020-07-31 10:35:47 · 337 阅读 · 0 评论 -
AOP思想
AOP: Aspect Oriented Programming --面向切面编程面向切面编程不是来替代面向对象编程,而是对面向对象编程一种补充。举个例子理解面向切面编程。假如现在要测试一个方法的执行性能。可以这样做:在方法开始出获取时间,在方法末尾获取时间计算时间差,这样确实是一种方案,不过这样做会污染该方法的源码。就算在方法外部,即计算执行前和执行后的时间差,这种也是纵向进行的,面向切面编程是横向的思想。切入到方法中,横切进去。这样不会污染源代码。作用它可以在在不修改源代码的前提.原创 2020-07-22 01:08:34 · 180 阅读 · 0 评论 -
泛型擦除机制
伪泛型原理java泛型被称为伪泛型,主要是因为在编译期间,所有的泛型信息都会被擦除掉。整个java泛型都是在编译器层次实现的。伪泛型的内部原理就是:泛型擦除。使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉。这个过程就称为泛型擦除。(生成的Java字节码中是不包含泛型中的类型信息的)泛型擦除之后,泛型的类型会变成其原始类型。原始类型:原始类型顾名思义就是没有泛型的最初类型,即擦除去了泛型信息,最后在字节码中的类型变量的真正类型。无论何时定义一个泛型类型,相应的原始类型都会被自原创 2020-07-18 01:34:13 · 637 阅读 · 0 评论 -
DOM解析XML文件
DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM 接口的机制也被称作随机访问机制。对于XML应用开发来说, DOM就是一个对象化的XML数据接口,一个与语言无关、与平台无关的标准接口规范。它定义了HTLM文档和XML 文.原创 2020-07-16 23:43:32 · 593 阅读 · 0 评论 -
动态代理自定义数据库连接池
频繁地创建和销毁数据库连接是非常耗时的,有时候我们拿到连接甚至只执行一条sql语句,却要创建销毁一次连接,其实单单创建和销毁一个连接,远远比执行ji'tai原创 2020-07-14 16:23:23 · 237 阅读 · 0 评论 -
【常用类】String
String这个类底层使用的是char[]数组,它的一些方法实质上是对char[]数组的操作String的属性private final char value[];private int hash; // Default to 0private static final long serialVersionUID = -6849794470754667710L;可以清晰的看到String类中维护了一个char[] value数组。 另一个hash主要是用来生成字符串的hashCode..原创 2020-07-13 22:02:11 · 102 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier和Semaphore的基本使用
CountDownLatch允许一个或多个线程等待直到在其他线程中执行的一组操作完成之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。不使用CountDownLatch的示例:public class CountDownLatchTest { public static void main(St.原创 2020-07-11 00:52:29 · 177 阅读 · 0 评论 -
浅谈Java中的锁
今天看了尚硅谷阳哥的视频赶紧记录一下笔记。虽然现在学的还不是很深入,以后学到新的东西再慢慢总结,先理解一下基本理论概念。公平锁/非公平锁公平锁:在并发环境中,每个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列中,以后会按照FIFO的规则从队列中取到自己。非公平锁:是指多个线程获取锁的顺序并不是按照申请锁的顺序,上来就直接尝试占有锁,有可能后申请的线程比先申请的线程优先获取锁,如果尝试失败,就再采用类似公平锁那种方式。排到队尾..原创 2020-07-10 22:06:11 · 135 阅读 · 0 评论 -
CAS
CAS(compare and swap比较和交换)它是一条CPU并发原语。它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。在没有锁的状态下,在多线程访问的时候,可以保证线程一致性地去改动某一个值。通过一个例子来解释“比较和交换 ”的意思public class Test01 { public static void main(String[] args) { //主物理内存的值5 AtomicInteger atomicInteger = ne原创 2020-07-10 13:05:50 · 106 阅读 · 0 评论 -
轻松理解volatile
volatile是Java虚拟机提供的轻量级的同步机制,volatile的特性:保证可见性,不保证原子性,禁止指令重排。在介绍volatile之前先了解一个概念:JMM。JMM(Java内存模型Java Memory Model):它本身是一种抽象的概念并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。JMM关于同步的规定:线程解锁前,必须把共享变量的值刷新回主内存 线程加锁前,必须读取主内存的最新值到自己原创 2020-07-09 19:00:14 · 796 阅读 · 0 评论 -
多线程基础
基本概念:进程:正在运行的程序,是系统进行资源分配和调用的独立单位。每一个进程都有它自己的内存空间和系统资源。线程:是进程中的单个顺序控制流,是一条执行路径,一个进程如果只有一条执行路径,则称为单线程程序。一个进程如果有多条执行路径,则称为多线程程序。线程必须依赖于进程Java中创建线程简单示例:public class ThreadTest01 extends Thread{ @Override public void run() { //将要该线程运行的代码放在run方法中执行原创 2020-07-09 01:39:14 · 130 阅读 · 0 评论 -
IO流整理
IO流概述:IO流是实现设备之间的数据传输(文件的上传和下载)数据从一个设备流向另一个设备。硬盘对硬盘,一台主机对另一台主机都是可以的。IO流分类:在Java中以数据角度来分类可分为:字符流和字节流。字符流:一次操作两个字节, java中char占两字节,一次操作16个二进制位,他会默认查询本机编码表,只能操作文本文件。输入流的超类: Reader (抽象类) 子类:FileReader、BufferedReader等 输出流的超类: Writer(抽象类) ...原创 2020-06-25 00:40:52 · 154 阅读 · 0 评论 -
【编写工具】包扫描工具
包扫描使用场景:在开发中,通常用使用注解来完成相关内容的配置。如果用注解方式来完成相关的映射关系,往往是在类,成员,方法上写上相关的注解。在有些情况下我们需要自动的得到这些注解信息。但是这就产生一个问题,如何自动的将这些类中的想关信息扫描一遍?现在希望是能否直接给个包名字,直接将该包下所有类能获取到并且完成遍历。扫描普通包非常容易,我们只需要递归来遍历出对应的文件即可,可是我们的类要正常运行有时候需要jar包的支撑,但是如何扫描到jar包中的文件呢?先可以来做一个测试:public cl.原创 2020-06-22 22:18:03 · 258 阅读 · 0 评论 -
【常用类】File类
File类概述:该类将文件,文件夹,路径封装成对象,并提供相应方法来操作文件文件夹,路径。两组静态成员:static String pathSeparator 和 static char pathSeparatorChar 都是与系统相关的路径分隔符(一个路径与下一个路径的分隔)在 Windows下为 ; Linux下为 :separator 和 separatorChar 表示与系统相关的名称分隔符。 Windows下为 \ Linux /构造器:最常用到的File...原创 2020-06-22 19:41:39 · 163 阅读 · 0 评论 -
JAVA基本数据类型与byte互相转换(位运算,原码,补码)
最近整理了之前的一些知识,做了一个java中byte类型与int ,long转换以及将字节信息表示成字符串形式的工具。对前面的只是做了一下复习整理。原码、反码、补码:首先这三者都是二进制码即(0,1组合)。原码:最高位为符号位,0表示正数,1表示负数,剩余部分表示真值。反码:正数的反码是他本身,负数的反码是在原码基础上符号位不变,其余部分按位取反。补码:反码基础上末位加1。举个例子(以数值-8的单字节表示为例):原码:1000 1000(红色为符号位,其余所有位组成数值)反码原创 2020-06-19 23:16:50 · 1458 阅读 · 0 评论 -
JDBC技术(三)工具的封装
为了改善之前的增删改查操作,故做了一个小工具。只展示个别方法,道理都是一样的。这个BaseDao<T>是通用的底层,将其写成抽象方法的原因是只想让他被继承(该类中没有抽象方法)。其实核心原因是想在构造方法中能成功获取到泛型的实体类型。对下面代码的构造方法中内容引出来的一些基础知识点:关于this:若存在继承关系,则不管是子类还是父类,this指的都是那个new出来的对象实例。关于this.成员 和 this.方法 先在本类中找有没有,如果没有则沿着继承关系往上找。故B...原创 2020-06-18 13:24:30 · 196 阅读 · 0 评论 -
JDBC技术(二)事务初识 数据库连接池
接上篇JDBC技术(一)JDBC基础入门封装了JdbcUtils工具:public class JdbcUtils { private static String driverClass = null; private static String url = null; private static String userName = null; private static String password = null; public static void scanf(String原创 2020-06-17 21:49:39 · 168 阅读 · 0 评论 -
JDBC技术(一)JDBC基础入门
JDBC概述:Java DataBase Connectivity Java数据库的连接。目的使用Java的代码来操作数据库 需要使用JDBC(Java数据库的连接)规范来操作数据JDBC规范:JDBC是一套接口规范,为访问不同的数据库提供了一种统一的途径。 JDBC的实现类都是由各个数据库的生产商来提供的。驱动:它是数据传输的桥梁 驱动指的是各个数据库生产商提供的实现类 (比如我们操作mysql的数据库就需要导入mysql的驱动包)JDBC相关的接口和API介绍:jav原创 2020-06-17 16:10:34 · 631 阅读 · 1 评论 -
Java代理机制学习
前言:代理模式是指给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。所谓代理,可以理解为一个人或者机构代表另一个人或者机构采取行动。我觉得可以这样理解:假如一个厂商A让我代理了一款产品a。客户可以不直接与厂商联系,就可以通过我来买到产品a。我从厂商那里订购一件a。我可以对a进行包装后再发货给客户。按照代理的创建时期,代理类可以分为:静态代理和动态代理。要区分动态还是静态,我们可以先了解一下JVM对类的加载过程:1. 加载阶段2. 链接阶段3. 初始化阶段在加载阶段原创 2020-06-12 21:04:51 · 154 阅读 · 0 评论