自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Bean的作用域和生命周期

Bean生命周期大致可以分成五大步,十小步。

2023-04-25 09:24:56 402

原创 代理模式和SpringAOP

System . out . println("正在完成转账功能");System . out . println("正在完成取款功能");//模拟异常 int b = 7 / 0;} }@Component //交给spring容器管理 @Aspect //切面注解 @Order(1) //如果有多个切面类,可以通过这个数字确定优先级 public class TransactionAspect {

2023-04-24 18:22:59 537

原创 Spring IoC

拓展:Spring容器中是用map来存所有的对象,key就是我们自己设置的对象名,value是容器自己创建的对象。而现在我们把这些类交给Spring容器,让Spring容器进行管理,我们只需要在需要对象的时候从里面拿出来。value属性用来指定bean的id,也就是bean的名字。这儿我没有对Date类型的birth注入值,后续在注入引用类型的使用演示。初始化spring容器,创建User对象的之后,对这个对象的值进行赋值。Date不推荐使用简单类型的注入方法,推荐使用引用类型的注入方法。

2023-04-24 15:06:07 228

原创 网络编程—TCP、UDP编程

网络编程,指网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)当然,我们只要满足进程不同就行;所以即便是同一个主机,只要是不同进程,基于网络来传输数据,也属于网络编程。发送端:数据的发送方进程,称为发送端。发送端主机即网络通信中的源主机。接收端:数据的接收方进程,称为接收端。接收端主机即网络通信中的目的主机。

2023-04-14 09:15:33 1019

原创 IP协议和以太网

假设我们在淘宝买东西,收货地址是XX小区,这个小区的所有业主的收货地址都是这个小区,快递员把快递送到了小区,就由物业把快递再送到对应的那个收货人手中。业主可以看成一个个的内网IP,收货地址可以看成这部分内网IP对应的一个外网IP,快递员通过这个外网IP送达,再由物业找到是哪个内网IP购买的。每个小包的IP协议头的3位标志字段中,第2位置为0,表示允许分片,第3位来表示结束标记(当前是否是最后一个小包,是的话置为1,否则置为0);,同一局域网内,主机之间具有相同的网络号,但是必须有不同的主机号;

2023-04-13 22:54:36 504

原创 TCP协议和UDP协议

​ 这种情况下是不用做任何的处理的, 数据还是能够正常传输, 比如1001丢了, 当客户端收到2001时就表明2001之前的数据都已经确认到达服务器,也就表明1-1000的数据是服务器也是收到了的, 就会接着再发送两条数据, 所以只要大部分的ACK没有丢, 客户端可以通过下一次或者后面的确认应答序号来进行确认, 不处理也没事。接收端处理数据的速度是有限的,如果发送端发的太快,导致接收端的缓冲区被装满,这个时候如果发送端继续发送,就会造成数据丢包,继而引起丢包重传等等一系列连锁反应。

2023-04-13 22:32:22 601

原创 死锁和CAS

死锁是指由于两个或者两个以上的线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法继续执行。甲和乙两名同学做卫生,但是只有一把扫帚和簸箕。甲同学拿到了扫帚,乙同学拿到了簸箕,此时甲同学要等乙同学的簸箕才能做卫生,而乙同学要等甲同学的扫帚才能做卫生。这个时候就形成了僵局,也就是死锁。Compare and swap,寄存器A中的值如果和内存中M的值相等,就把寄存器B中的值和M的值进行交换比较 A 与 V 是否相等。(比较)如果比较相等,将 B 写入 V。(交换)返回操作是否成功。

2023-04-10 11:19:45 182

原创 数据结构—栈和队列

例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。思路:后缀表达式转中缀表达式,数字依次压栈,遇到算术运算符,就pop()作为算数运算法右边和左边(一定是先右边,后左边),计算出值再压栈,依次这样操作,知道最后栈里面就一个数字,pop()出来就是最终的结果。在现实中,弹匣装填子弹就是入栈,射击就是出栈,最上面的子弹是最后装进来的,如果最上面的子弹没有射击出去,下面的子弹也不能射击。最后栈为空:返回true;

2023-04-08 13:48:54 806

原创 数据结构—链表

快指针先走k-1步,然后快指针和慢指针每次走一步,当快指针走到最后一个结点即fast.next==null,此时的慢指针指向的结点就是我们要找的结点。与删除第一次出现的元素的不同点:cur不是每次都一样,因为有可能有两个重复的元素挨着,只有不是要删除的元素,才会移动;如果第一次添加到第一段,bs、be都为null,如果不是第一次添加,bs不移动,把cur尾插到bs后面,然后be往后移动。思路:按照与X的大小,把链表分成两段,第一段是bs作为头结点,be作为尾结点,第二段是as作为头结点,ae作为尾结点。

2023-04-08 08:53:36 857

原创 MyBatis-一对一、一对多、多对多映射

