自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring执行流程和Bean的生命周期

当应用程序关闭或者容器被销毁时,Spring容器会执行Bean的销毁方法(如果有定义的话),这些方法可以是通过实现DisposableBean接口的。初始化阶段,Spring容器会调用Bean的初始化方法(如果有定义的话),这些方法可以是通过实现InitializingBean接口的。Spring容器在实例化Bean之后,会自动执行依赖注入,将Bean所需要的依赖注入到Bean中,以完成Bean的装配过程。Spring容器根据配置文件中的描述,实例化应用程序中定义的Bean对象。

2024-03-19 01:50:15 444 1

原创 单例模式(保证线程安全)

对获取实例的方法进行加锁可以确保线程安全.缺点是,使用synchronized修饰方法是为了避免多个线程在唯一实例未被初始化的时候同时获取实例.在实例被初始化了之后,加锁解锁就成了多此一举.这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。首先单例模式有懒汉和饿汉两种模式. 懒汉式就是如果不需要就不创建实例,如果需要获取实例了,再进行创建实例,如果已经有了唯一实例了,就返回已经创建好的实例.这样就很好的避免了在唯一实例已经初始化后频繁的加锁解锁的步骤.

2024-01-30 02:03:29 636

原创 Java线程安全问题和如何解决线程安全问题

这是java并发的三大基本特性.

2024-01-30 00:39:40 291

原创 Java线程的六种状态

初使状态表实线程创建成功,但没有运行,在new Thread之后,没有调用start之前,线程都处于NEW状态.

2024-01-29 22:51:50 498

原创 Thread类基本用法(线程的创建,线程中断,线程等待,线程休眠,获取线程实例)

1. 自定义一个类继承Thread类2. 实现Runnable接口3.使用匿名内部类创建Thread子类对象或Runnable子类对象4.lambda表达式创建Runnable子类对象。

2024-01-27 15:39:43 153

原创 进程和线程

进程既然已经可以实现并发和并行,那为什么还需要线程呢?原因就在于进程(是操作系统资源分配的基本单位),频繁的创建/销毁进程成本非常高.而多个线程(是操作系统调度执行的基本单位)可以存在于一个进程中,共同使用同一份系统资源.的时候,才需要花成本申请系统资源,后续程序想要并发完成多个任务时,只需要添加。关于进程的概念可以查看上一篇文章。

2024-01-23 21:30:59 345 1

原创 进程概念(易懂)

我们都知道计算机可以支持多个程序并发运行,我们可以打开一个qq,打开一个音乐软件,我们想给别人发消息时,点开qq双击别人的头像就可以准备发送信息.想切歌时,点开程序点击切歌.那在内存中是怎么知道哪段内存中是qq的代码(进程的内存分配是以"虚拟地址空间"进行分配的.如果都是直接读取物理内存的话,一个程序代码如果越界访问修改数据.风险是很大的.).这里就需要PCB(进程控制块)描述进程的基本信息和运行状态,所谓的创建进程和撤销进程都是对PCB的操作.各个进程的pcb通常都存储在一个双向链表里.

2024-01-21 15:29:11 352

原创 自定义实现PriorityQueue-优先级队列(堆)

这两个也是一棵树,所以我们就可以从56这个节点开始调整,让它成为一个大根堆,再是6为根的这颗树,再到23. 而56的下标是数组的长度减去1出意2.这是固定的, 每个完全二叉树最后的那棵小树的下标都是(array.lenth - 1) / 2.大根堆的特性是每个节点的值都大于它的子节点的值。下标为i的节点,左孩子下标:2 * i + 1, 有孩子下标: 2 * i + 2, 父亲节点下标:( i - 1)/ 2。如果i为0,则i表示的节点为根节点,否则i节点的双亲节点为 (i - 1)/2。

2024-01-09 16:24:28 1073

原创 希尔排序算法

其思想是将整个待排元素序列分割成若干个(gap个)子序列(每个序列的每个元素之间的间距(gap)是相同的),分别对这些子序列进行直接插入排序,然后依次缩减gap再进行排序,待整个序列中的元素基本有序时,再对整体待排元素进行一次直接插入排序。剩下的就是用直插法的思路,假如前一个数据大于当前tmp,也就是i下标的数据。直接插入排序有一个特性是,整个待排元素越趋于有序状态,直接插入排序的效率越高。同一组中,每个元素的步长也是5,所以下标为10的元素就放在了黑色线标记出来的第一组中。希尔排序是插入排序的一种优化。

2024-01-07 15:40:18 356

