- 博客(81)
- 收藏
- 关注
原创 总结Spring IOC和DI
容器是⽤来容纳某种物品的(基本)装置。⽣活中的⽔杯,垃圾桶,冰箱等等这些都是容器。我们之前的数据存储容器, List/Map, web容器 Tomcat其实我们在一开始学习框架的时候, 在类上⾯添加 @RestController 和 @Controller 注解,就是把这个对象交给Spring管理,Spring框架启动时就会加载该类.把对象交 给Spring管理,就是IoC思想.IoC: Inversion of Control (控制反转),也就是说Spring是⼀个"控制反转"的容器.
2025-04-11 20:50:10
492
原创 总结 MyBatis 的注解实现方法
• MyBatis是⼀款优秀的持久层框架,⽤于简化JDBC的开发。• MyBatis本是Apache的⼀个开源项⽬iBatis,2010年这个项⽬由apache迁移到了googlecode,并 且改名为MyBatis。2013年11⽉迁移到Github。在上⾯我们提到⼀个词:持久层持久层:指的就是持久化操作的层,通常指数据访问层(dao),是⽤来操作数据库的。
2025-03-31 20:30:31
981
原创 总结 Spring 中存储 Bean 的相关注解以及这些注解的用法.
对于同⼀个类,如何定义多个对象呢?⽐ 如多数据源的场景,类是同⼀个,但是配置不同,指向不同的数据源@Bean@Bean定义了多个对象的话,我们根据类型获取对象,获取的是哪个对象呢?运行结果:报错信息显⽰:期望只有⼀个匹配,结果发现了两个,userInfo,userInfo2.从报错信息中,可以看出来,@Bean注解的bean,bean的名称就是它的⽅法名.接下来我们根据名称来获取bean对象//获取Spring上下⽂对象//@Bean演示Bean的存。
2025-03-24 22:13:38
966
原创 总结 HTTPS 的加密流程
HTTPS也是⼀个应⽤层协议.是在HTTP协议的基础上引⼊了⼀个加密层.HTTP协议内容都是按照⽂本的⽅式明⽂传输的.这就导致在传输过程中出现⼀些被篡改的情况.上篇文章中已经介绍到了臭名昭著的运营商劫持案件, 这里再介绍一下.下载⼀个天天动听 未被劫持的效果,点击下载按钮,就会弹出天天动听的下载链接已被劫持的效果,点击下载按钮,就会弹出QQ浏览器的下载链接。
2025-03-14 20:37:18
922
原创 总结 HTTP 协议的基本格式, 相关知识以及抓包工具fiddler的使用
HTTP(全称为"超⽂本传输协议")是⼀种应⽤⾮常⼴泛的应⽤层协议.什么叫超文本呢? 就是超越文本, 不止可以传输字符串, 还能够传输图片, 文字, 视频, 音频....尤其对Java开发来说, http比tcp还重要.
2025-03-14 10:07:07
1513
原创 总结数据链路层相关知识
数据链路层的代表协议是以太网协议, 以太这个词出自于物理学.最初人们认为,光是一种波. 光能在真空中传播, 波都需要介质. 那么人们就脑补在真空中存在一种物质,称为"以太". 后来迈克尔逊–莫雷实验做了一个实验, 光在各个方向上传播速度都是一样的(光速不变前提), 这样就推翻了以太的存在. 但是以太这个词, 再互联网这个圈子中还是保留了下来.我们平时使用的网线, 也叫做"以太网线"我们平时使用的交换机, 也叫做"以太网交换机"以太网这个协议, 既涉及到数据链路层的内容也涉及到物理层的内容/
2025-03-11 14:46:17
341
原创 总结IP协议的相关特性
所谓的IP地址,其实是一个32位的整数(4字节), 但是我们平时看到的并不是一系列二进制数字, 而是点分十进制. 由于按照32位的方式表示, 就会使这个数字变的很大, 很难理解记忆. 一般都会把IP地址, 按照点分十进制的方式来表示.32位表示的数据量非常有限,无符号的话只有42亿9千万. 既然是"“地址",原则上是不能重复的.(每个设备的ip 得不相同). 现在全世界能上网的设备, 其实早都超出这个数字了~~(达到百亿级别了).
2025-03-11 14:03:33
559
原创 总结TCP协议的相关特性
TCP全称为"传输控制协议(TransmissionControlProtocol").⼈如其名,要对数据的传输进⾏⼀个详细 的控制;表⽰数据是从哪个进程来,到哪个进程去;后⾯详细讲;表⽰该TCP头部有多少个32位bit(有多少个4字节);4个bit位能表示的范围是0-15, 而这里的单位是四个字节, 所以TCP头部最⼤⻓度是15* 4 = 60字节.而TCP报头的前20个字节是固定的(就是抛去选项和数据部分), 也就是说TCP报头最短是20个字节.
2025-03-10 17:49:54
1029
原创 总结网络中的一些基本概念
⽹络互连的⽬的是进⾏⽹络通信,也即是⽹络数据传输,更具体⼀点,是⽹络主机中的不同进程间, 基于⽹络传输数据。那么,在组建的⽹络中,如何判断到底是从哪台主机,将数据传输到那台主机呢?这就需要使⽤IP地 址来标识。
2025-03-05 21:46:36
814
原创 浅谈⽂件操作和IO
文件是在硬盘上存储数据的一种方式. 操作系统帮我们把硬盘的一些细节都封装起来了. 程序猿只需要了解文件相关的接口即可. 而硬盘用来存储数据的, 和内存相比, 硬盘的存储空间更大, 访问速度更慢, 成本更低, 是一种持久化存储. 操作系统通过"文件系统"这样的模块来管理硬盘.可能你的电脑上面有好几个盘, 但实际上我们的电脑上只有一个硬盘, 是操作系统通过文件系统把这一个硬盘抽象成多个硬盘.NTFS windows 上的文件系统,背后有一定的格式来组织硬盘的数.EXT4 Linux上常见的文件系统.
2025-03-04 21:25:28
847
原创 总结 HashTable, HashMap, ConcurrentHashMap 之间的区别
HashTable是一个线程安全的哈希表实现,它继承自Dictionary类。HashTable使用 synchronized 方法来确保线程安全,这意味着在多线程环境中,多个线程可以同时访问HashTable,而不会导致数据不一致。HashMap是一个线程不安全的哈希表实现,它继承自类。HashMap不使用同步方法,因此在多线程环境中,需要手动同步或使用其他线程安全机制。
2025-03-03 16:06:03
325
原创 浅谈七大排序算法(详细讲解加代码实现)
1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序2. 时间复杂度:O(N*logN )3. 空间复杂度:O(logN)4. 稳定性:不稳定1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。2. 时间复杂度:O(N*logN)3. 空间复杂度:O(N)4. 稳定性:稳定排序算法最好时间复杂度最坏时间复杂度平均时间复杂度空间复杂度是否稳定插入排序O(n)O(n²)O(n²)O(1)是希尔排序。
2025-03-03 14:55:07
1170
原创 浅谈Java中的CAS
什么是CASCAS: 全称Compare and swap,字⾯意思:”⽐较并交换“.能够比较和交换某个寄存器中的值和内存中的值, 看是否相等. 如果相等,则把另外一个寄存器中的值和内存中的值进行交换. CAS有哪些应用呢?比如, 多线程针对一个count变量进行++. 在java标准库中, 已经提供了一组原子类.基于CAS 实现更灵活的锁,获取到更多的控制权. 但是遇到一些极端的场景就不一定了. 可如果是3个线程呢?虽然上述操作,概率比较小,也需要去考虑. 假设上述情况出现的概率是万分之一,
2025-02-25 21:21:13
186
原创 浅谈死锁的原因以及解决方案
死锁就是两个人(或两个线程)互相等对方,结果谁也动不了。在生活中,这种情况很常见,比如两个人互相等对方先让路,结果谁也走不了。在编程里,也是类似的道理,只是换成了线程和资源。
2025-02-23 22:11:31
426
原创 总结常见的锁策略
注意: 接下来总结的锁策略不仅仅是局限于 Java . 任何和 "锁" 相关的话题, 都可能会涉及到以下内容. 这些特性主要是给锁的实现者来参考的. 普通的程序猿也需要了解⼀些, 对于合理的使⽤锁也是有很⼤帮助的.
2025-02-23 18:06:13
118
原创 谈谈对线程的认识
这里的时间主要是消耗在申请资源上的. 进程是系统分配资源的基本单位. 这其中, 内存分配就是一个大活, 操作系统内部有一定的数据结构把空闲的内存分块管理好. 当我们去进行申请内存的时候, 系统就会从这样的数据结构中找到一个大小合适的空闲内存, 返回给对应的进程.一个进程, 最开始的时候, 至少要有一个线程. 这个线程负责完成执行代码的工作. 也可以根据需要,创建出更多的线程, 从而使当前实现"并发编程"的效果. 每个线程都可以独立地执行一段代码.每一个线程, 也有状态, 优先级, 上下文,记账信息....
2025-02-21 22:26:23
310
原创 简单模拟实现一个线程池
• newScheduledThreadPool: 设类似于定时器的效果.添加一些任务,任务都在后续的某个时刻再执行.被执行的时候不是只有一个扫描线程来执行任务, 可能是由多个线程共同执行所有的任务.• 使⽤ Executors.newFixedThreadPool(10) 能创建出固定包含 10 个线程的线程池.池(Pool)是一个非常重要的思想方法. 内存池, 进程池, 连接池, 常量池......• newSingleThreadExecutor: 创建只包含单个线程的线程池.
2025-02-21 20:42:38
287
原创 模拟实现Java中的计时器
定时器是⼀种实际开发中⾮常常⽤的组件. ⽐如⽹络通信中, 如果对⽅ 500ms 内没有返回数据, 则断开连接尝试重连. ⽐如⼀个 Map, 希望⾥⾯的某个 key 在 3s 之后过期(⾃动删除). 类似于这样的场景就需要⽤到定时器.定时器也是软件开发中的⼀个重要组件. 类似于⼀个 "闹钟". 达到⼀个设定的时间之后, 就执⾏某个指定好的代码. 前端/后端中都会用到计时器.• schedule 包含两个参数. 第⼀个参数指定即将要执⾏的任务代码, 第⼆个参数指定多⻓时间之后 执⾏ (单位为毫秒).
2025-02-21 13:18:20
536
原创 模拟实现Java中的阻塞队列
阻塞队列是⼀种特殊的队列. 也遵守 "先进先出" 的原则.阻塞队列是⼀种线程安全的数据结构, 并且具有以下特性:• 当队列满的时候, 继续⼊队列就会阻塞, 直到有其他线程从队列中取⾛元素.• 当队列空的时候, 继续出队列也会阻塞, 直到有其他线程往队列中插⼊元素.阻塞队列的⼀个典型应⽤场景就是 "⽣产者消费者模型". 这是⼀种⾮常典型的开发模型.
2025-02-19 22:00:01
207
原创 总结单例模式的写法(在线程安全的情况下)
啥是设计模式?设计模式好⽐象棋中的 "棋谱". 红⽅当头炮, ⿊⽅⻢来跳. 针对红⽅的⼀些⾛法, ⿊⽅应招的时候有⼀ 些固定的套路. 按照套路来⾛局势就不会吃亏. 软件开发中也有很多常⻅的 "问题场景". 针对这些问题场景, ⼤佬们总结出了⼀些固定的套路. 按照这 个套路来实现代码, 也不会吃亏.单例模式能保证某个类在程序中只存在唯⼀⼀份实例, ⽽不会创建出多个实例.单例模式具体的实现⽅式有很多. 最常⻅的是 "饿汉" 和 "懒汉" 两种。
2025-02-19 21:25:33
901
原创 谈谈 wait 和 notify
多线程调度是随机的, 很多时候希望多个线程能够按照咱们规定的顺序来执行. 完成线程之间的配合工作. wait和notify就是一个用来协调线程顺序的重要工具. 这俩方法都是 Object 提供的方法.随便找个对象,都可以使用wait和notify.
2025-02-17 21:21:58
271
原创 浅谈线程安全问题的原因和解决方案
上述的代码中两个线程, 针对同一个变量, 进行循环自增. 各自自增5w次,预期最终应该是10w, 但实际上,并不是这样的结果. 每次运行的结果都不一样, 并且还都是错的.在多线程下,发现由于多线程执行,导致的bug, 统称为"线程安全问题". 如果某个代码, 在单线程下执行没有问题, 多个线程下执行也没问题, 则称为"线程安全",反之就可以称为"线程不安全".那么啥是bug呢?
2025-02-16 22:05:15
757
原创 总结 Java 线程的几种状态
一个线程在没执行star方法之前是NEW状态, 执行start方法后就会是RUNNABLE状态, 此时如果是sleep造成的堵塞, 线程状态就会变成TIMED_WAITING, 要是wait造成的堵塞, 线程状态就会变成WAITING, 要是synchronized造成的堵塞, 线程状态就会变成BLOCKED.其实这里所提到的状态, 就是pcb里的状态字段, 系统设定将线程分为了就绪状态和堵塞状态, 但是在Java中, 把上述状态又做了划分. 就是以下六种.
2025-02-16 16:45:22
149
原创 总结Thread的基本用法
Runnable这里则是分开了,把要完成的工作放到Runnable 中, 再让Runnable和Thread配合.lambda表达式, 本质上就是一个"匿名函数". 这样的匿名函数, 主要就可以用来作为回调函数来使用.当我们使用并发编程的方式,来完成某个工作时, 就可以用Runnable描述这个工作的具体细节.这种方法就是把线程要执行的任务和线程本身,进一步的解耦合了.使用线程池的方式,就可以使用Runnable搭配线程池使用.使用多线程的方式,就可以使用Runnable搭配线程使用.
2025-02-12 21:16:46
499
原创 谈谈Thread类中run和start的区别
当我们点击运行程序的时候, 就会先创建出一个java进程, 这个进程中就包含了至少一个线程, 这个线程也叫做主线程, 也就是负责main方法的线程.start()方法执行时, 会调用系统api, 在系统内核中把线程对应的pcb啥的给创建出来并管理好, 新的线程就参与调度了.run()方法只是上面入口的方法(普通的方法), 并没有调用api, 也没有创建出真正的线程.每个线程都能被独立地调度执行。
2025-02-12 11:08:32
212
原创 浅谈进程和线程的区别和联系
这使得线程切换更快,更适合高并发场景。因为进程的上下文较大,所以进程切换的开销相对较大。创建进程的时候把分配资源的工作给做了, 后续创建线程, 直接共用之前的资源即可. (这里的资 源大概指的是内存指针和文件描述符表所对应的资源)而线程是多个线程公用一份地址空间, 一个线程一旦抛出异常, 就可能会导致整个进程异常结束, 多个线程之间容易相互影响.1. 进程包含线程. 都是为了实现并发编程的方式, 线程比进程更轻量.2. 进程是系统分配资源的基本单位, 线程是系统调度执行的基本单位.
2025-02-08 14:13:05
253
原创 谈谈MySQL中的索引和事务
索引相当于一本书的目录(index), 在一个表里有很多数据, 在查询表的时候, 最基本的方式就是遍历表,一条一条地进行筛选. 因此,就可以给这个表,来建立索引来提高查找的速度, 而索引是以"列"为维度进行建立的.表中有很多列, 查询的时候, 查的方式也有区别. 有的时候, 是按照id来查询. 有的时候, 是按照name来查. 还有的时候, 是按照邮箱来查.
2025-01-21 20:25:32
1018
原创 浅谈对进程的认识
操作系统是一个搞管理的软件1.对下,要管理各种硬件设备.2.对上,要给应用程序提供一个稳定的运行环境.进程(process), 是一个正在运行的程序.比如, 大家都有的qq, 或者电脑上运行的软件.同一个程序,运行多次, 就可能会产生出多个进程.平时所说的程序,指的是一些exe的可执行文件.得是把程序跑起来,才会涉及到"进程".程序, 是可执行文件.它只是在硬盘上的一个东西(静态的)如果双击程序,此时操作系统, 就会把可执行文件中的数据和指令,加载到内存中,并且让。
2025-01-09 22:38:36
703
原创 MySQL表的增删改查(进阶)
是把"行之间的关系"转换成"列之间的关系", 在SQL中,编写条件,条件都是列和列之间进行比较。SELECT 中使用 GROUP BY 子句, 就是指定一个列, 按照这个列进行分组, 这一个列中数值相同的会被放到同一组. 每个分组中, 都可以使用上述聚合函数来进行计算.笛卡尔积中,有的数据靠谱, 有的数据不靠谱.(靠谱指的是笛卡尔积表达的情况和客观情况是一致的)笛卡尔积,就是把两个表里的记录,按照排列组合的方式,构造成一个更大的表了.尤其是表的本身的记录比较多的情况=>多表联合查询, 也是非常低效的.
2025-01-04 17:41:19
1076
原创 优先级队列(堆)
Java集合框架中提供了和两种类型的优先级队列,是线程不安全的,是线程安全的,本文主要介绍。关于PriorityQueue的使用要注意:1. 使用时必须导入PriorityQueue所在的包,即:2. PriorityQueue中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出 ClassCastException异常3. 不能插入null对象,否则会抛出NullPointerException4.没有容量限制,可以插入任意多个元素,其内部可以自动扩容5.
2024-12-04 20:48:40
900
原创 详解二叉树
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看 起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:有一个特殊的结点,称为根结点,根结点没有前驱结点除根结点外,其余结点被分成M(M > 0)个互不相交的集合T1、T2、......、Tm,其中每一个集合Ti (1
2024-11-21 21:34:38
619
原创 Stack和Queue
一种特殊的线性表,其。进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。栈的删除操作叫做出栈。出数据在栈顶。
2024-06-17 12:04:09
1013
原创 LinkedList与链表
链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如 哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。在Java的集合框架库中LinkedList底层实现就是无头双向循环链表。
2024-06-11 14:13:58
1293
原创 简单模拟ArrayList的底层实现
在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:1. ArrayList是以泛型方式实现的,使用时必须要先实例化2. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问3. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的4. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的。
2024-05-31 16:52:39
1065
原创 包装类&简单认识泛型
一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的 代码,这种刻板的限制对代码的束缚就会很大。----- 来源《Java编程思想》对泛型的介绍。泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。
2024-05-28 21:26:22
864
原创 MySQL表的增删改查(基础)
可以看出, 查询结果临时表的列名和当前表达式是一致的. 万一查询的表达式非常复杂,就会导致列名也非常复杂,不利于用户来阅读.当我们在条件中,尝试使用别名的时候,这个别名不能被正确识别出来.mysql的 where条件中,无法使用列的别名!排序的时候, 根据什么来排序, 是由我们自己指定的. 默认的是按照升序排列, 如果是降序, 则要用到desc.这里的排序,也只是针对临时表进行的, 对于数据库上的原始的数据没有任何顺序上的影响。手动指定要查询的某一列或者某几列~~服务器返回的结果,就只包含想要的数据~~
2024-05-25 21:34:41
1247
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人