JAVA
文章平均质量分 86
空指针异常1
这个作者很懒,什么都没留下…
展开
-
【Java多线程JUC入门详解】AQS原理详解
AbstractQuenedSynchronizer抽象的队列式同步器 , 在java.util.concurrent.locks包下原创 2023-01-05 10:15:07 · 452 阅读 · 0 评论 -
【Java多线程JUC入门详解】Atomic原子类、LongAdder源码详解
原子类就是利用CAS机制,实现原子操作的一些类基本类型原子类(AtomicInteger、AtomicBoolean、AtomicLong)(2). 数组类型原子类 (AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray)引用类型原子类 (AtomicReference、AtomicStampedReference、AtomicMarkableReference)原创 2022-11-21 09:44:44 · 404 阅读 · 0 评论 -
【Java多线程JUC入门详解】CAS、乐观锁、Unsafe类
CAS是乐观锁的一种实现。CAS的全称为Compare-And-Swap ,它是一条CPU并发原语,比较工作内存值(预期值)和主物理内存的共享值是否相同,相同则执行规定操作,否则继续比较直到主内存和工作内存的值一致为止。这个过程是原子的(AtomicInteger类主要利用CAS+volatile和native方法来保证原子操作,从而避免synchronized的高开销,执行效率大为提升)原创 2022-11-01 10:30:36 · 307 阅读 · 0 评论 -
【Java多线程JUC入门详解03】JMM Java内存模型、先行发生原则 Happens-Before 、内存屏障、volatile详解
JMM(Java内存模型Java Memory Model,简称JMM)本身是一种**抽象的概念** 并不真实存在,它描述的是一组规则或规范通过规范定制了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。原创 2022-10-10 16:19:49 · 416 阅读 · 0 评论 -
Java8新特性 之 函数式接口、Lambda表达式
函数式接口函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。在Java8之前,Java中就已经有了一些函数式接口:java.lang.Runnablejava.util.concurrent.Callablejava.security.PrivilegedActionjava.util.Comparatorjava.io.FileFilterjava.nio.file.PathMatcherjava.lang.reflec原创 2020-12-21 15:51:34 · 124 阅读 · 1 评论 -
Java集合原理详解
注:本篇博客不讨论集合的使用,仅是基于我最近复习时对其部分原理的理解的分享(比如扩容的原理、底层的数据结构等,但我的理解也比较浅显,适用于初学者或仅知道如何使用集合想快速了解其原理的朋友)如有错误,望指出!文章目录集合的结构Collection接口ListArrayListLinkedListVectorSetHashSetTreeSetMap接口HashMapTreeMap集合的结构我们通常常用的集合有三种,List、Set、Map,不过实际上,他们三个并不是平级的接口List和Set继承自Co原创 2020-10-23 21:11:07 · 261 阅读 · 0 评论 -
【Java多线程JUC入门详解02】:读写锁、阻塞队列、线程池、CountDownLatch、CyclicBarrier、Semaphore
CountDownLatch减法计数器package org.example.count;import java.util.concurrent.CountDownLatch;/** * @Author: sshdg * @Date: 2020/9/6 8:24 */public class CountDownLatchTest { public static void main(String[] args) throws InterruptedException {原创 2020-09-10 22:31:28 · 430 阅读 · 0 评论 -
【Java多线程JUC入门详解01】:Lock锁、集合的线程安全问题、生产者消费者问题
JUC: java.util .concurrent工具包的简称:本篇即为此工具类的入门使用博客公平锁:先来后到非公平锁:会根据运行时间、级别进行分配synchronized锁package org.example;/** * @author sshdg */public class SynchronizedDemo { public static void main(String[] args) { SaleTicket saleTicket = new Sale原创 2020-09-10 22:29:08 · 180 阅读 · 0 评论 -
【数据结构10】二叉排序树详解
二叉排序树概述二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。在一般情况下,查询效率比链表结构要高。二叉排序树是一棵空树,或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)左、右子树也分别为二叉排序树;(4)没有键值相等的结点。即,父节点的值大于其左子节点,小于其右子节点如图即为一棵原创 2020-07-29 21:42:42 · 1539 阅读 · 0 评论 -
哈夫曼编码详解 及 Java实现
哈夫曼编码原理众所周知:计算机是只看得懂二进制。一串字符,转换成二进制之后,数据是非常长的。哈夫曼编码的作用就是,根据字符出现的频率,来定义其二进制编码的长度,出现的频率越高,则编码长度越短。是不是听起来和哈夫曼树很像:权值越大,路径越短(废话,这俩明显是一个人搞出来的)。举个例子:Hello world 转换成十进制ASCII编码为以下这串数字72 101 108 108 111 32 119 111 114 108 100转换成二进制,是这样的:01001000 01100101 011原创 2020-07-28 18:52:25 · 1215 阅读 · 1 评论 -
【数据结构09】哈夫曼树(最优二叉树)详解,及Java实现
哈夫曼树(最优二叉树概述哈夫曼树又称为最优树.1、路径和路径长度在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。2、结点的权及带权路径长度若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。3、树的带权路径长度树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。给定N个原创 2020-07-27 19:12:01 · 768 阅读 · 1 评论 -
堆排序算法详解、及Java实现
堆排序需要提前掌握:二叉树、顺序存储二叉树概述堆:堆可以看做是一个完全二叉树大顶堆:其父节点总是大于等于子节点的值,而左右子节点之间没有大小顺序要求小顶堆:其父节点总是小于等于子节点的值,而左右子节点之间没有大小顺序要求堆排序:是指利用堆这种数据结构所设计的一种排序算法。以大顶堆为例,我们知道:完全二叉树可以以顺序方式存入数组中的,而大顶堆的根节点是堆中最大的数据,则可以将根节点和最后一个元素交换,再忽略其存在,将前面的元素再次构建成大顶堆,如此反复即可完成排序。一般,升序采用大顶堆,降序原创 2020-07-26 21:19:52 · 246 阅读 · 0 评论 -
【数据结构08】二叉树、顺序存储二叉树、线索二叉树详解及Java实现
目录二叉树树一些概念遍历实现思路代码实现顺序存储二叉树概述代码实现线索二叉树概述二叉树树数组的优点是通过下标访问元素效率比较高、对于有序数组,还可以通过二分法提高检索效率,而缺点是,插入、删除时,会整体移动一部分数据,效率较低链式存储优点则是插入删除时,效率很高,而检索效率比较低这时,树应运而生。树,能够提高数据存储、检索的效率。二叉树既可以保证数据的检索效率,也保证了插入删除的效率一些概念满二叉树:所有叶子节点都在最后一层,且节点数=2^n-1,n为层数。完全二叉树:所有叶子节点都在最后一原创 2020-07-26 21:05:57 · 228 阅读 · 0 评论 -
【数据结构07】Java实现哈希表HashTable及其详解(数组+链表)
哈希表概述散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。就是以 key : value 的形式储存数据的一种数据结构。而对于key原创 2020-07-25 17:42:29 · 1177 阅读 · 0 评论 -
二分法查找Java实现及其详解
目录二分法查找概述实现原理实现代码二分法查找概述二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。归并排序即运用了二分法的思想。首先需要一个由小到大排序好的数组,先对比中间的值,如果比要找的大,则向前找,取中间值前面的一半再找中间值再对比。如果比要找的小,则向后找,取中间值后面的一半再取中间值再对比。实现原理这里,我使用了递归的方法进行实现。首先需要确认查找的范围,即有一个左索引和右原创 2020-07-25 12:10:43 · 1313 阅读 · 0 评论 -
基数排序的Java实现及其详解
目录基数排序概述实现原理实现代码基数排序概述基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。可以这样理解它:0 - 9 有10个桶,一开始,0桶装个位为0的数原创 2020-07-25 10:42:46 · 270 阅读 · 0 评论 -
Java实现归并排序,及其详解
目录归并排序概述实现原理代码实现归并排序概述归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。简而言之就是,首先将数组分成两半,再分成两半…直到每部分只剩一个元素,则开始合并,左右两个元素(数组),比较后,形成一个有序的数组,再和其他也合并完的有序数组再次合并,原创 2020-07-24 21:12:28 · 654 阅读 · 0 评论 -
Java实现快速排序 及详解
这里写目录标题快速排序概述原理排序演示代码快速排序概述快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。简而言之,快速排序就是,先确定一个中间值,这个值通常是 第一个数字,然后将所有比它小的值放到它前面,这样,以它为中线,原创 2020-07-24 16:23:44 · 207 阅读 · 0 评论 -
Java实现希尔排序 及其 详解
希尔排序概述希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。插入排序的速度虽然比冒泡和选择快,但是还是比较慢且有缺陷的。因为如果一个最小原创 2020-07-24 12:04:54 · 645 阅读 · 0 评论 -
Java实现插入排序及详解
插入排序概述插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 。插入排序就像排序一手扑克牌。开始时,我们的左手为空 并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我原创 2020-07-23 21:18:23 · 844 阅读 · 2 评论 -
Java实现冒泡排序、选择排序及详解
这里写目录标题冒泡排序原理代码实现思考与优化优化后的代码选择排序实现思路实现代码冒泡排序原理比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。相当于,每次循环(使用循环,找出最大的一个数字,排到末尾)就像冒泡泡一样,每次把最大的泡泡冒到最上面代码实现package sor原创 2020-07-23 16:31:19 · 480 阅读 · 0 评论 -
Java实现八皇后问题、迷宫问题 及 递归详解
目录概述递归的作用迷宫问题代码实现八皇后问题代码实现概述递归是方法本身调用自己的一种算法。由于java在调用方法时会在栈中开辟一个新的空间,所以递归一定要确定一个终止条件,且在不断递归的过程中,不断向这个条件靠近,否则会栈溢出。也就是这个原因,有人说递归性能不好,内存占用大。程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小原创 2020-07-22 19:25:25 · 450 阅读 · 0 评论 -
Java实现中缀转化为后缀表达式(逆波兰表达式)并计算;中缀、后缀表达式计算器
实现思路将一个普通的中缀表达式转换为逆波兰表达式的一般算法是:首先需要分配2个栈,一个作为临时存储运算符的栈S1(含一个结束符号),一个作为存放结果(逆波兰式)的栈S2(空栈),S1栈可先放入优先级最低的运算符#,可指定其他字符,不一定非#不可。从中缀式的左端开始取字符,逐序进行如下步骤:(1)若取出的字符是数字,则分析出完整的数字(如:10、100,而非仅0-9的个位数字),该操作数直接送入S2栈。(2) 如果是运算符,则与栈顶元素比较,如果优先级高于栈顶运算符(包括左括号)优先级,则进S1栈;原创 2020-07-22 10:35:27 · 467 阅读 · 0 评论 -
Java实现后缀表达式的计算
实现方法从左至右扫描表达式遇到数字时,将数字压栈,遇到运算符时,弹出栈顶的两个数,计算并将结果入栈重复2直到表达式最右端,最后运算得出的值即为表达式的结果示例:计算后缀表达式的值:1 2 3 + 4 × + 5 -从左至右扫描,将1,2,3压入栈;遇到+运算符,3和2弹出,计算2+3的值,得到5,将5压入栈;遇到4,将4压入栈遇到×运算符,弹出4和5,计算5×4的值,得到20,将20压入栈;遇到+运算符,弹出20和1,计算1+20的值,得到21,将21压入栈;遇到5,将5压入栈;原创 2020-07-21 18:57:06 · 1062 阅读 · 1 评论 -
前缀、中缀、后缀表达式计算和转化算法详解
前缀、中缀和后缀表达式概述前缀、中缀、后缀表达式是对表达式的不同记法,其区别在于运算符相对于数字的位置不同,前缀表达式的运算符位于操作数之前,中缀和后缀同理如:中缀表达式:1 + (2 + 3) × 4 - 5前缀表达式:- + 1 × + 2 3 4 5后缀表达式:1 2 3 + 4 × + 5 -中缀表达式是人们最常用的算术表示方法,人脑很容易理解,但对计算机来说很复杂,因为要判断计算的优先级太过繁琐。对计算机来说,计算前缀或后缀表达式的值非常简单。中缀转换为前缀、后缀**以 1+(2原创 2020-07-21 18:48:28 · 4639 阅读 · 0 评论 -
【数据结构06】栈 概述及java实现
栈其实jdk中自带stack,自己实现一遍是为了加深理解概述遵循先进后出原则限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。实现思路需要一个top指针,用来指向栈顶元素,初始值为-1,当有元素入栈时top++出栈时top–使用数组来模拟栈,所以这个top代表的就是栈顶元素的原创 2020-07-21 15:17:58 · 84 阅读 · 0 评论 -
【数据结构05】单向环形链表、约瑟夫问题 概述及java实现
环形链表及约瑟夫问题概述环形链表就是在普通链表的基础上,最后一个节点的next域指向了第一个节点,从而形成一个环约瑟夫问题:设有n个人围成一圈,从第k个人开始报数m下,数到m的人出列,他的下一个人继续数,数到m的人出列…以此类推,直到所有人出列,要求 按出列的顺序用编号形成一个序列实现思路由于环形链表没有头节点,所以需要一个first指针节点指向人为约定的第一个节点为了编写容易,我选择直接在构造函数中初始化一个指定长度,数据仅为int no 节点的链表。需要一个辅助指针,一开始指向第一个节点,原创 2020-07-20 22:12:12 · 110 阅读 · 0 评论 -
【数据结构04】双向链表概述及Java实现
双向链表概述在单链表的基础上,每个节点多了一个pre域,用来指向该节点的前趋节点。双向链表的第一个节点的前趋节点为null,最后一个节点的后继节点为null实现思路大多数思路和单链表差不多,唯独有两处:删除、排序添加。以上两个功能实现的时候,要考虑遍历到最后一个节点才符合条件的情况,要判断临时节点的next是否为空,防止空指针异常。因为与单链表的情况不同的是,向两个节点中间插入、删除节点的时候,除了next要处理,还需要后继节点的pre域要处理,这时临时节点如果指向末尾的节点,即temp.next原创 2020-07-20 16:41:10 · 155 阅读 · 0 评论 -
【数据结构3.1】单链表反转、反向打印链表等功能的java实现
1、有效节点的个数,不包含头节点//查找有效节点数 public int getLength(){ SingleNode tempNode = headNode; int count = 0; while (tempNode.next != null){ count++; tempNode = tempNode.next; } return count; }2原创 2020-07-19 21:56:15 · 178 阅读 · 0 评论 -
【数据结构03】Java实现单向链表及其概述
单链表概述在内存中不是连续的,以节点储存的,每个节点包含data域(存储数据),next域(存储下一个节点的内存地址)其中头节点:不存放数据,仅有next域。作用就是表示单链表的头部最后一个节点的 next域的值为null实现思路需要一个节点的bean类,节点类包含你需要储存的数据和一个节点类型的 next需要一个操作链表的类添加节点分为添加到末尾,和添加到中间添加到末尾:需要一个临时节点作为指针,开始时指向头节点,遍历时根据节点的next找到下一个节点,每次让temp=temp.next原创 2020-07-19 12:04:57 · 246 阅读 · 0 评论 -
【数据结构02】队列、环形队列概述及Java实现
队列概述有序列表,可以用数组、链表实现。先进先出原则。队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。(百度百科)数组实现需要一个maxSize来表示队列的长度需要front、rear 记录队列的头和尾的数据的下标数据加入队列需要rear尾指针向后移,raer++当raer = front 时,队列为空当rear = maxSize - 1 时,队列满数据出队原创 2020-07-18 16:14:33 · 135 阅读 · 0 评论 -
【数据结构01】稀疏数组 Java实现
稀疏数组概述当一个数组中重复元素居多的时候,可以使用稀疏数组保存。比如:五子棋,白子为1、黑子为2、无子为0,大多数数据都是0,则可以使用稀疏数组进行保存。原理将二维数组中的有效数据转换为稀疏数组保存稀疏数组记录的数据有:编号行列值0共有几行共有几列共几个有效值1第几行第几列值为多少…………如: 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0原创 2020-07-18 10:44:34 · 168 阅读 · 2 评论 -
JavaWeb之过滤器 Filter;登录验证过滤器的实现
概述起到在 客户端 和 服务器端的资源 中间对 请求和响应 进行处理的作用。当客户端请求资源的时候,过滤器将这个请求拦截下来,完成一些特殊的功能。当服务器资源响应的时候,将响应拦截,完成一些特殊的功能,处理后返回给前台。一般用于完成 通用 的操作,如:登录验证、统一编码处理、敏感字符过滤使用需要实现 Filter 接口配置web.xml 或者使用 @WebFilter() 注解进行配置@WebFilter("/*") //“/*”表示所有页面都要经过这个过滤器public class原创 2020-07-05 00:51:01 · 2405 阅读 · 0 评论 -
JdbcTemplate的简单使用;spring-jdbc
JdbcTemplate的简单使用介绍JdbcTemplate是Spring MVC内置的对JDBC的一个封装。能够很大程度上减少对jdbc代码的编写Jar包下载我的主页有,博客发表的时候下载资源还在审核,后面会加上链接简单使用0、导入Jar包…1、准备Druid连接池我的上一篇博客中有写Druid的简单使用Druid博客地址2、获取JdbcTemplate对象JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtil.getDataS原创 2020-07-03 00:47:27 · 161 阅读 · 0 评论 -
Druid数据库连接池的简单使用;JDBC工具类的实现;
Druid的GitHub页面1、数据库连接池是什么连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用原创 2020-06-29 12:18:29 · 540 阅读 · 0 评论