自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(70)
  • 收藏
  • 关注

原创 前序中序、中序后序以及前序后序构造二叉树

对于给定二叉树的前序遍历和中序遍历、中序遍历和后序遍历、前序遍历和后序遍历,对其进行还原

2022-08-06 08:10:43 392 1

原创 前序、后序及层次遍历实现二叉树的序列化与反序列化

本文使用二叉树的先序遍历、后续遍历以及层次遍历分别对其进行序列化与反序列化操作

2022-07-31 09:05:17 326

原创 Java代码实现素数筛算法统计某个范围内的素数个数(BitSet的使用及与数组耗时对比)

本文使用BitSet、数组的形式实现统计某个范围内素数个数的素数筛算法,并对比这两种形式的性能差异

2022-07-23 09:49:28 638

原创 仅用20行代码搞定链表快速排序,面试官直呼内行(Java实现)

本文深敲细啄,将对链表进行快速排序实现的代码打造得精简优雅!

2022-07-22 19:57:42 399

原创 Java实现多线程交替打印a、b、c、......字符(多种实现方式)

面试经常会遇到使用Java多线程交替打印字符的问题,本文采用synchronized+wait/notify、ReentranLock+Condition、LockSupport多种方式讲解实现思路以及最终的代码实现

2022-07-10 15:41:24 3220

原创 CountDownLatch、Semaphore、CyclicBarrier使用及原理分析

本文主要讲解Java并发工具包常用的工具类的使用场景以及实现原理,包括CountDownLatch、Semaphore、CyclicBarrier

2022-07-10 11:56:10 405

原创 利用上班摸鱼时间,手撕红黑树(Java代码实现)

java代码实现红黑树,包括插入、删除、查询等操作

2022-07-08 19:52:07 590

原创 透析ThreadLocal(以源码角度讲解原理)

本文主要以案例+源码的形式介绍ThreadLocal相关原理,对于概念术语,网上一大堆,而且不容易理解,本篇旨在通过源码的形式让读者深入理解并掌握ThreadLocal,面试时遇到相关题目更有底气地show给面试官。...

2022-07-02 10:15:14 322

原创 背包九讲Java版本