原创 直接插入排序法

j为什么要是i-1.假如我们要做从小到大进行排序,前面的数组是已经从小到大排序好的,那么j下标的元素一直是前面数组里的最大值.(从大到小反之亦然) . 我们用j下标的元素和j+1下标的元素进行比较, 假如array[j] < array[j+1],那么,array[j+1]就是前面这个数组中最大的元素,不需要改变它的位置。25 > 10,把25放到10的位置,再拿10和14进行比较,14 > 10, 14放到之前25的位置.所以需要一个变量j,来获取要比较的数的位置和可能要进行位置移动的位置.

2024-01-06 21:15:16 379

原创 判断一颗二叉树是否是高度平衡的二叉树

用左子树的高度-右子树的高度拿到绝对值进行判断左右子树高度差。大于1就不是平衡二叉树,返回false.同时判断左子树和右子树是否是平衡二叉树。如图,虽然根节点的左右子树高度一样。但是走到根的右子树时,高度差为2.返回条件表达式只要有一项为false,返回的false。判断一颗二叉树是否是平衡二叉树,需要看它左右子树的高度差的绝对值,绝对值大于1则这颗二叉树不是平衡二叉树。一棵树假设左子树高度为2,右子树高度为3.那这颗树的高度为4。有了这个方法,我们就可以判断每个节点的左右子树高度差。

2023-12-27 23:24:38 357

原创 数据结构(顺序表,链表,栈,队列)

此外,ArrayList是用数组存放数据的,一旦要在中间插入或删除元素时,就需要将后面的元素整体前移或后移,时间复杂度为O(n),效率比较低。链表(LinkedList)是一种物理存储上非连续的存储结构,数据元素的逻辑顺序是通过链表种的引用链接次序实现的。数据的插入叫做压栈:最先进的1,所以2在1的顶上,3在2的顶上。所以在创建一个新的ArrayList的时候,可以给一个其他实现了collection接口的对象来获取里面的元素。是一个有序数据元素的集合/是n个具有相同特性的数据元素的有限序列。

2023-12-27 09:18:43 904

原创 学习Java异常

异常的声名使用throws关键字,位置在方法声名时参数列表之后,当方法中抛出编译时异常,用户不想处理该异常,就可以借助throws将异常抛给方法的调用者来处理,即当前方法不处理异常,提醒方法的调用者处理异常。声名的异常必须是Exception或者Exception的子类,上面的自定义异常都是继承了RuntimeException,是Exception的子类。方法内部如果抛出了多个异常,throws之后必须跟多个异常类型,之间用逗号隔开,如果抛出的异常类型具有父子关系,直接声名父类即可。

2023-11-01 11:10:24 51

原创 Java模拟实现图书管理(继承,多态)

这里把booklist中books数组最后一个元素设为null不够准确,应该说是最后一本书,因为删除了一本书之后,所有的书都在数组上前进了一个位置,当把最后一本书付给倒数第二本书时,把最后的一个元素设为null并且在memoryused元素-1就把删除做完了。operation对象存放的是各种功能,但是因为管理员和普通用户的权限不同,不能在User里初始化。在operation包里所有的类都是实现了IOperation这个接口,所以可以存放在IOperation这个数组里,这里是向上转型。

2023-10-28 08:43:43 76 1

原创 寻找水仙花数(代码加注释)

遍历寻找水仙花数

2022-12-30 20:29:59 234 1

原创 求一个整数,在内存当中存储时,二进制1的个数。

使用无符号位移进行二进制中1的查找

2022-12-27 18:13:40 83

转载 Inheritance vs Composition(继承vs组成)

介绍了为什么类的组合比类继承好

2022-09-21 15:24:17 121

转载 java何种情况使用ItemListener和ActionListener

【代码】java何种情况使用ItemListener和ActionListener。

2022-08-25 09:50:52 256

原创 View Binding使用

初使布局的Id是activity_main,创建出来的类命就是ActivityMainBinding.我们可以把setContentView重写。为每个布局创建一个类,为布局中的每个视图创建数据成员。类名是布局xml名称,不带大写字母_ + " Binding "。View Binding相比findViewById可以省区很多繁琐的步骤。我们只需要在build.gradle文件下放此段代码。若要使获取里面的插件。...

2022-08-14 15:31:38 583

转载 Android Intent,startActivityForResult介绍

