自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 红黑树与B树的区别

红黑树与B树的区别在于,B树的结点可以有许多子女,从几个到几千个。因为与红黑树一样,一棵含n个结点的 B树的高度也为O(lgn) ,但可能比一棵红黑树的高度小许多,应为它的分支因子比较大。所以, B树可以在O(logn)时间内,实现各种如插入(insert),删除(delete)等动态集合操作。B树是为了磁盘或其它存储设备而设计的一种多叉(下面你会看到,相对于二叉,B树每个内结点有多个分支,即多叉)平衡查找树。许多数据库系统都一般使用B树或者B树的各种变形结构,如下文即将要介绍的B+树,

2022-10-26 22:00:47 787 1

原创 红黑树和自平衡二叉(查找)树区别

当然,还有一些更好的,但实现起来更复杂的数据结构能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。1 、红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。红黑树和AVL树的区别在于它使用颜色来标识结点的高度,它所追求的是局部平衡而不是AVL树中的非常严格的平衡。红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。

2022-10-26 21:59:52 196

原创 序列化与反序列化

在进行反序列化时,JVM会把传来的字节流中的serializableUID和本地相应类的serializableUID进行相比较,如果相同则认为是可以反序列化的,否则会抛异常。需要做序列化的对象的类,必须实现序列化接口:java.lang.Serializable接口(这是一个标志接口,没有任何抽象方法),java中大多数类都实现了该接口:String,Integer,通俗来说就是将序列化生成的。b.如果服务器发现某些对象需要活动时,先去内存找,找不到再去磁盘文件中反序列化对象数据,恢复成Java对象。

2022-10-26 21:43:27 176

原创 重载和重写

