自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 论坛开发社区详解——2、登陆功能

这里使用的是新浪邮箱,我们需要开启pop3/smtp服务,并且在配置类中对其进行配置。添加依赖:添加过后对其进行配置:这里,我们使用新浪邮箱,所以host为smtp.sina.com然后smtp的固定端口号为465用户名为邮箱账号注意:密码为新浪邮箱客户端授权码协议为smtps,s代表是安全的配置完成后我们去写一个工具类,它的作用就是为了封装邮件发送的方法。(因为没有提供这种方法)

2024-12-02 16:12:27 779

原创 论坛社区开发详解——1、首页开发

首先对dao层进行开发,对于首页而言,我们需要在首页中展示帖子的信息,那么我们需要DiscussPostMapper对帖子进行查询。默认而言,我们查询10条帖子进行显示。除此之外,我们的discuss_post表(如下),包含的是user_id这个外键,但我们在页面进行显示的时候一般不会显示用户的id,而是会显示用户的名字也就是username,所以我们还需要UserMapper对这个进行查询。comment_count是一个冗余的设计,这里是方便我们进行页面的显示。

2024-11-28 14:34:59 807 1

原创 Java 7.4 - 分布式锁

对于单机多线程,我们使用 ReentrantLock 这类本地锁来控制多个线程对本地共享资源的访问;而对于分布式系统,我们使用 分布式锁 来控制多个服务对共享资源的访问。分布式锁基本要求:1、互斥2、高可用:锁服务时高可用的,即使获取锁的客户端出错,锁也一定会被释放,不影响其他线程对资源的访问。一般选择基于 Redis 或者 ZooKeeper 实现分布式锁,Redis 更多,这里介绍以 Redis 为例的分布式锁实现。

2024-08-29 21:21:54 574

原创 Java 7.3 - 分布式 id

ID 就是 数据的唯一标识。分布式 ID 是 分布式系统中的 ID,它不存在于现实生活,只存在于分布式系统中。分库分表:一个项目,在上线初期使用的是单机 MySQL。但随着需求不断增长,单机 MySQL 已经无法满足当前的需求,我们需要进行分库分表。分库分表后,数据分布在不同服务器的数据库上,数据库的自增主键无法满足 ID 的唯一性了。此时我们如何为不同的节点生成全局唯一的主键呢?——分布式 ID。

2024-08-29 20:57:53 2156

原创 Java 7.1 - 理论 & 算法 & 协议

C:Consistency 一致性A:Availability 可用性P:Partition 分区容错性对于理论计算机科学,CAP 定理指出,对于一个分布式系统而言,CAP 中的三个只能同时满足两个。分区容错性:分布式系统出现网络分区的时候,仍然可以向外提供服务。Base 理论起源于 2008 年,由 eBay 的架构师 Dan 在 ACM 上发表。BASE 是1、Basically Available 基本可用2、Soft-State 软状态。

2024-08-29 20:17:56 547

原创 Java 6.3 - 定时任务

如果我们需要创建一个 15s 后执行的任务的话,那么我们就需要引入 圈数 / 轮数 的概念,这个任务会被放在下标为 3 的时间格中,但是它的圈数为 2。时间轮中的每个时间格代表了时间轮的基本时间跨度,如果 1s 走一个时间格的话,这个时间轮的精度就是 1s。另外,虽然它也支持分布式任务,但是它是在数据库层面,通过数据库的锁实现的,有非常多的弊端比如系统侵入性严重、节点fuza。不过 Timer 的任务只能串行执行,对性能的影响比较大,任务执行时间过长会影响其他任务,发生异常的时候会直接停止。

2024-08-29 18:29:50 1060

原创 Java 5.3 - MyBatis

{}和${}的区别是什么?${} 是 Properties 文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于静态文本替换,比如 ${driver} 被静态替换为#{} 是 sql 的参数占位符。

2024-08-28 16:37:12 1132

原创 Java 5.1 - Spring