用户表可以有账号、密码、姓名、手机号码、家庭地址等等属性,但是其中手机号码这些都是不太常用的属性我们就可以把所有属性分成两个表,一个是用户基本信息表,一个是用户详情表,用户详情表通过uid进行关联类似很多的网站,我们在注册账户之后,还会让我们完善信息,注册账户是用户基本信息表,完善信息是用户详情表一个班级可以有多个学生——一对多(班级角度)一个学生属于一个班级——多对一(学生角度)一对多,在多的一端添加外键进行关联。

2023-04-06 23:04:41 1844

原创 MyBatis-分页插件PageHelper

当我们数据非常多的时候,我们可以选择把所有数据分成n份,有助于我们更好的展示数据。

2023-04-06 22:04:32 476

原创 数据结构—ArrayList与顺序表

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

2023-04-05 22:58:26 512

原创 MyBatis-动态SQL

可能的条件包括:品牌(brand)、指导价格(guide_price)、汽车类型(car_type)比如我们只更新提交的不为空的字段,如果提交的数据是空或者"",那么这个字段我们将不更新。主要使用在update语句当中,用来生成set关键字,同时去掉最后多余的“,”有的场景不能把sql语句写死了,比如查询条件有可能一个,也有可能多个。where标签的作用:让where子句更加动态智能。

2023-04-05 22:54:58 504

原创 MyBatis-参数专题和查询专题

文章讲解了所有参数情况同时还讲解了查询时候的所有情况

2023-04-05 15:46:21 511 1

原创 MyBatis-${}与#{}、插入数据获取自动生成的主键

${}与#{}的区别和用法、插入数据获取自动生成的主键

2023-04-05 00:52:29 1138

原创 MyBatis-初识MyBatis并实现CRUD

了解Mybatis、Mybatis的创建、Mybatis实现CRUD

2023-04-05 00:43:02 725

原创 java锁策略和synchronized锁机制

锁的实现者,预测接下来的锁冲突概率大不大,根据这个概率决定接下来该做什么。乐观锁:预测冲突不大,做的工作少一些,效率更高一些悲观锁:预测冲突大,做的工作更多,效率低一些举个生活中的例子:在全国放开的时候,A认为既然都放开了,就不会存在再一次封地区,所以就没有任何准备;B认为疫情反复无常,有可能还会封地区,所以B依旧囤了很多药品和食物在家里面。A就属于乐观锁,什么都没有准备。B就属于悲观锁,做了很多的准备工作。

2023-03-28 22:06:38 558

原创 java多线程案例-定时器

定时器是软件开发中的一个重要组件。类似于一个 “闹钟”,达到一个设定的时间之后, 就执行某个指定好的代码访问某个网站出现了网络卡顿,浏览器就会转圈圈(阻塞等待),这个等待不是无限的等待,到达一定时间以后,就显示超时访问在前端开发中网站上的动画效果,也是通过定时器实现的,比如每隔30ms,把页面往下滚动几个像素。

2023-03-25 17:30:16 609

原创 java多线程案例-阻塞队列(生产者消费者模型)

阻塞队列是一种特殊的队列,遵守 “先进先出” 的原则,并且是一种线程安全的数据结构。当队列满的时候, 继续入队列就会阻塞, 直到有其他线程从队列中取走元素。当队列空的时候, 继续出队列也会阻塞, 直到有其他线程往队列中插入元素。阻塞队列的一个典型应用场景就是 “生产者消费者模型”。

2023-03-25 14:26:01 1252

原创 java单例模式(饿汉模式、懒汉模式)

java中单例模式是一种常见的设计模式,单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。啥是设计模式?​ 设计模式好比象棋中的 “棋谱”。红方当头炮, 黑方马来跳。针对红方的一些走法, 黑方应招的时候有一些固定的套路。按照套路来走局势就不会吃亏。​ 软件开发中也有很多常见的 “问题场景”。针对这些问题场景, 大佬们总结出了一些固定的套路。按照这个套路来实现代码, 也不会吃亏。

2023-03-24 19:44:11 761

原创 线程通信(wait和notify)

notify在synchronized内部,所以只有notify 所在的线程执行完毕,释放了锁之后,wait才能重新获得锁继续执行。: 虽然是同时唤醒 多 个线程, 但是这些线程需要竞争锁. 所以并不是同时执行, 而仍然是有先有后的执行。在notify()方法后,当前线程不会马上释放该对象锁,要等到执行notify()方法的线程将程序执行。wait让线程处于阻塞等待状态,使用notify可以达到唤醒wait的作用。如果有多个线程等待,则有线程调度器随机挑选出一个呈 wait 状态的线程。

2023-03-23 23:58:31 486

原创 线程安全——synchronized和volatile

首先我们需要明白操作系统中线程的调度是抢占式执行的,或者说是随机的,这就造成线程调度执行时线程的执行顺序是不确定的,有一些代码执行顺序不同不影响程序运行的结果,但也有一些代码执行顺序发生改变了重写的运行结果会受影响,这就造成程序会出现bug,对于多线程并发时会使程序出现bug的代码称作线程不安全的代码,这就是线程安全问题。一组操作(一行或多行代码)是****不可拆分的最小执行单位*,就表示这组操作是*具有原子性****的*多个线程多次的并发并行*的对一个*共享变量*操作时,该操作就*不具有原子性*