package dp;import java.util.ArrayList;import java.util.Arrays;import java.util.List;/** * 背包九讲 * * @ProjectName: algorithm * @Package: dp * @Description: TODO * @Author: bipa * @Date: 2022/1/8 8:00 */public class Pack { /** * 01背包(

2022-01-08 11:03:27 420 2

原创 并查集及Java实现

概述:并查集(UnionFindSet)是一种树形数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题,在使用中常常以森林来表示。常见的操作有合并两个集合、查找某元素属于哪个集合、判断两个元素是否属于同一个集合。基本操作:初始化(makeSet):把每一个元素初始化为一个集合,即将每个元素的父结点初始化为自己public void makeSet() { for (int i = 0; i < this.n; i++) { t

2022-01-01 12:47:20 698

原创 看完这篇,你也能在面试官面前手撕跳表(SkipList)了

背景:对于在一个有序数组中查找某个值,我们一般会想到使用二分提高检索速度,时间复杂度为O(logN) ,但是在一个链表中查找某个值,无论该链表有序或无序,都得从链表头开始遍历,时间复杂度为O(n)。那能否提高一个有序链表的查找速度,使得时间复杂度也降为O(logN)?跳表(skiplist)这种数据结果便能解决,用空间换时间的方式,下面介绍跳表及其实现。概述:跳表基于有序链表,在此基础上增加了多层索引,实现了二分查找,是一种随机化的数据结构,来一张图,看看到底长啥样,这里,我们就把原始链表叫做第一

2022-01-01 11:25:46 612

原创 对单链表进行归并排序(Java实现)

概述:在上一篇中,讲解了如何对单链表进行快速排序,这一篇将介绍如何对单链表进行归并排序,对归并排序不熟悉的小伙伴可以先去了解归并排序的实现。那怎样对一单链表进行归并排序呢?下面开始逐步介绍。实现:首先定义单链表的节点,private static class Node { public int val; public Node next; public Node(int val) { this.val = val;

2021-12-25 17:07:46 1278 1

原创 详解LFU(最不经常使用)算法及Java实现

概述:在上一篇中,详解了LRU(最近最少使用)算法,这一篇来讲述LFU(Least Frequently Used),即最不经常使用,也是一种页面置换算法。它的淘汰策略是选择使用频次最少的作为淘汰对象,满足一下几个约束:使用get(K key)方法获取值时,其使用频次加一使用put(K key, V value)方法添加时,如果key在缓存中已存在,则更新对应的value,并且其使用频次加一;否则判断缓存是否已满,是则移除缓存中使用频次最少的key,若有多个key的使用频次最少,则移除最旧的那个ke

2021-12-24 22:03:45 2449

原创 一篇彻底搞懂深度优先搜索(DFS)及广度优先搜索(BFS)

概述:深度优先搜索(Depth First Search)是遍历图形结构的一种方式,也可以说是一种图算法,其过程是对每一个可能的分支路径深入到不能再深入为止,并且每个节点只访问一次。与之对应的另一种遍历图形结构的方式----广度优先搜索(Breadth First Search)则是从某个节点开始向四周扩散,类似一层一层的遍历,它们的相同点是图的每个节点都要访问到并且只访问一次。下面通过几个案例实战来加深对这两种算法的理解。案例一:给定一个整形数组nums和一个整数target,你可以给数组nums里

2021-12-15 20:34:22 1066

原创 线段树进阶之lazy思想及Java实现

背景:在上一篇线段树入门中涉及到对线段树的更新操作是单点操作,即更新的是一个,如果现在把问题升级下,让你将数组nums的某个区间[start,end]的值都加上value,该怎么做好呢?比较容易想到的是可以复用之前的更新操作,外面给它套个for循环,依次更新,这样虽然结果正确,但时间复杂度不堪入目…很明显是不可取的,基于这个问题,从而有了lazy思想,下面开始介绍。概述:lazy,顾名思义,就是懒惰的意思,在本问题中所体现的则是在进行区间更新时,延迟更新,用一个lazy标记记录下就好,没必要依次更新它

2021-12-14 19:44:47 871

原创 线段树入门及Java实现(递归与非递归)

背景:线段树(Segment Tree)是一种树形结构,具有二叉搜索树的性质。想要学好某种数据结构,首先要明白它是为了解决什么问题或那类问题而产生的。这里首先抛出一个非常典型的问题:给定一个数组nums,现在要你实现两个操作,查询:查询数组nums的下标在[left,right]范围内的和sum,即sum=nums[left]+…+nums[right]更新:将数组nums的下标为position的值改为value,即nums[position]=value问题十分简单,也很容易理解,两个操作

2021-12-13 20:45:23 636

原创 字典树及其Java实现

简介:字典树(Trie)也叫前缀树,是一种树形结构,广泛用于统计和保存大量字符串,利用字符串的公共前缀进行查询,有效提高了字符串的查询速度。结构:它是一棵多叉树,规定根节点不存字符,除根节点外,每个子节点仅存一个字符,用Java代码可将其节点定义为这样一个类:public static class Node { public int pass; public int end; public HashMap<Integer, Node> ch

2021-12-11 10:23:03 863

原创 db2、Oracle的concat函数

我们比较常用的数据库是MySQL,它的concat函数用法如下:concat(str1,str2,…)即可以拼接多个参数,而db2和Oracle的concat函数用法只能拼接2个参数,如下:concat(str1,str2)在db2跟Oracle环境里如果想拼接多个参数,那只能像套娃一样多次使用concat,例如concat(str1,concat(str2,concat(str3,str4) ) )这个函数的使用场景一般是在模糊查询上,MySQL根据name模糊查询,like concat(’%

2021-12-10 22:49:04 4476 1

原创 KMP算法,不过如此

简述:KMP算法是为了解决如何快速地处理字符串匹配问题的一种高效算法。字符串匹配,简言之,就是给定两个字符串M(主串)、S(子串),让你找出子串S在主串M中第一次出现的位置(即下标),若找不到则返回-1比较容易想到的暴力解法就是,定义两个指针i(指向主串M)、j(指向子串S),然后从头开始,依次进行比较,若发现某个位置M(i)!=S(j),指针j退回到子串起始位置,指针i则退回至上一次开始位置的下一个位置,然后继续进行比较。很明显时间复制度为O(M*S),而KMP算法可将时间复杂度将为O(M+S),下

2021-12-10 22:25:02 430

原创 对单链表进行快速排序

快速排序简介能点进这篇文章的网友们,我相信对快速排序是有一定了解的,这里不详细介绍快速排序的定义,有想进一步掌握快速排序的实现及原理的可参考这篇文章快排的递归及非递归实现下面进入主题,如何对一单链表进行快排呢?我们知道快速排序的核心在于这样一个步骤,即选择某个元素作为基准base,想办法让待排序的序列中所有小于base的元素在左边,所有大于base的元素在右边,之后分别对base的左边和右边重复上述步骤,最终整个序列有序。为此,我们可以想到,如果对单链表也能进行这样的步骤,即选择单链表的某个元素作为ba

2021-09-11 23:52:29 2256

原创 详解Java注解(Annotation)

1、基本介绍注解(Annotation)是Java提供的设置程序中元素的关联信息和元数据(MetaData)的方法,它是一个接口,程序可以通过反射获取指定程序中元素的注解对象,然后通过该注解对象获取注解中的元数据信息。Java 语言中的类、方法、变量、参数和包等都可以被标注。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。2、内置的注解Java 定义了一套注解,共有 7 个,3 个在 java.la

2021-04-29 11:18:26 334 3

原创 详解二叉搜索树(BST)及Java实现

1、基本介绍二叉搜索树(Binary Search Tree),又称二叉查找树或二叉排序树,它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值它的左、右子树也分别为二叉搜索树例如,有数组24,34,29,45,35,5,4,8,6,23,按顺序插入二叉排序树最终结果如下图所示:2、主要操作二叉排序树的操作主要有:查找、插入和删除,查找和插入比较简单,这里对删除操作进行较为详

2021-04-29 00:37:50 338

原创 设计模式之模板方法模式

1、基本介绍模板方法模式又叫模板模式,指在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。模板方法模式属于行为型模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。2、UML类图由于模板方法模式相对来说比较好理解,这里就不举例演示了。这里提一下该模式在jdk源码中的应用,如Java里的AQS框架中对共享资源的获取与释放就使用到了模板方法模式。想要更进一步了解AQ

2021-04-28 11:14:18 130

原创 基于Swing和Socket通信的简单聊天程序

1、基本介绍该项目以Swing相关组件作为界面显示,底层基于socket通信机制实现信息交互。总共包含两个类,一个Server类代表服务端,用于监听客户端的连接及管理相应的socket,一个Client类代表客户端,用于接入指定的主机和端口的服务器并与之通信。先看下效果图:.2、实现步骤1、Client类的实现:该类有以下成员变量,各变量含义已在代码注释里写好, /* 主机 */ private String host; /* 端口 */ private int port;

2021-04-21 21:53:20 550

原创 详解LRU(最近最少使用)算法及Java实现

1、基本介绍LRU(Least Recently Used)即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。对于缓存来说,容量是有限的,当容量满时,就需要清理一些对于当前情景来说没用的内容,从而为新来的腾出位置,如何选择就对应了某种策略,而LRU采取的是一种选择最近最久未使用作为淘汰的策略。最近即当前,最久未使用也即最少使用,要实现如此特征,我们有所规定,每当访问了缓存中存在的数据或向缓存中新增数据,该数据就得移至最前面(表头),如果新增数据时,缓存已满,就要删除当前位于最后

2021-04-19 23:26:46 5006 3

原创 详解Java枚举(enum)

基本介绍Java枚举是一个特殊的类,一般表示一组常量,每个常量代表该枚举类的实例,Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。例如定义一个颜色的枚举类:enum Color { RED, GREEN, BLUE; } 以上枚举类 Color 颜色常量有 RED, GREEN, BLUE,分别表示红色,绿色,蓝色。每个枚举都是通过 Class 在内部实现的,且所有的枚举值都是 public static final 的。以上的枚举类 Color 转化

2021-04-17 19:27:11 230

原创 设计模式之工厂模式

1、基本介绍:工厂模式是一种创建型模式,将实例化对象的代码提取出来,封装到一个类中统一管理和维护,达到和主项目的依赖关系的解耦,从而提高项目的扩展性和维护性。工厂模式可分为简单工厂模式、工厂方法模式、抽象工厂模式三种,下面依次介绍(以生产手机为例)。2、简单工厂模式2.1、基本介绍:简单工厂模式定义了一个创建对象的类,这个类封装了实例化对象的行为(代码),由一个工厂对象决定创建出哪一种产品类的实例。2.2、UML类图:2.3、代码演示:定义手机标准规范类(AbstractProduct)

2021-04-17 10:21:16 54

原创 详解Java线程池

工作原理:Java线程池主要用于管理线程组及其运行状态,以便Java虚拟机更好的利用CPU资源。Java线程池的工作原理为:JVM先根据用户的参数创建一定数量的可运行的线程任务,并将其放入队列中,在线程创建后启动这些任务,如果线程数量超过了最大线程数量(用户设置的线程池大小),则超出数量的线程排队等候,在有任务执行后,线程池调度器会发现可用的线程,进而再次从队列中取出任务并执行。线程池的主要作用是线程复用、线程资源管理、控制操作系统的最大并发数,以保证系统高效(通过线程资源复用实现)且安全(通过控制最大

2021-04-05 15:38:52 310 1

原创 设计模式之代理模式

1、基本介绍:为对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象,这样的好处是可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。代理模式可分为静态代理和动态代理,动态代理包括JDK代理和cglib代理,下面依次介绍2、静态代理:静态代理需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同的父类。定义一个接口:public interface MyInterface { void solve(String name

2021-04-04 16:56:17 83 2

原创 详解Java反射机制

反射机制的概念:反射机制是指在程序运行过程中,对任意一个类都能够获取其所有属性和方法,并且对任意一个对象都能调用其任意一个方法。这种动态获取类和对象的信息,以及动态调用对象的方法的功能被称为Java语言的反射机制。Class类的介绍:说到反射,就不得不提起java.lang.Class这个类,JVM为每个加载的class创建了对应的Class实例,并在实例中保存了该class的所有信息,包括类名、包名、父类、实现的接口、所有方法、字段等。那么Class到底是个什么类呢?先看下它的部分源码:publi

2021-04-04 12:09:28 288

原创 深入理解AQS(源码剖析)

1、概述1.1、基本介绍:AQS(Abstract Queued Synchronizer)是一个抽象的队列同步器,通过维护一个共享资源状态(volatile int state)和一个先进先出(FIFO)的线程等待队列(CLH)来实现一个多线程访问共享资源的同步框架。1.2、原理:AQS为每个共享资源都设置一个共享资源锁,线程在需要访问共享资源时首先需要获取共享资源锁,如果获取到了共享资源锁,便可以在当前线程中使用该共享资源,如果获取不到,则将该线程放入线程等待队列,等待下一次资源调度,具体的流程

2021-04-03 23:01:43 267

原创 一篇带你走进Java多线程的世界

序言:相对于传统的单线程,多线程在操作系统多核配置的基础上,能够更好地利用服务器的多个CPU资源,使程序运行起来更加高效。Java通过提供对多线程的支持来在一个进程内并发执行多个线程,每个线程都并行执行不同的任务,以满足编写高效率程序的要求。Java中的线程基本介绍:操作系统在运行一个程序时,会为其创建一个进程。进程是操作系统分配资源的基本单位,而线程也叫轻量级进程(Light Weight Process),是处理器调度的基本单位,一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部

2021-04-03 10:34:50 125

原创 设计模式之单例模式

基本介绍:所谓类的单例设计模式,就是采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。实现方式:1、饿汉式class Singleton { // 构造器私有化,防止外部使用new关键字创建实例 private Singleton() {} // 内部创建对象实例 private static final Singleton SINGLETON = new Singleton(); //

2021-04-01 00:05:50 65 1

原创 十大排序算法之Java实现

1、冒泡排序基本介绍:冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒。代码实现:/** * 冒泡排序 * @param arr 待排序的数组 */ public static void bubbleSort(int[] arr){ int len; if (arr == nu

2021-03-31 22:36:00 106

原创 设计模式之七大原则

设计模式包含了面向对象的精髓,懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要!设计模式的目的软件开发追求低耦合,高内聚,而设计模式是为了让程序(软件)具有更好的重用性(功能相同的代码,不用多次编写)可读性(编程规范性,便于其他程序员的阅读和理解)可扩展性(可方便的增加新的功能,亦称为可维护性)健壮性(程序经得住推敲)等等,从而使得软件呈现高内聚,低耦合的特性。设计模式七大原则设计模式原则就是程序员在编程时应当遵循的原则,是各种设计模式的依据及基础,包括单一职责原则、接口隔

2021-03-30 23:13:09 83

原创 Java模拟终端实现与远程终端交互

简介:该项目是使用Java的GUI即swing构造的,借助jsch连接到远程的终端,通过读取对应的输入输出流,把本地的命令发送至远程终端,远程终端执行完命令后,再获取终端的输出日志到本地的JTextArea多行文本框中显示,可实现交互效果,具体的实现细节请看代码。演示:代码:本项目使用Maven管理,需要用到第三方jar包,所以要添加jsch依赖到pom文件中,如下: <dependency> <groupId>com.jcraft</groupId>

2021-03-25 00:07:57 1756 5

原创 Java实现平方乘算法(快速幂)

递归实现://求a的b次方模modpublic static long quickMul(long a,long b,long mod){ if (b == 0) return 1; long temp = quickMul(a,b / 2,mod); return ((b & 1) == 0 ? temp * temp: temp * temp * a) % mod; }非递归实现://求a的b次方模modpublic stat

2020-09-10 18:50:37 906

原创 inner join、left join和right join的区别(附案例分析)

概念:left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只返回两个表中联结字段相等的行案例:设表hero的记录如下:h_id    h_name1     杨过2     小龙女3     郭靖4     黄蓉6     周伯通表rich的记录如下:r_id    r_name1     李彦宏2     马云3     马化腾4

2020-09-01 11:00:38 567

原创 Java实现堆结构

简介:堆的特征是:堆顶元素是所有元素的最优值。堆的应用有堆排序和优先队列。堆有两种:最大堆、最小堆。最大堆的根结点元素有最大值,最小堆的根结点元素有最小值。时间复杂度为O(logn)。下面都以最小堆为例进行讲解。操作:入堆:每次把元素放进堆,都调整堆的形状,使得根结点保持最小。出堆:每次取出的堆顶,就是整个堆的最小值;同时调整堆,使得新的堆顶最小。存储结构:用数组array[]存储完全二叉树,结点数量为n,array[0]不用,array[1]为根结点,有以下性质:  (1)i > 1

2020-08-27 17:20:13 197

原创 Java求解最大公因数与最小公倍数

最大公因数(GCD)欧几里得算法:public static int gcd(int a,int b){ return b == 0 ? a : gcd(b,a%b); }最小公倍数:public static int lcm(int a,int b){ return a / gcd(a,b) * b; }

2020-08-27 14:30:27 210

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除