自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 资源 (1)
  • 收藏
  • 关注

原创 数据结构之红黑树

一、概述什么是红黑树?红黑树是一种二叉树,做开发的一定听说过红黑树,红黑树属于一种高级的数据结构了,在中高级开发的面试环节中,我们经常会遇到相关的面试题,本篇我们就来了解下这种数据结构。二、红黑树的特征红黑树是一种特殊的平衡二叉树,关于平衡二叉树,我们以前介绍过AVL树,不清楚的可以先看这篇数据结构之AVL树。对红黑树的操作在最坏的情况下花费O(logN)时间。它具有以下性质: 每一个节点要么是红色,要么是黑色。 根(root)节点是黑色的。 如果一个节点是红色的,那么

2021-09-18 10:18:04 495

原创 算法设计技巧-贪婪算法

​一、概述今天这篇我们来简单介绍下贪婪算法,贪婪算法分阶段工作,在每个阶段可以认为所做决定是最好的,而不考虑将来的后果。通常这意味着选择的是某个局部最优解。这种“眼下能够拿到就拿”的策略是这类算法的名称来源。当算法终止的时候,我们希望局部最优等于全局最优,如果这样的话,那么算法就是正确的,否则,算法得到的是一个次最优解,如果不要求绝对的最佳答案,那么有时使用简单的贪婪算法生成近似最优解反而是更好的选择。二、贪婪算法的应用第一个实际应用:文件压缩。假设我们有一个文件,它只包含a,e,i,s

2021-07-15 09:58:35 523

原创 数据结构-图

​一、概念说到图,大多数人立刻会想到一幅画,一张地图……但是我们今天所说的图是一种数据结构。图是由顶点(vertice)集和边(edge)集组成的,图又分为有向图、无向图、带权图,下图所示的是一个有向图有向图:顾名思义就是具有方向的图,如上所示,顶点1指向顶点2,但是顶点2无法指向顶点1。无向图:就是不区分方向的图,顶点1可以指向顶点2,同时顶点2也可以指向顶点1。带权图:表示边带有权重的图,如下图所示另外图中还包含路径这个概念,如上图v1到v7的路径有 v1->

2021-06-29 09:58:14 4093

原创 Spring Boot源码剖析

一、概述Java程序员们对SpringBoot这个框架再熟悉不过了,它最大的特点就是自动配置、内嵌容器、可插拔式插件等等……这些特点使得Spring Boot能够做到快速开发,大大提高开发者的效率,今天这篇我来分享一下Spring Boot的启动流程。二、Spring Boot核心注解上篇我们自定义了一个spring-boot-starter,用大白话说这就是一个“自定义的可插拔式spring boot插件”,那么spring boot项目启动时是如何自动加载这些“可插拔式插件”的呢?接下来我.

2021-05-20 19:29:57 292

原创 自定义spring-boot-starter

一、概述约定优于配置是一种软件设计范式,spring boot便是遵从这一范式设计的,它去除了spring框架带来的各种复杂的配置,利用自动装配功能为各种属性配置好默认值,开发者只需要关注私有配置便可以快速高效的搭建一个spring boot项目。今天这篇我们简单的自定义一个spring-boot-starter项目,让大家感受下spring boot自动装配的强大。二、项目构建首先我们应当创建一个项目,项目的命名方式一般为xxx-spring-boot-starter,该命名表示此项目并非

2021-05-11 14:52:13 344 1

原创 MyBatis源码剖析

一、概述MyBatis之所以受到众多开发者的青睐,源于其使用方便、简单的特点。这篇我们从源码的角度来剖析下MyBatis的实现原理。二、源码剖析我们用上篇简单的案例,通过debug模式来探究下Mybatis的底层实现,首先先观察下测试类,如下图简单解析下:该方法第26行通过我们输入的sqlMapConfig.xml来获取了一个InputStream对象,接着用这个InputStream对象通过SqlSessionFactoryBuilder来创建一个SqlSessionFactory对象