子 类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名, 参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下,对方法体进行修改或重写,这就是重写。: 1.重载Overload是一个类中多态性的一种表现 2.重载要求同名方法的参数列表不同(参 数类型,参数个数甚至是参数顺序) 3.重载的时候,返回值类型可以相同也可以不相同。同时,重载对返回类型没有要求,可以相同也可以不同,但。在一个类中,同名的方法如果有不同的参数列表(

2022-10-26 21:38:37 141

原创 成员变量与局部变量的区别

局部变量:随着方法的调用或者代码块的执行而存在,随着方法的调用完毕或者代码块的执行完毕而消失。局部变量:在方法或者代码块中,或者方法的声明上(即在参数列表中)局部变量:没有默认初始值,使用之前需要赋值,否则编译器会报错。成员变量:随着对象的创建而存在,随着对象的消失而消失。成员变量:在堆中(方法区中的静态区)成员变量:在类中,但是在方法外面。成员变量:有默认初始值。

2022-10-26 21:33:38 81

原创 Java创建对象的几种方式

除了第 1 个方法,其他 4 个方法全都转变为invokevirtual(创建对象的直接方法),第一个方法转变为两个调用,new invokespecial(构造函数调用)。使用反序列化:当我们序列化和反序列化一个对象时,jvm会给我们创建一个单独的对象。为了反序列化一个对象,我们需要让我们的类实现Serializable接口。使用反射方式创建对象,使用Class类的newInstance方法(无参,反射)使用Constructor类的newInstance方法(有参无参均可,反射)

2022-10-26 21:32:08 161

原创 Java自动装箱与拆箱

就是自动将基本数据类型转换为包装器类型(int-->Integer)。调用方法:Integer的 valueOf(int) 方法。就是自动将包装器类型转换为基本数据类型(Integer-->int)。调用方法:Integer的 intValue方法。

2022-10-26 21:31:03 117

原创 java面向对象有哪些特征

封装好了的东西可以重复使用,也是增强了代码的复用性。封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,你只要内部的接口不变,内部的结构随便变,同时也保护了数据,这个在面向对象的编程里是一大改进,主要是增加了代码的可维护性,便于修改。而不是它的父类在叫,封装继承多态。举个例子,动物 ,它有一些属性,如果是已经封装好的前提下,在它子类里狗、猫没有必要重新来一遍,我可以直接从父类里直接继承就好了,增强了代码的复用性。,这三大特征相辅相成。

2022-10-26 21:30:27 169

原创 通过命令排查死锁

而线程Thread0同时又在等待正在由Thread1持有的锁。线程Thread1在等待正在由Thread0持有的锁。可以查到,该程序的进程编号为。

2022-09-13 23:55:34 355

原创 梳理子类对象实例化的过程

我们创建一个God类,再创建一个Person子类。

2022-09-12 23:26:37 491

原创 类加载器与双亲委派机制

类加载器分为好几个,首先它有一些等级1、虚拟机自带的加载器2、启动类(根)加载器3、扩展类加载器4、应用程序加载器通过car1.getClass获取Car Class,在通过classLoader获取它的类加载器。最后输出一下,查看打印结果可以看到输出了一个AppClassLoader,也就是应用程序加载器。接下来我们输出classLoder的父类及祖父类输出结果:为什么祖父类是null?两种情况1、不存在2、Java程序获取不到这里是java运行是的环境,其中有个rt.jar。

2022-09-09 21:33:21 254

原创 Spring的AOP的底层实现原理

5、从拦截器链中依次获取第一个通知开始进行执行,在执行过程中,为了方便找到下一个通知是哪一个,会有CgibMethodInvocation的对象,找的时候是从-1的位置依次开始查找的并且执行的。3、在执行方法调用的时候,会调用到生成的字节码文件中,直接会找到DynamicAdvisoredinterce类中的intercept方法,从此方法开始执行。aop是ioc的一个扩展功,先有的ioc,再有的aop,只是ioc的整个流程中新增的一个扩展点而已:BeanPostProcessor。

2022-09-05 23:17:55 642

原创 Spring AOP 代理模式和面向切面编程的好处

我们先来看一下什么是代理在这个例子中有两个类:狗类和它的代理类,它的代理类持有狗本身这个对象,并且还继承与它,并且覆盖了它的say方法。那么在main方法中我们通过狗的代理类获得狗,同时把狗这个对象传进去时,我们就获得了一只背代理的狗,但我们使用时,并不知道它是被代理过的。1、在不改变原有代码情况下对功能进行增强或覆盖2、对使用方来说,不需要改变代码,就可以享受增强后的功能。

2022-09-04 23:19:41 224

原创 Comparable接口实现sort排序方法

这就是说, 任何实现 Comparable 接口的类都需要包含 compareTo 方法, 并且这个方法的参。下面给出一个具体的示例。Arrays 类中的 sort 方法承诺可以对对象数组进行排序, 但要求满。在 Java 程序设计语言中, 接口不是类,而是对类的一组需求描述,这些类要遵从接口描。我们经常听到服务提供商这样说:“ 如果类遵从某个特定接口,那么就履行这项服务'足下列前提: 对象所属的类必须实现了 Comparable 接口。数必须是一个 Object 对象, 返回一个整型数值。

2022-09-03 21:49:42 1013

原创 java异常体系

throw关键字:throw是可以自定义异常,也就是抛异常,抛出的时候是一个异常类的对象。

2022-09-03 19:59:08 141

原创 理解方法调用

因为调用了test1方法,所以会重新创建一个栈帧 1,2,在test1方法中执行的时候,对这些传入的参数的修改,只会改新加入栈帧的内容,执行完方法后,修改过的参数就会出栈,不会影响原来的栈帧。因此,虚拟机预先为每个类创建了一个方法表(method table),其中列出了所有方法的签名和实际调用的方法。方法或者构造器,那么编译器可以准确的知道应该调用哪个方法,我们将这种调用称为。的方法中存在一个与提供的参数类型完全匹配,就选择这个方法。与此对应的是,调用的方法依赖于隐式参数的实际类型,并且在运行时实现。

2022-09-02 20:54:36 77

原创 抽象类和接口的联系与区别

接口(Interface)和抽象类(Abstract Class)是支持抽象类定义的两种机制。

2022-09-02 20:16:07 355

原创 字符串及其延伸

悲观锁:乐观思想,即认为读多,遇到并发写的可能性很低,每次去拿数据的时候都认为不会被人修改,所以,不会锁住共享资源,而是使用版本号机制来保证线程安全(在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,如果两次版本号一致,则写入,否则放弃写入)如果字符串地址不相同,name首先会判断要比较的参数类型是否是String,如果是,再比较两者的长度,如果长度相同,再对位比较每一个字符值是否相同,如果相同,则返回true。

2022-09-01 22:27:06 229

原创 栈 队列 泛型

栈是限制线性表中元素的插入和删除,只能在线性表的同一端进行的一种特殊线性表,允许插入和删除的一端为变化端,称为栈顶,另一端固定一端,称为栈底。队列使用数组来实现,因为队列的出队,入队时分别冲头、尾来处理的,因此需要两个变量front和rear。实现类也是泛型,实现类和接口的泛型要保持一致,如果接口没有指明类型,则按照Object类型处理。实现类不是泛型,接口要明确泛型类型的数据类型,如果接口没有指明类型,则按照Object类型处理。class 类名 {...

2022-09-01 15:07:03 424

原创 阿里面试题之变量、代码块、构造器、静态变量,静态代码块的初始化执行顺序讲解

结果: 1、首先初始化静态变量和静态代码块(不 管以后谁调用这个对象,只会初 始化一次)静态变量的优先级和静态代码块的优先级是-样的,所以谁在谁前面,谁先初始化,我们- -般先写变量,之后再写静态代码块,也就是说先运行静态。变量的初始化,之后在运行静态代码块的初始化(这样会避免出错===>java:非法前向引用),如下定义的a要在使用前定义2、之后初始化变量和代码块,再之 后在初始化构造器:变量和代码块的优先级是一样的(谁 在前.谁先初始化),但优先于构造器的初始化也就是说,构造器不管在哪里,都

2022-08-30 23:50:35 473

原创 什么是128陷阱?

Integer类在装箱的时候,要调valueOf方法,它里面定义了一个缓存数组。如果i比最小的-128大,比最大的127小,那么就会返回cache数组。如果不满足if条件,就会重新new一个integer ,所以是false。在-128~127范围内的 为true,不在则false。可以看到a与b都为100时,返回值为true。a与b都为200时,返回值为false。这是Integer中valueOf的源码。它会对h进行赋值,h赋给high最大值。所以我们看valueOf。...

2022-08-30 22:07:03 59

原创 重写equals为什么要重写hashcode

首先给一个局部变量h,h默认为零(jdk定义),当h为0并且值的长度大于零,用char val [ ]代表一个字符数组,然后把这个数组做一个遍历,结果赋给hash并返回h。如果两个对象不同(equals方法返回的是false),那么它们的hashCode值可能相同也可能不同。a与b哈希冲突,它们的内存地址在计算机里是不一样的,那么地址不一样,为什么hashCode却一样呢?如果两个对象相同(equals方法返回的是true),那么它们的hashCode值一定相同。我们点开hashCode的源码。......

2022-08-30 21:42:40 376

原创 Java 多线程

任务、进程、线程、多线程在操作系统中运行的程序就是进程,比如你的QQ,播放器,游戏,游戏,idea等等。。一个进程可以有多个线程,如视频中同时听声音,看图像,看弹幕等等线程开启不一定立即执行,由cpu调度执行。...

2022-08-29 15:57:10 182

原创 Java爬虫——使用HttpClient+jsoup实现

jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

2022-08-27 20:40:35 479

原创 登录认证权限框架

​/*** 权限资源列表* @return*/}@Api(value = "测试接口")@ApiOperation("访问")return new ResponseEntity("访问成功", HttpStatus.OK);}@ApiOperation("修改")return new ResponseEntity("修改成功", HttpStatus.OK);}}auth:users:userName: 张三userName: 李四userName: 王五。...