开源的 轻量级的 Java 开发框架,旨在提高开发效率和系统可维护性。一般我们说 Spring 都是指 Spring FrameWork,它是很多模块的集合,使用这些模块可以很方便地帮助我们进行 Java 开发。例如 Spring 中集合了 IoC、AOP,我们通过 Spring 可以很方便地访问数据库、方便集成第三方组件、对单元测试支持比较好。Spring 最核心的思想就是不用重新造轮子,开箱即用,提高效率。Spring 的核心功能是 IoC 和 AOP。Bean 就是 IoC 代为管理的对象。

2024-08-28 15:48:31 962

原创 Java 4.3 - Redis

Redis 是使用 C 语言开发的一个数据库,它的数据是存储在内存当中,所以它的存取速度是非常之快的,因此 Redis 被广泛用于缓存。Redis 除了做缓存之外,还可以用来做 分布式锁、消息队列、事务等等。Redis 通过创建快照的方式来保存某个时间点上的数据副本。Redis 创建快照之后,可以对快照进行备份,将它复制到其他服务器而创建具有相同数据的服务器副本(Redis 主从结构),还可以将快照留在原地以便重启服务器使用。RDB 持久化是 Redis 默认采用的持久化方式。

2024-08-27 16:42:51 870

原创 Java 4.2 - MySQL

MySQL 是一种关系型数据库,可以持久化存储我们系统中的一些数据,例如用户数据。MySQL 是开源免费且比较成熟的数据库,被应用在各种系统中。MySQL 的默认端口为 3306。1、读未提交:允许读取未提交的更改2、读已提交:允许读取已经提交的更改3、可重复读:同一事物内读取同一数据结果一致4、可串行化:最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行。

2024-08-23 17:20:56 1103

原创 Java 4.1 - 数据库基础

我们可以把存储过程看作是一些 SQL 语句的集合,中间加入了部分逻辑控制语句。存储过程在业务中比较实用,很多时候我们完成一个操作需要写一大串 SQL 语句,这时候我们可以写一个存储过程,方便我们下一次调用。

2024-08-23 12:19:43 301

原创 Java 3.2 - 操作系统

1、操作系统,简称 OS,它是管理计算机硬件和软件资源的程序,它是计算机的基石。2、操作系统本质上就是运行在计算机上的一个软件程序,用于管理计算机硬件和软件。3、操作系统可以屏蔽硬件的复杂性。4、操作系统的内核是操作系统的核心部分,它负责系统内存管理、硬件管理、文件管理、应用程序管理。内核是连接应用程序和硬件的桥梁,决定系统的性能和稳定性。综上,操作系统是一个可以同时管理计算机硬件和软件的程序,它的本质就是运行在计算机上的一个软件,它通过内核屏蔽硬件,搭建起硬件和软件之间的桥梁。

2024-08-23 11:01:50 721

原创 Java 3.1 - 计算机网络

第四次挥手的时候,客户端发送给服务端的 ACK 可能会丢失,此时服务端没有接收到 ACK,重新发送 FIN,如果客户端收到了 FIN,就会重新发送 ACK到服务端。例如购物车,因为 HTTP 是无状态的,所以我们不知道是谁将商品添加到了购物车中,但我们可以通过服务端给特定的用户创建特定的 session 之后,就可以标识这个用户并且跟踪他了。互联网是通过大量的异构网络和路由器进行连接的,互联网使用的网络层协议是无连接的网际协议和许多路由选择协议,因此互联网的网络层也被叫做网际层或 IP 层。

2024-08-22 16:08:57 1694

原创 Java 2.4 - JVM

引用计数法和可达性分析法都需要判断对象引用数量。1.2 之前,如果 reference 类型的数据存储的是另一块内存的起始地址,这块内存代表一个引用。1.2 之后,引用的概念进行了拓展,分为强引用、软引用、弱引用、虚引用(引用强度降序)u4 magic;//Class 文件的标志//Class 的小版本号//Class 的大版本号//常量池的数量//常量池//Class 的访问标记//当前类//父类//接口数量//一个类可以实现多个接口//字段数量//一个类可以有多个字段。

2024-08-21 17:24:26 862

原创 Java 2.3 - 多线程

