自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 苍穹外卖随记(二)

这样,在请求到达 Controller 层之前,就可以先检查缓存,如果缓存命中,则直接返回缓存数据,不再调用后续的 Service 层和 Repository/DAO 层。情景:由于大量人员参与点餐,那么每一次查看商品(查看分类、查看菜品等),都会对应和数据库进行一次io,那么这样就会使得mysql数据库的负载增大,查询效率降低,数据显示的速度慢,也就是导致系统响应慢,客户的使用体验较差。不然压根就没有数据!在分类菜品的情况下,可以使用分类的ID或者名称作为Key的一部分,以确保它能够准确反映缓存的内容。

2024-09-17 21:26:13 1050

原创 苍穹外卖随记(一)

13.在项目中有管理端和客户端和服务端,那么服务端是后端,管理端和客户端是前端,那么在设计接口时有这样的:/api/admin/applications,那么后端怎么根据这个接口开始开发呢?后端开发不仅仅是关于API端点的开发,它还包括了整个Web应用的后端逻辑,确保应用的稳定性、安全性和可用性。实际上,即使是非API端点,后端通常也需要进行一定的开发工作,因为这些端点可能涉及到服务器端的逻辑处理、数据库交互、用户认证、数据检索等。因此,即使是非API端点,后端开发也是不可或缺的一部分。

2024-09-08 22:19:04 1353

原创 --考核总结--

以下的示例是 hashmap在三个线程的并发下进行添加操作结论:通过多次运行得到结果,发现hashmap是线程不安全的。如何解决?第一:直接对hashmap的操作方法进行上锁。第二:可以使用map中的ConCurrentMap,它是支持并发操作的。下面是对hashmap上锁的两种方法:1.直接使用synchronized对hashmap的各个操作修饰;2.Collections.synchronizedMap(map参数)返回一个线程安全的hashmap。

2024-08-11 15:45:13 793

原创 --每周分享--

用10个bit(比特)位来技术工作机器的ID,用来保证多个服务器上生成ID的唯一性。如果存在跨机房部署的情况,还可以把这10个比特位拆分为两组,每组5个bit(比特)位。前面的5个bit(比特)表示机房ID,后面5个bit(比特)表示机器ID。10个比特位最大值是2的10次方,也就是最多1024台机器。它的最大值为2的12次方减1,也就是4096。根据这四个部分的组成规则,生成对应Bit位的数据,然后组装到一起生成一个全局唯一ID。场景中的全局ID作为业务主键,或者生成全局唯一的订单号。

2024-08-01 15:36:52 299

原创 认识VO、DTO、Entity

其实对于vo和dto,可以简单的理解为:前端请求,后端dto接收经处理返还前端,前端根据产品和场景需要,对dto数据进行转换为vo数据并将数据渲染展示给页面。至于为什么没有非常肯定的说,dto负责接收数据,vo返还数据。这是因为业务具有灵活性。我们刚才说到了dto向vo的转换,那么怎么转换?统一视图模型:后端可以定义VO层来统一不同前端应用或不同视图所需的数据格式,简化前端的处理逻辑。中间件处理:后端可以使用VO层来实现一些中间件逻辑,比如数据的过滤、格式化或添加额外的元数据。测试和模拟。

2024-08-01 14:31:43 767

原创 SpringMVC学习

接收参数1.路径设置@RequestMapping(value="地址",method="请求方式") 类|方法@GetMapping /@PostMapping 方法2.接收参数【重点】param(参数)举例:http://localhost:8080/ssm?直接接收 handler(类型 形参名)形参名 = 请求参数名eg: 前端请求: http://localhost:8080/param/value?

2024-08-01 13:09:27 857

原创 Mybatis学习

MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。insert– 映射插入语句。update– 映射更新语句。delete– 映射删除语句。select– 映射查询语句。MyBatis 在查询和结果映射做了相当多的改进。

2024-07-30 17:31:29 914

原创 @SpingFrameWork

简单的说就是各种java程序,控制层程序:Servlet、业务层程序:Service、持久化层程序:Dao整个项目就是由各种组件搭建而成的SpringIOC容器其实就是Spring容器的核心之一,负责存储、实例化、配置、组装组件(IOC:中文是控制反转的意思)实例化这些(类)组件,本来是我们程序员的事情,new对象、赋值等等;但是现在权力交给了IOC容器;怎么实例化:容器通过读取配置元数据来获取有关要实例化、配置和组装组件的指令。

2024-07-26 13:40:57 445

原创 javaweb后端学习--Maven

Maven是一个跨平台的项目管理工具。作为Apache组织的一个颇为成功的开源项目,其主要服务于基于Java平台的项目创建,依赖管理和项目信息管理。maven是Apache的顶级项目,解释为“专家,内行”,它是一个项目管理的工具,maven自身是纯java开发的,可以使用maven对java项目进行构建、依赖管理。