2022-08-27 20:27:10 309

原创 线程的使用

写入磁盘的时候,也需要一个线程池去写,这个线程池需要20就可以了,因为它不是直接把全部100个都传过来,有一个传输过程,所以写入磁盘的线程池要求小一些,写入磁盘中会有描述文件,描述文件中会携带md50,文件的基本信息,比如文件切成了多少片,然后根据这些信息进行核验,确认无误后,再重新合成。由于网络的波动,导致没有响应,这是消息中间件认为没有接收到,就会再传一遍,文件就会重复。先写入文件,然后再应答,保证文件接收之后,再去响应。比如说切片切成了100片,那么就需要100个线程来进行切片。...

2022-08-27 17:33:05 88

原创 java8中 lambda表达式,stream操作

在Java 8里面,所有的Lambda的类型都是一个接口,而Lambda表达式本身,也就是”那段代码“,需要是这个接口的实现。这是理解Lambda的一个关键所在,简而言之就是,Lambda表达式本身就是一个接口的实现。Stream也是支持类似集合的遍历和匹配元素的,只是Stream中的元素是以Optional类型存在的。Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。Runnable接口的使用,调用的是run() 方法。

2022-08-23 16:06:47 583

原创 list map set在项目中的应用,阐述底层实现原理

如果key重复了,返回的是map.get(key),也就是当前这个key对应的value,如上面的p3,key="11",而p1的key也是"11",p1与p3重复,返回的是p1的value="22",并且将p3覆盖掉p1。TreeMap的特点在于,所得到的结果是经过排序的。类似于HashMap,但是迭代遍历他时,取得的"键值对"的顺序是其插入次序,或是最近最少使用的(LRU)的次序。Map中存储的数据是无序的,他的键是不允许重复的,值是可以重复的。List中存储的数据是有序的,可以是重复的。

2022-08-23 12:47:42 75

原创 git命令

其实就是代码再次查看评审。git-review安装pip install git-review # python方式安装。

2022-08-23 10:59:17 217