2021-04-07 08:57:00 243 2

原创 MyBatis基础及经典面试题

​一、概述MyBatis是一款优秀的开源持久层框架,支持定制SQL,存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和结果集映射的封装,大大解放了生产力,今天我们来看它的简单实现以及常见的面试题。二、基础回顾首先我们来回顾一下MyBatis的基本用法,创建工程,引入坐标,如下图添加jdbc.properties配置文件,输入数据库的连接信息,添加sqlMapConfig.xml,该配置文件用来添加MyBatis的别名映射包、数据库、以及mapper映射文件等信息,如下图

2021-03-29 09:20:57 255 1

原创 大厂高频面试题精选(基础篇)

1.JAVA 中的几种基本数据类型是什么,各自占用多少字节。byte(1字节)、short(2字节)、int(4字节)、long(8字节)、boolean()、char(主要看编码unicode2个字节,UTF-8不定长度)、double(8字节)、float(4字节)2.String 类能被继承吗,为什么。不能,String是final类不能被继承3.String,Stringbuffer,StringBuilder 的区别。String不可变字符串StringBuffer可变字符

2021-03-16 11:13:29 472 1

原创 Spring MVC源码剖析二(深度剖析)

一、概述前面我们分析了Spring MVC执行的核心思想,其核心在DispatcherServlet这个类的doDispatch方法中,上一篇我们解析了doDispatch方法的功能和作用,这一篇我们来解析一下doDispatch方法里面的几个核心方法。二、方法详解首先我们分析下Handler和HandlerAdapter是如何获取的我们debug模式进入getHandler方法里面,如下图,我们可以观察到有三个Handler备选,程序会遍历三个Handler找出合适的Handler,最

2021-03-03 17:22:14 126 2

原创 Spring MVC源码剖析一(优势及核心思想)