2024-07-25 13:46:12 593

原创 javaWeb学习--后端部分(一)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。HTTP 超文本传输协议。

2024-07-19 13:44:35 697

原创 前端学习(二)

HTML 事件可以是浏览器行为,也可以是用户行为。当这些一些行为发生时,可以自动触发对应的JS函数的运行,我们称之为事件发生.JS的事件驱动指的就是行为触发代码运行的这种特点DOM(Document Object Model)编程就是通过document对象及其提供的 API 来操作整个 HTML 文档的元素,实现动态的网页内容和样式变化。这种编程方式使得网页能够根据用户的操作或其他条件动态地更新其内容和外观。或者更简单的方式:RegExp对象方法方法描述compile在 1.5 版本中已废弃。

2024-07-17 21:19:30 408

原创 javaWeb--前端基础

HTML 主要用于网页主体结构的搭建。HTML5 是HyperText Markup Language 5 的缩写,HTML5技术结合了 HTML4.01 的相关标准并革新,符合现代网络发展要求,在 2008 年正式发布。HTML5 由不同的技术构成,其在互联网中得到了非常广泛的应用,提供更多增强网络应用的标准机。与传统的技术相比,HTML5 的语法特征更加明显,并且结合了SVG的内容。这些内容在网页中使用可以更加便捷地处理多媒体内容,而且 HTML5中还结合了其他元素,对原有的功能进行调整和修改,进行。

2024-07-16 13:43:53 949

原创 ---初始Linux---

1. Linux是一套免费使用和自由传播的类Unix操作系统。2. Linux操作系统是基于以前的Unix操作系统而开发出来的。3. 是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。4. 它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和63位硬件。5. Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

2024-06-02 19:35:55 2024

原创 java--反射

/构造器名称 + 构造器参数类型(后面的方法返回的是类型的数组,因此用Arrays.toString,Arrays中的toString方法已经被重写了)//5. 获取有参构造器(这里的参数:.class代表类型【相当于一种变量】,如果只有类型,那么参数列表的结构不对了【类型 变量】)//4. 获取有参构造器(这里的参数:.class代表类型【相当于一种变量】,如果只有类型,那么参数列表的结构不对了【类型 变量】)System.out.println(c1.getSimpleName());

2024-05-30 19:54:48 852

原创 单元测试(了解)

可以用来对方法进行测试,它是第三方公司开源出来的(很多开发工具已经集成了Junit框架,比如IDEA)

2024-05-27 22:41:52 562

原创 网络通信--demo--群聊

客户端---->服务端(子)---->客户端(online)群聊的思想:客户端发送消息后,所有客户端都可以接收到。online的客户端:需要一个集合存储。

2024-05-26 21:32:55 185

原创 网络通信(二)

UDP通信特点:无连不是先接、不可靠通信不事先建立连接;发送端每次把要发送的数据(限制在64KB内)、接收端IP、等信息封装成一个数据包,发出去就不管了java提供了一个java.net.DatagramSocket类来实现UDP通信DatagramSocketDatagramSocket 用于创建客户端和服务器端的 UDP 通信。它提供了发送和接收 DatagramPacket 的方法。构造器: DatagramSocket(int port): 创建绑定到特定端口的 Dat

2024-05-26 18:00:43 591

原创 --java日期时间--

用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。此方法使用于计算时间差。

2024-05-25 16:15:29 443

原创 网络通信(一)

网络编程是计算机科学中一个重要的领域,它涉及到在不同计算机之间通过计算机网络进行通信和数据交换的程序设计。网络编程的核心是实现网络通信协议,这些协议定义了数据如何在网络上发送、接收和解释。:网络通信遵循的规则。例如,TCP/IP、HTTP、FTP、SMTP等。:网络编程中的基本构建块,用于在客户端和服务器之间建立连接。:这是一种网络架构,其中客户端发起请求,服务器处理请求并返回响应。:应用程序接口,用于简化网络编程任务,如发送HTTP请求或处理网络数据。

2024-05-25 13:37:21 349

原创 线程池(三)

正在运行的程序(软件)就是一个独立的进程。线程是属于进程的,一个进程中可以同时运行很多个线程。进程中的多个线程其实是 并发和并行 执行的。进程中的线程是由CPU负责调度执行的,但是CPU能同时处理线程的数量有限,为了保证全部线程都能往前执行,CPU会轮询为系统的每个线程服务,由于CPU切换的速度很快,给我们的感觉是这些线程在同时执行,这就是并发。【“假的”同时执行】在同一时刻上,同时由多个线程在被CPU调度执行【“真的”同时执行】

2024-05-22 21:58:25 978

原创 多线程(二)