1.当前Activity(主)需要重写onActivityResult(int requestCode, int resultCode, Intent intent),当被启动的Activity返回时,这个方法会被触发。当用户在第二个Activity中选择完后程序返回第一个Activity,此时第一个Activity必须获取并显示用户在第二个Activity中选择的结果。第一个参数intent,和普通的startActivity()里的intent一样,里面放要请求的Activity和可以需要放的数据。..

2022-08-13 19:40:26 178

原创 Android Studio目录结构介绍(第一行代码 Android 第二版)

任何一个新建的项目都会默认使用Android模式的项目结构,但这并不是项目真实的目录结构,而是被Android Studio转换过得。这种项目结构简洁明了,适合进行快读开发。点击圈中的Android区域可以切换项目结构。将项目结构模式切换成Project,这就是项目真实的目录结构了。...

2022-08-12 14:18:30 774

原创 浮点数十进制二进制转换

浮点数存储

2022-08-08 07:06:52 571

原创 Python_jupyter notebook基础知识(2)(列表,元组,字典)

rangerange函数产生一个均匀间隔的整数列表:range数据的创建是从0开始的。range(5)等价于range(0,5)range还有一种用法是range(x,y,z)范围就是从x到y-1,z代表步长:range经常被用来遍历索引序列:可变类和不可变类Python中的大多数对象都是可变的,比如列表、字典、NumPy数组或大多数用户定义的类型(类)。这意味着它们包含的对象或值可以被修改。其他的,如字符串和元组,是不可变的:当尝试改变元组元素时...

2022-03-19 15:34:30 4325

原创 Python_jupyter notebook基础知识(1)

目录终端操作语法Indentation, not braces - 缩进,而不是括号注释算数运算符标准数据类型Python3.所有内置数据类型数字类型Dynamic references, strong typesIsinstance函数函数和通过引用传递的Python风格:通过对象引用传递函数参数传递名称空间、作用域和局部函数多个返回值逻辑运算符if,elif,elseforwhilepassstring...

2022-03-18 16:12:32 2388

原创 预处理介绍

预定义符号:__FILE__ //进行编译的源文件__LINE__ //文件当前的行号__DATE__ //文件被编译的日期__TIME__ //文件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义ps:这里只包含了部分预定义符号这些预定义符号都是可以直接使用的,for example:printf("%s\n",__FILE__); //这里直接打印文件名printf("%d\n",__LINE__);//这里直接打印这句printf语

2022-03-01 23:14:07 223

原创 动态内存函数介绍(malloc, calloc,realloc,free)

mallocvoid* malloc(size_t size)这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要检查。如果参数size为0,malloc的行为是标准wei...

2022-02-22 22:20:52 229

原创 memmove函数和memcpy函数的区别

C语言标准规定,memcpy用于拷贝不重叠空间。memmove用于拷贝重叠空间。重叠空间指的是拷贝内存空间和被拷贝内存空间重叠。举个例子,int arr[10] = {1,2,3,4,5,6,7,8,9,10};把arr[4]后10个字节从arr[5]开始拷贝。这种情况我们应该使用memmove()函数来进行拷贝。再讲一下memmove()函数的模拟实现。空间重叠一共存在三种情况dest在src之前我想将678910放进34567的地址里。这里我们只需要从前往后放就行。6..

2022-02-16 21:25:52 267

原创 strtok()函数介绍

作用:Find the next token(标志) in a string.char *strtok( char *strToken, const char *strDelimit);Return valueAll of these functions return a pointer to the next token found in strToken. They return NULL when no more tokens are found. Each call modifies s

2022-01-27 20:55:51 463

原创 C语言string库函数介绍(附模拟实现)

strlenstrcpystrcatstrcmpstrncpystrncatstrncpystrstrstrtokstrerrormemcpymemmovememsetmemcmp

2022-01-26 21:28:19 8391

原创 常见的指针和数组题

本篇都是先放题,再解析。希望读者姥爷先做再往下看。先介绍关于数组名的两种特殊情境:int a[5] = {1,2,3,4,5};通常数组名表示的是数组首元素的地址,也就是a[0]的地址。但是有两种情况,数组名表示的是整个数组。1.sizeof(数组名)当数组名单独出现在sizeof()内部的时候,数组名表示的是整个数组,sizeof计算的是整个数组的大小,单位是字节。打印出来的结果是20.五个int型数据->5*4=202.&数组名&a,这里的数组名

2022-01-24 04:54:10 834

原创 字符型,整形和浮点型在内存中的存储(包含大小端,整形提升,截断)

字符型,整形和浮点型在内存中的存储(包含大小端,整形提升,截断)

2021-12-08 15:30:50 1209 3

空空如也

空空如也

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

TA关注的人

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