一、概述MVC全称为Model View Controller,是一种用于创建Web应用程序表现层的设计模式。今天我们从源码的角度介绍一下Spring MVC。二、项目构建和之前介绍Spring框架一样,我们要了解Spring MVC的运行原理需要先搭建一个简单的项目,通过项目来加深自己对该框架的理解。下面我们搭建一个简单的Spring MVC项目,如下图(代码存放在码云上,链接:https://gitee.com/GPF1217/java-from-xiaobai-to-architect.g

2021-02-18 09:15:08 140 1

原创 Spring Aop源码剖析

一、概述前面两篇文章讲述了Spring框架中Bean的生成,其实这便是Spring IOC的核心了,Spring将创建好的Bean放入ConcurrentHashMap中,每次调用的时候去里面取出相关的实例,然后进行调用,这样做的好处可以避免对象的频繁创建,使开发变得更加简洁。Spring除了IOC这个特性以外,还有个大家所熟知的AOP功能,今天这篇文章就带大家来探究下Spring AOP的核心实现。二、项目构建在我们之前用来探究Bean创建过程的项目中,引入spring-aop等相关依赖。

2021-02-06 15:10:08 137

原创 Spring源码剖析二(Bean的创建)

一、概述上一篇文章剖析了Spring的部分源码,简述了Spring的启动流程。总结一下该流程就是:tomcat容器在启动的时候会加载我们项目中的web.xml文件,根据该文件配置的listener标签,启动ContextLoaderListener(Spring启动引导类),在该引导类里面有一个contextInitialized方法,通过这个方法来初始化Spring的各种环境。其中主要讲述了BeanFactory的创建流程。这一篇文章我们再继续跟踪一下Bean的创建流程。二、代码跟踪打开我

2021-01-31 14:39:32 116

原创 Spring源码剖析一(BeanFactory的创建)

一、概述从事Java开发的朋友一定都知道Spring框架。为什么Spring框架能受到如此多开发者的青睐呢?这得益于Spring提供的诸多便捷实用的功能如:IOC、AOP,并且其可扩展性使得集成第三方开源框架和类库变得异常简单。我们可以访问一下Spring官网【http://spring.io】通过官网的描述去详细了解它,这里就不再过多赘述。本篇就让我们来通过Spring的源码来探究下Spring的启动原理。二、构建Spring项目学习一个框架的基本流程首先是学会使用它,然后在使用中一步一步的探

2021-01-26 16:32:53 247 4

原创 KMP算法解析

一、概述什么是KMP算法?KMP算法是一种用于在字符串A中找到目标字符串B位置的算法。这个算法是由Donald Knuth、James H. Morris、Vaughan Pratt三人于1977年联合发表,故称为“KMP算法”。简而言之KMP就是一种字符串查找法。本章就来带大家一起了解下KMP算法的实现逻辑。二、问题分析光看上面的定义可能大家并不知道KMP到底是个什么东西?到底怎么工作的?接下来我们通过一个问题来帮助大家很好的理解KMP算法。问题:在A字符串"AC12BS 1BC12UD1

2021-01-08 14:07:09 211

原创 二分查找和插值查找

一、概述在一堆数据里面找出自己需要的元素,这种需求可以说是最基础的需求之一,任何程序都会有所涉及。如果程序的查找算法设计的很精妙,那么整个程序的性能就会有显著的提升。今天就来分享两种常用的查找算法。二、算法复杂度分析关于查找最容易想到的一种实现方式就是将一组数据中的每个元素逐个取出来和目标值比较,如果取出来的元素和目标值相同那就说明找到了,这种查找算法叫做顺序查找法,其复杂度为O(N)。二分查找就是:在一组数据中取出中间的那个元素,将其和要找的元素对比,如果不是要找的元素,则以其为标记点,将这组

2020-12-28 18:43:56 613

原创 归并排序和分治算法

一、概述之前介绍过五种经典的排序算法,在该文中引出了一种效率很高的归并排序,其复杂度为O(N*logN)。今天就来分享一下这种排序算法的实现,以及其用到的算法思维分治算法。二、归并排序的实现归并排序的基本实现逻辑就是:将一堆大量的无序数据分成两份,然后再对分成两份的数据再次进行拆分,一直拆到不能再拆分为止(拆分的最小单元为一份数据仅有两个元素),然后对每组数据进行排序,排好序之后再一层层往上合并,最终将这堆无序的数据变成有序状态。归并排序很容易描述,总结起来就是将数据分成两份,让它们各自进行归并

2020-12-14 10:18:33 718

原创 五种经典的排序算法

​一、概述在算法面试题中,排序算法经常被问到,因为涉及排序的业务场景很多,如员工的薪资列表,VIP积分榜,游戏里面玩家战力榜等等。另外排序算法的种类多,效率参差不齐。好的排序算法复杂度能达到O(logN),而差的算法会拖垮整个服务器,通过排序算法的设计便能直接看出面试者算法能力的高低。今天我们就来分享一下五种经典的排序算法,分别是:冒泡排序、插入排序、选择排序、希尔排序、快速排序。二、五种经典算法第一种排序:冒泡排序,也就是我们刚刚学习Java时认识到的第一个排序算法,其排序的逻辑是:从第一个元

2020-12-09 14:38:08 1141

原创 HashMap源码剖析(Java8版本结构的变化以及优化)

HashMap是Java工程师使用频率最高的类型之一,同时在基础面试中也是出现频率最高的面试题之一。因为它涵盖了很多知识点,其中包含了散列、链表、树等多种数据结构,同时它在Java7和Java8两个版本的结构有差异,这一点也是面试官喜欢问它的原因之一。今天这篇文章就来带大家好好欣赏一下HashMap的底层实现。

2020-11-29 13:26:08 247

原创 数据结构之散列(Hash)

一、概述什么是散列表?散列表也被称为hash表,它是一种用于以常数平均时间执行插入、删除和查找的技术。其通过关键字(key)来实现对数据的直接访问。关键字和数据的映射关系称为散列函数又称hash函数,记做hash(x),我们把散列表的大小记做tableSize。理想的散列表:关键字被映射到tableSize个单元内,并且任意两个不同的关键字被映射到不同的单元。事实上单元的数量有限,而关键字实际上是用不完的。因此要找到一个散列函数,该函数要在单元之间均匀的分配关键字,这就是散列的基本想法。剩下的还有一

2020-11-21 17:05:59 1352

原创 ArrayList底层源码剖析

一、概述工作中我们会经常使用到集合,像ArrayList、LinkedList,也知道ArrayList相比于LinkedList它的查找、修改效率更高,但是新增、删除的效率不如LinkedList,究竟为什么会有这样的差别?希望通过这篇文章让你对这两种数据结构有更深刻的认识。二、结构差异首先从源码的角度来看(没有注明版本的情况下,默认为jdk1.8)public class ArrayList<E> extends AbstractList<E> ..

2020-11-16 11:12:39 207

原创 用JAVA代码手动实现AVL树

一、概念在实现二叉树之后,我们发现在某些极端的情况下,二叉树可能会发生退化,退化成复杂度为O(N)的链表,为了避免这种情况,我们必须要给二叉树添加限定条件。AVL树是一种带有平衡条件的二叉查找树,由Adelson-Velskii和Landis于1962年首先提出。使二叉查找树成为AVL树的性质是:二叉查找树的每个节点的左子树和右子树的高度最多差1(空树的高度定义为-1)如上图所示,左边的是AVL树,右边的就不是,因为其左子树和右子树的高度差为2。二、平衡策略要想让AVL始终...

2020-11-09 14:05:05 230

原创 java实现单链表,以及单链表相关面试题

一、数据结构和算法的重要性目前程序员的门槛越来越高,对于已经参加工作的程序员来说,面试或者笔试被问到数据结构和算法已经屡见不鲜,尤其是一些一线的IT公司,数据结构和算法的面试题肯定会有,要知道“算法是程序的灵魂”。作为一名程序员,如果你不想一辈子停留在“码农”这样的标签里,那么就请花些时间去提升自己的数据结构和算法方面的知识吧。二、数据结构数据结构分为线性结构和非线性结构。线性结构作为最常用的数据结构,其特点是数据元素中存在一对一的线性关系,线性结构有两种不同的存储结构,即顺序存储结构.

2020-11-02 11:28:17 212

原创 数据结构之二叉树(java语言描述)

一、概念对于大量的输入数据,链表的线性访问时间太慢,不宜使用。树这种结构极大的缩短了数据的访问时间。什么是树呢?它是怎么做到提高访问效率的呢?树可以用几种方式定义,定义树的一种自然方式是递归方式,一棵树是一些节点的集合,这些集合可以是空集;若不是空集,则树由根(root)节点以及n(n>=0)个子(child)节点组成,这些子节点每一个都有来自根节点的一条有向边(edge)所连接。如上图,这是一棵树。【A】为根节点,【B】、【C】、【D】、【E】、【F】、【G】为【A】的子(child)节

2020-10-31 12:18:50 436

原创 java基础入门,学生党和初学java者的福利

概述Java是由C语言演变而来,其相较于C具有简单易学的优势,同时java语言的跨平台性,也给诸多开发者带来很多的便利。这篇文章帮助大家梳理一下java基础语法,希望通过这篇文章能够让初学者迅速入门。环境准备1、java环境搭建(笔者用的JDK版本为JDK8)java环境的搭建主要是jdk的安装,详细步骤见:https://gitee.com/GPF1217/tools/blob/master/%E6%96%87%E6%A1%A3/JDK%E7%9A%84%E5%AE%89%E8%A3%85

2020-10-26 09:38:14 201 1

基于java语言手动实现的AVL树代码

基于java语言手动实现的AVL树代码,该树形结构适用于查找,实现的逻辑可以查看博主的原创作品《用JAVA代码手动实现AVL树》

2020-11-09

空空如也

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

TA关注的人

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