图解:一个进程中可以包含多个线程,线程共享进程的堆空间和方法区(1.8之后的元空间),但它也有自己的程序计数器、虚拟机栈和本地方法栈、进程可以由多个线程组成,它们之间的最大区别是进程之间基本相互独立,而线程之间有可能互相影响。线程的开销小,但不利于资源的管理和保护;进程相反。1、字节码解释器通过改变程序计数器来依次读取指令,以此来完成代码的流程控制。2、当存在多线程的时候,程序计数器用于记录该线程运行到哪个位置,当线程运行的时候知道从哪里开始运行。线程私有原因:线程切换后知道从哪条指令开始执行。

2024-08-16 11:58:04 935

原创 Java 2.2 - Java 集合

Java 集合,也叫做容器,主要是由两大接口派生而来:一个是接口,主要用于存放单一元素;另一个是接口,主要用于存放键值对。。

2024-08-07 22:56:12 684

原创 堆排序梳理

aaa。

2024-08-06 14:32:25 144

原创 Java - 2.1 Java基础

在 Java 中,字节码指 JVM 可以理解的代码,其拓展名为 .class ,它不面向任何特定的处理器,只面向 JVM。Java 通过字节码的方式,一定程度上解决了解释型语言执行效率低的问题,而同时又保留了解释性语言可移植的优点。所以,Java 语言相对高效,但比不过C++。.class -> 机器码,在这一步,JVM类加载器先加载字节码文件,然后对通过解释器进行逐行解释。这样的效率就比较慢,所以我们引入了 JIT 编译器(运行时编译)。

2024-08-05 21:54:36 1847

原创 排序算法总结

希尔排序是插入排序的优化版本,最后一轮增量为1的时候即为插入排序。它通过交换两个较远位置的数字来达成一次交换能消除一个以上的逆序对。打破在O(1)空间复杂度的情况下,时间复杂度始终为O(n^2)的问题。堆排序分为三个步骤:一是创建大根堆,然后将最大的元素放置到数组末尾;二是对剩余的元素重新进行大根堆的调整。三是重复操作,直到数组有序。快速排序是一种考的比较多的排序,它的思路是首先取出一个基数(pivot),然后将数组中比它小的元素放在它的左侧,而比它大的元素放在右侧。

2024-07-26 15:10:43 895

原创 leetcode 147. 对链表进行插入排序

因为last及其之前的节点都已经是有序的了,那么我们就从dummyHead向后寻找那个位置,即pre(初始为dummyHead,逐渐向后寻找).next.val <= cur.val。(2)last.val > cur.val 此时需要将cur向前进行插入,那么我们需要寻找插入的位置。如果说(1)last.val <= cur.val 那么我们不需要进行排序,继续向后移动。首先我们使用两个指针,一个last和一个cur进行标记,比较他们两的大小。寻找到这个位置后,我们就可以进行一番操作。

2024-07-14 17:25:19 504

原创 leetcode 排序算法的稳定性

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i] = r[j],且 r[i] 在 r[j] 之前,而在排序后的序列中,r[i] 仍在 r[j] 之前,则称这种排序算法是稳定的;比如数列:[2, 2, 1],在选择排序中第一次进行交换时,原数列中的两个 2 的相对顺序就被改变了,因此,我们说选择排序是不稳定的。冒泡排序中,只有左边的数字大于右边的数字时才会发生交换,相等的数字之间不会发生交换,所以它是稳定的。

2024-07-14 17:16:17 535

原创 leetcode 153. 寻找旋转排序数组中的最小值

(1)如果中间元素比最后一个元素小,这说明:中间元素在最小元素的右侧(或就是中间元素);所以我们舍弃掉右半边的元素,保留左半边的元素。(2)如果中间元素比最后一个元素大,这说明:中间元素在最小元素的左侧(或就是中间元素);所以我们舍弃掉左半边元素,保留右半边的元素。然而,因为数组进行一定程度的旋转,所以可以使用二分查找吗?这就让我们想到了——二分查找的运用。时间复杂度为O(log n)对数组中最后一个元素进行考虑。

2024-07-13 23:22:23 334

原创 leetcode 283. 移动零

但是对于这一题而言,因为它需要交换的是0和另外一个非0数,所以我们可以直接覆盖0即可。最后再把0补上就行。用index记录已经覆盖到的位置,把从index到nums.length处的元素全部设为0即可。使用双指针:慢指针左边均为非0元素;快指针左边到左指针都为0。我们只需要不断的去交换这两个指针位置的元素即可。