2023-03-23 13:40:56 839

原创 JDBC的两种实现方法及区别

JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它是由一组用Java语言编写的类和接口组成的。JDBC的作用:可以通过java代码操作数据库。

2023-03-20 10:28:17 1040

原创 多线程编程(一)

由于线程的执行时随机的,有时,我们需要等待一个线程完成它的工作后,才能进行自己的下一步工作。:t.run()也可以执行线程,但是它是在当前线程的基础上去执行的,只有t线程执行结束,才能继续执行当前线程,它影响其他线程的执行,导致程序无法并发执行。:不论是继承Thread还是实现Runnable接口创建的线程,只能算是把线程创建出来,并没有真正开始执行,只有在调用。t线程和main线程是独立执行的,互不影响,这也是为什么控制台会交替输出内容的原因。就是我们自己创建的线程,这是没有设置线程名称的时候。

2023-03-19 00:06:26 590

原创 Git如何上传文件到gitee?

Git是一种分布式版本控制系统,可以高效地处理项目的版本管理,包括跨区域的多人协同开发,追踪和记录文件的历史记录,组织和保护源代码和文档,统计工作量,跟踪记录整个软件的开发过程。Workspace: 工作区,就是你平时存放项目代码的地方。: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存 即将提交到文件列表信息。Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中 HEAD 指向最新放入仓库的版本Remote。

2023-03-16 22:22:54 2761

原创 进程与线程

关于进程和进程管理等问题,我在前面做出了自己的总价,各位看官可以前往进程与进程管理总结:程序运行起来了就是产生了进程,一个程序可以对应一个进程,也可以对应多个进程。进程管理2.1 进程是操作系统进行资源分配的基本单位,每个进程的执行前都要申请资源。2.2 PCB(进程控制块)包括pid、内存指针、文件描述符等属性。作用是提供一个数据结构,让操作系统可以对进程进行管理和控制。当操作系统需要管理进程时,可以通过PCB来获取进程的状态和信息,进行进程调度、进程同步、进程通信等操作。进程调度。

2023-03-15 11:05:01 409

原创 java字符串拼接、StringBuilder和StringBuffer比较

在普通String拼接的底层,我们可以发现依然是创建了一个StringBuilder对象,并且不断调用append()方法进行字符串拼接,最后通过toString()方法把StringBuilder对象转成String对象。因为String源码中value[]是被final修饰,只能修改值,不能改变引用。答案:6个,“a”,“b”,new String(),new String(),toString(),StringBuilder。答案:2个,ab为1个对象,new String()为1个对象。

2023-03-12 22:25:19 900

原创 进程、进程管理、进程调度、内存管理、进程通信

这种访问可能会造成进程间相互干扰,如果进程1发生数据下标越界等问题,可能会访问到进程2所指向的内存。进程在离开CPU时,会把寄存器的值保存在PCB的上下文字段中,再次执行时会把PCB中的值恢复到寄存器中并继续执行。进程1、进程2分别分配一块虚拟空间,并通过页表映射到物理内存中,这样进程自身感知不到实际的物理地址。终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。进程间通信,是在进程保持独立性的前提下,通过公共区域,完成数据交换。系统按照不同的优先级调度进程的运行,优先级高的进程有先执行的权利。

2023-03-11 20:53:16 568

原创 详解String不可变

真正导致String不可变的原因是value被private修饰并且String没有提供相应的get或set,这才导致String不可变。修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的。所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象。final只能表明value不能修改其指向,value是可以修改的。1.我们首先要了解在JVM中一个String对象是如何存储的。2.为什么String是不可变的?

2022-12-21 21:38:05 633

原创 java静态代码块和实例代码块

在代码设计中可以用来创建可以单例的对象,不用每次调用一个相同的对象时都要重新new一次,提高性能。比如我们在JDBC编程的时候,设计JDBC工具类,我们就可以把注册驱动放在静态代码块。用static修饰的代码块是静态代码块。运行时,会自动放在构造方法中,执行了实例代码块后,在执行构造方法。静态代码块是从上至下的执行顺序,且都是在main方法前执行。执行了静态代码块后,执行实例代码块。静态代码块>实例代码块>构造方法。3.静态代码块的执行顺序。2.实例代码块的执行顺序。2.静态代码块的语法。

2022-12-20 12:31:38 726

原创 java三大特性——多态

虽然p1、p2都是Person类型,但是在代码执行期间,会根据引用对象判断具体如何执行(没有重写就执行父类中的方法,重写则执行子类中的方法),这就是动态绑定。但是这种方式不是可靠的,并不是所有Person类型的引用都是Student的,也有可能是Teacher等等。:是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。我们可以看到虽然我们new 的是子类,但我们实现的依然是父类的方法。向下转型,要和向上转型结合起来思考,后面的父类引用是向上转型产生的。

2022-12-11 11:34:35 682

原创 java三大特性——继承

java三大特性——继承

2022-12-08 16:22:48 375

原创 移位运算符<<、>>、>>>

1.左移运算符()3.无符号右移运算符(>>>)

2022-12-05 10:08:30 1204

空空如也

空空如也

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

TA关注的人

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