线程安全(Thread Safety)是指在多线程环境中,一个类或对象的行为符合预期,并且不会由于多线程的并发操作导致数据不一致或状态错误。简单来说,如果一个类或对象在多线程环境中使用时,不需要额外的同步措施就能保证其操作的正确性,那么它就是线程安全的。线程安全问题通常发生在多个线程访问共享资源时,如果没有适当的同步机制,可能会导致数据竞争(Race Condition),从而产生不可预测的结果。线程池是一种执行器(Executor),用于在一个后台线程中执行任务。

2024-05-19 19:40:22 1788

原创 --N数之和--

/实际上,保证不相同,nums[i]不变,nums[left]变了就已经满足了,nums[right]也变是为了优化而已。下面注释掉也可以通过!//主要思路:对数组中的每一个数进行操作,初始的map是一个空map,每次判断差值是否存在map总,如果存在,那么一定是第二个数。//相似地,nums[left] + nums[right] = nums[i];//统计剩余的两个元素的和,在map中找是否存在相加为0的情况,同时记录次数。//统计两个数组中的元素之和,同时统计出现的次数,放入map。

2024-05-19 11:38:48 810

原创 分享快乐--睡眠排序

【代码】分享快乐--睡眠排序。

2024-05-18 16:54:05 104

原创 多线程(一)

如果仅仅需要执行一些简单的任务,可以使用继承Thread类的方法;多线程(Multi-threading)是指在一个进程中同时运行多个线程,每个线程执行其自己的任务。线程和进程类似,但线程是进程中的一个独立运行的部分,是进程中的轻量级进程。1)启动线程必须是调用start方法,不是调用run方法(否则,整个程序本质上就是一个实例调用其方法,直到程序完成,只有一条主线程在推进)多线程编程虽然能够提高程序的性能和响应性,但也需要开发者注意线程同步、资源竞争、死锁等问题,以确保程序的稳定性和正确性。

2024-05-16 19:15:05 738 2

原创 --每周分享--

原理就是:修改head的位置,即将HEAD指向的位置改变为之前存在的某个版本,head就是指向当前版本的指针特点:回退到历史某一版本,该版本之后的版本全部丢弃步骤:使用git log查看版本号git log使用“git reset --hard 目标版本号”命令将版本回退。举例我要回退到9feb83df6db8b132004325ab03377b2088cba540这个提交的版本:回退完之后可用git log再检验当前版本。

2024-05-13 22:02:50 720

原创 java--io流(二)

序列化流是Java I/O系统中的一种流,它允许将对象转换为字节流,以便可以将其存储到文件、数据库或通过网络传输。Java中的序列化流主要包括和。用于将对象序列化为字节流,而用于从字节流中反序列化恢复对象。

2024-05-11 22:08:31 1775

原创 java--io流(一)

i就是input(叫做输入流)就是从网络或者磁盘文件等中读取数据到程序中;o就是output(叫做输出流)就是将程序中的数据写入到网络或者磁盘文件等中。

2024-05-08 21:50:42 852

原创 数据结构-堆

堆是一种在内存中以数组形式高效实现的树形数据结构具有完全二叉树的性质,并且通过堆序性质保证了可以快速访问最大或最小元素。它在各种算法和应用中发挥着关键作用,特别是在需要快速访问和动态更新数据的场景中。(完全二叉树:只允许最后一行不满,且数据向左补满)1)自顶向下按照已经给的数组顺序将元素插入堆(末尾)上滤2)自底向上本身就先作为一个已经建好的堆(用数组表示),在此基础上用下滤操作。

2024-04-28 21:10:06 1067 1

原创 树的层序遍历(详解)

3)遍历是一个循环性的工作,写一个死循环,死循环的第一步就是跳出死循环的条件:当队列中没有东西时退出(换句话说,没东西可遍历了)。4)每弹出一个元素,再访问(就是进行符合场景的操作),最后添加两边的左右子节点(如果不为空的话)。2)判断根节点是否为空,不为空则添加根节点到队列中。层序遍历主要是如何实现的?依赖于什么数据结构,核心的想法是什么?1)创建一个队列的容器对象。离开这一道题,我们应该明白什么?1.依赖于队列的数据结构。

2024-04-26 19:23:29 297

原创 数据结构--图

图(Graph)G由两个集合V和E组成,记为G=(V, E),其中V是顶点的有穷非空集合,E是V中顶点偶对的有穷集合,这些顶点偶对称为边。V(G)和E(G)通常分别表示图G的顶点集合和边集合,E(G)可以为空集。若E(G)为空,则图G只有顶点而没有边。V(G)为空,则图不存在。

2024-04-21 19:06:39 765

原创 数据结构--树