原创 使用java实现一棵二叉树,并使用他完成二叉树的层次遍历,两种中序遍历 递归 &非递归

层次遍历:层次遍历二叉树,使用了来实现。先将根节点入队列,只要队列不为空,然后出队列并访问,接着将访问节点的左右子树依次入队列。如此操作,可以保证上层的节点一定会在下层之前输出。

2022-08-23 10:20:12 441

原创 使用java实现有序的单链表,并且添加一个方法,用于反转链表

【代码】使用java实现有序的单链表,并且添加一个方法,用于反转链表。

2022-08-23 09:48:18 55

原创 常见的linux命令

awk是一种编程语言,用于linux下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其他命令的输出。选项含义备注-f从脚本文件中读取awk命令。常用-F指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F: (–field-separator)常用-v赋值一个用户定义变量。

2022-08-22 17:24:05 218

原创 RBAC用户角色权限管理

RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。可以看出角色表起到了一个承接的作用把权限下发给每一个角色,而用户可以选择角色来间接的获取权限User(用户):每个用户都有唯一的UID识别,并被授予不同的角色Role(角色):不同角色具有不同的权限。

2022-08-22 16:53:47 5063

原创 什么是AOP,如何书写的?

AOP全称Aspect Oriented Programming意为面向切面编程,也叫做面向方法编程,是通过预编译方式和运行期动态代理的方式实现不修改源代码的情况下给程序动态统一添加功能的技术。

2022-08-22 15:48:18 165

原创 索引是什么,它的优缺点分别有什么,如何创建一个索引?

索引(Index)是帮助我们快速查询数据的数据结构——是一种数据结构索引是排好序的快速查询的数据结构一般来说索引本身也很大,所以不可能全部存储在内存中,因此索引往往以文件形式存储在磁盘上表示普通索引,大多数情况下都可以使用表示唯一的,不允许重复的索引,如果该字段信息不能重复,例如id、手机号、身份证号用作索引时,可设置为表示全文收索,在检索长文本的时候效果较好,比如搜索一篇文章,在比较短的文本建议使用普通的Index即可4、

2022-08-21 22:39:39 1482

原创 简述mybatis如何书写 以及作用

1、创建maven工程并导入坐标2、创建mybatis的主配置文件3、创建mapper接口MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是个接口,我们不需要一共实现类4、创建实体类注意要保证与数据库中的字段名一致5、Mapper接口每当我们调用接口中的方法,它就会自动匹配sql语句并且执行6、创建映射文件MyBatis面向接口编程的两个一致:1、映射文件中的mapper标签中的namespace要和mapper接口的全类名保持一致。

2022-08-21 21:18:23 202

原创 编写 SQL 语句,返回名为 cheapest_item 的字段,该字段包含每个供应商成本最低的产品(使用 Products 表中的 prod_price),然后从最低成本到最高成本对结果进

有Products表,含有字段prod_price代表产品价格,vend_id代表供应商id【问题】编写 SQL 语句,返回名为 cheapest_item 的字段,该字段包含每个供应商成本最低的产品(使用 Products 表中的 prod_price),然后从最低成本到最高成本对结果进行升序排序。【示例结果】返回供应商id vend_id和对应供应商成本最低的产品cheapest_item。【示例解析】

2022-08-21 16:32:42 378

原创 #{ }和 ${ }的区别

这两者都是获取参数值的两种方式改变原有规则的操作就是sql注入

2022-07-28 17:02:32 199

原创 Mybatis动态sql使用

从上边的案例当中我们可以看出如果sex等于null,那么查询语句为select*fromuserwhereusername=#{username},如果username等于null,那么查询语句为select*fromuserwhereandsex=#{sex}标签是这个标签组合当中的父标签和标签都在标签内部。从上图的案例当中我们可以看到如果标签返回的内容是以AND或OR开头的,则它会剔除掉。......

2022-07-28 17:00:05 115

原创 如何把项目部署到虚拟机

开放防火墙的3306给mysql,本项目也使用到了两个端口8080和9527,要想访问到前端们就需要开放这两个端口,如果tomcat占用了8080,要么换个端口号,要么停止tomcat。在自己的虚拟机上安装了jdk,nodejs,redis,mysql这些项目需要的环境之后,再开始部署虚拟机。在xshell中输入rz就可以导入了,虚拟机中不能用rz。之后输入密码,密码是隐藏的,直接输好后按回车。我是在虚拟机运行后端,在xshell中运行前端。,我是压缩后上传再解压,速度比较快。注意-左右都有空格。...

2022-07-28 11:59:10 3485

空空如也

空空如也

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

TA关注的人

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