2024-07-13 14:53:17 361

原创 leetcode 119. 杨辉三角 II

List接口包括Collection接口的所有方法。这是因为Collection是List的超级接口。,每次迭代依赖“上一行”的数据,迭代之后的数据覆盖“上一行”的数据,每次迭代计算时,在Java中,这题需要返回一个List,借此机会来回顾一下List的相关知识。如果给定的行数rowIndex小于2,则直接返回,否则需要进行。为了使用List接口的方法,我们可以使用以下这四个类。)的空间复杂度进行解题,那么我们只能创建一个大小为。的List<Integer>。思路:我们需要用O(

2024-07-12 20:29:07 244 1

原创 leetcode 209. 长度最小的子数组

它基本上用掉了4ms左右的时间,后面把它改成fori求和就快了很多,只需要1ms。(1)首先找到一个大于target的窗口,这个过程是右窗口移动;1、暴力解法,对于每个索引开始的子数组进行遍历,效率很差。(3)记录这个最窗口长度,然后将右窗口向右移动一格;一开始的时候还在思考为什么做出来这题时间如此糟糕,(2)试图缩小窗口,即将左窗口向右移动;对于这种情况,我们首先想到的是双指针。(0)判断总和是否大于target。(4)重复2-3,找到最小窗口。

2024-07-12 15:19:34 204

原创 leetcode 27. 移除元素

我们用快指针去找与目标值相同的值,用慢指针来呈现新的数组内容(索引)。

2024-07-12 14:04:20 215

原创 leetcode 28.找出字符串中第一个匹配项的下标

【代码】leetcode 28.找出字符串中第一个匹配项的下标。

2024-07-11 16:45:14 212

原创 leetcode 151. 反转字符串中的单词

在进行分割后将它转换为一个List,使用List的反转方法。(很一般leetcode这个)2、多余的空格处理:String[] strs = s.split(" ");当我们进行处理的时候,碰到strs[i]为空的时候,跳过即可。1、前导、尾随空格的处理:s = s.trim();用于去除字符串两端的空白字符,非常方便。大幅提升了时间效率,也减小了内存消耗。

2024-07-11 16:19:28 207

原创 leetcode 5.最长回文子串

该函数结合奇数和偶数情况,对中心两侧的字符进行检查,以获取回文串的最大长度。在获取了最大长度后,加之中心字符的索引,我们就可以得到该回文字符串。这里需要注意返回的内容是right - left -1;1、奇数长度回文,以一个字符作为中心。2、偶数长度回文,以两个字符作为中心。如果不理解可以随手画个图感受一下。

2024-07-11 15:43:14 173

原创 leetcode 14.最长公共前缀

1、将第一个字符串拿出来,找它和下一个字符串的前缀交集,然后保存;再将保存的字符串和下一个继续进行比较,直到最后结束。然后对比每一个字符串的第i个字符是否相等,直到比较到不相等的时候退出循环,返回子串。2、纵向对比法,先找出最短的字符串,最长公共前缀长度一定小于等于这个字符串的长度。这种方法为横向对比法,效率很低。

2024-07-10 15:59:31 122

原创 java中字符串的比较和连接

s2是s1的另一个引用。如果使用==进行检查。

2024-07-10 15:18:18 115

原创 对角线遍历

例如:(1)坐标和为偶数,起始位置j = max(0,k - m + 1)3、坐标之和为奇数时从右上向左下放入数组;为偶数时从左下到右上放入数组。(2)坐标和为奇数,起始位置i = max(0,k - n + 1)1、每条对角线上的元素坐标之和相同为k = i + j,且递增。2、需要遍历的次数为m + n - 1条对角线。4、找出每条对角线开始元素的坐标。

2024-07-10 15:12:37 260

原创 n*n矩阵旋转-leetcode 48

这里还有一个知识点,不借助额外的存储空间,将int a和int b的值进行交换。那我们的思路:原第i行对应新第n-1-i列;原第j列对应新第j行(倒序)。最后a = 1 ^ 2 ^ 1 = 1 ^ 1 ^ 2 = 2。实际上我们就使用前面半句话即可,原第i行对应新第n-1-i列。如果不是n*n矩阵而是一个普通的矩阵,其次b = 1 ^ 2 ^ 2 = 1。且异或运算具有交换律和结合律。首先a = 1 ^ 2。1、顺时针旋转90度。2、逆时针旋转90度。

2024-07-09 17:21:37 183

原创 【2024项目实训】千帆大模型 ERNIE-Character-8K 客服对话文档分析

除此之外,还有各种系统内的功能,ai经过学习后,就可以对用户的问题进行回答(有些不太聪明)。"(3)如果用户所需的功能系统中不存在,请回答:功能暂未开放,敬请期待!"(4)如果用户需要订票的话,请推荐他去系统中的“机票”或“火车票”功能" +"(5)如果用户需要小红书推文,请推荐他去系统中的“po文生成”" +"(6)如果用户需要旅游推荐的话,请推荐他去用户下面的各种推荐生成""(1)知道这些功能,并能根据用户的需要给他们推荐相应的功能" +"(2)对用户的简单问题进行回答" +

2024-06-23 17:19:26 408

原创 【2024项目实训】千帆大模型 - 天气插件的调用

如果我们需要达成像app那样的:风力及方向、湿度、体感等,我们都可以在prompt中进行设置并保存为模板,进行重复使用。下面我会给出一个城市,请你默认给出它近三天的天气状况(如果没有要求近几天),你的回答需要包括:温度、风力等级...,这相当于对场景进行预设,这样我们在调用的时候就不需要在代码中引入提示词,可以降低代码的耦合度;在这里我已经配置好了一个自定义的插件,在这个插件内部使用了文心一言内置的天气插件;(1)影响输出文本的多样性,取值越大,生成文本的多样性越强。(2)取值范围 [0, 1.0]

2024-06-22 15:14:26 333

原创 word转pdf 错误 未定义书签的解决办法

2024-06-04 19:43:03 526

原创 【2024项目实训】ERNIE-3.5-8K 千帆大模型API调用

最后返回给我们的是ai的回答,我们将这个回答进行一些处理之后就可以直接输出了。在百度智能云中,千帆大模型平台的文档,找到ERNIE-3.5-8K。应用接入部分,可以找到API Key和Secret Key。而在messages中,必填的有role和content。boby中,必填的参数是messages。获取到唯一的access_token。通过该token对API进行访问;

2024-05-29 17:28:25 652

原创 多线程相关——线程安全(大部分都比较难)

当调用method1时,在线程中会产生一个Lock Record,其中Object reference指向Object对象,Lock record的地址是用来替换Object中的地址的(CAS操作——保证在修改数据的时候是原子操作)。在创建一个线程时,会创建一块工作内存,且其他线程无法访问这一部分,所以不存在线程安全问题。Compare And Swap(CAS),它体现的一种乐观锁的思想,在无锁的情况下保证。synchronized锁是对象锁,是一种互斥锁,最多只有一个对象持有它。

2024-05-29 17:13:19 437

原创 多线程相关——线程基础

3、wait调用必须先获取锁,wait执行后会释放锁,sleep如果在synchronized中执行不会释放对象锁。重写了call方法,但是在实现接口时需要指定一个泛型,重写的call方法的返回值必须和泛型的类型一致;使用方法:首先创建该类的对象,然后将它包装在Thread类中,最后调用start方法。1、wait是Object的成员方法,sleep是Thread的静态方法。实现了Runnable接口,重写了run方法,但是使用方法不一样。2、不同进程使用不同的内存,同一个进程下的线程共享内存。

2024-05-29 17:12:48 313

原创 【2024项目实训】消息中间件篇-Kafka

如上图,p1分区中我们已经消费了0-4的消息,那么此时的偏移量就是5,所以我们继续从5获取消息。1、生产者发送消息,从linux的用户空间发起,但是用户空间没有权限对硬件进行操作。到内核空间中去处理,内核空间中存在页缓存,消息到达一定的批次后,批量发送给磁盘。topic分区中的消息只能由一个消费者进行消费,所以消息肯定是按顺序处理的。key可以决定消息存储在哪个分区,我们只需要将key设置为相同的值就可以了。即:如果消费者2消费到5,但是只提交到了3,中间的消息就会被重复消费。

2024-05-29 17:12:06 622

空空如也

空空如也

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

TA关注的人

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