至于root的变化 ,它是不断递归返回的,所以在最后返回的root就是我们需要的树顶节点的root。// 如果左子树的最大值大于等于根节点的值,或者右子树的最小值小于等于根节点的值,则不是二叉搜索树。叶子节点:(不是只有最后一层)如果一个节点下没有叶子节点,那么该节点被称为叶子节点。,或者需要在较大规模的数据集上操作二叉树,可能更倾向于使用迭代性的插入节点。特点:左子树上所有节点数据小于父节点数据,右子树上所有节点数据大于父节点数据。,递归性的插入节点可能是一个更好的选择。// 检查左子树的最大值。

2024-04-18 21:41:01 997

原创 --每周分享--

那么分区操作就得写在前面。怎么递归:找到中间值,有两段链表,那么就需要调用两次函数,分别对两边的链表继续分割。这就要提到一个注意点:怎么断开?如果在数组中,我们直接就用索引,【左边,mid】【mid + 1,右边】,但是在链表中我们要让mid->next = NULL,让链表在mid处断开,因为:确保每个递归步骤都在将链表分割为较小的部分时维护链表的正确性。在递归过程中,排序的过程可能会受到影响,因为递归过程中会改变链表的连接关系。递归结束条件是什么:分为一个结点时结束递归,开始合并。

2024-04-12 22:30:47 316

原创 数据结构之队列(FIFO)

5)IsFull()函数:由于数组难以扩容,所以我们总是会将他设计为循环队列来节省时间和空间.因此,我们在判断队列是否满时,总会将他看作一个圆.因此,我们会检查(tail+1)%10的模是否与front相等,如果相等则满,返回true.如果front == tail,前面已经判断过不等于-1,所以只有一个元素.直接front = tail = -1;4)IsEmpty()函数:当前仅当front == tail == -1L时,返回true;3)front()函数:如果为空,返回-1;

2024-04-07 15:22:29 542 1

原创 数据结构之栈(LIFO)

pop()函数:直接让top向后移动一位,这里注意:最后free掉的是原本top处的内存,而不是top指向的结点,所以需要有一个临时变量 = top,free(临时变量).在解释前,先说明栈这种数据结构有个特点,对于元素的添加、删除、返回栈顶元素,他们的实现都需要满足时间复杂度为O(1),其实就是他们的实现与元素的数量无关。链表的尾插需要O(n)的时间复杂度,所以我们直接选择头插法和头删法作为Push和Pop,同时也满足在O(1)下返回栈头元素。最后,其实栈是寄托于数组,链表等实体进行实现的。

2024-04-07 14:31:26 467

原创 数据结构之链表

1)单链表的反向输出:实现思想:利用了递归的思想(或者说栈的后进先出的特点)实现要点:怎么理解这里的递归,怎么用?递归的结束标志是什么?return;这里递归的结束点就是return,向主调返回。具体怎么实现就是这样,通过先递归后输出就可以实现从后往前输出;2)单链表的反转:实现思想:找到前面的结点和后面的结点,让后面的结点连接前面的结点,确保后面的后面的结点不丢失,所以还需要一个结点记住;实现要点:结点反转操作的步骤不能随意改变。printf("没有链表,还无法反转!");return。

2024-04-06 22:20:47 448

原创 leedcode第一题心得--快速排序(超详解)

这里说明,第一题本身不需要这么多代码,以下是为了锻炼算法。

2024-03-27 22:28:36 163

原创 java--File的例子练习

【代码】java--File的例子练习。

2024-03-25 14:50:58 245

原创 java--自写一个MyLinkedList集合

也可以是头结点只是没必要)结点以及之后结点的数据访问。我们会疑问:对于链表不是要从头开始吗?其实,从头开始只是我们不知道除了头结点以外其他结点的位置,但是只要我们知道其他结点的位置,就可以直接对结点数据进行访问!注意:这里有一个小点:我们直接使用了mark记录了一个结点的位置,在之后直接使用了mark对某一(4.实现forEach方法:实现对链表的遍历并输出(并不做Lamada表达式的要求)3.实现reverse方法:反转单链表;2.实现add方法:添加链表结点。1.实现集合定义:可支持泛型。

2024-03-24 10:01:52 174

原创 二分算法的变种----查找递增可重复数组边界

【代码】二分算法的变种----查找递增可重复数组边界。

2024-03-23 11:11:05 161

原创 写一个MyArrayList集合模拟官方的ArrayList

因此,虽然我们没有显式地创建一个类来实现 Consumer 接口,但通过 Lambda 表达式,我们可以轻松地创建接口实例,并且 forEach 方法会将列表中的每个元素作为参数传递给 Lambda 表达式中的 accept 方法。这里是用Lamada表达式为MyConsume接口创建了一个实例,然而接口方法的实现并没有显式的去实现accept方法,而是在Lamada表达式中定义了accept的方法就是在遍历集合时,拿到当前元素并结合print方法输出;//这一步是必须进行的,不能跟在else后面;

2024-03-23 09:43:38 486

空空如也

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

TA关注的人

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