- 博客(51)
- 收藏
- 关注
原创 大模型产生幻觉的原因,如何解决
Transfor语言模块本质上是一个“填空预测器”,它是根据概率来选择下一个输出的词,而不是在思考正确答案。2.Fine-tuning,微调,通过微调的方式,给模型学习专业领域的知识,让大模型更好的回答。1.RAG,通过RAG的方式,让大模型在回答问题之前先检索真实的数据,再让大模型回答。训练数据本身就存在错误信息,不完整的数据,偏见信息,导致大模型学到不真实的内容。5.在问题问答时,让AI自己检查自己的答案,并标记不确定的地方。6.联网,在AI生成答案之前,先通过网络查询最新的数据。
2025-10-24 20:45:37
279
原创 简单的实现RPC框架
在消费者模块中,不能通过创建HelloServiceImpl对象来调用Producer中的sayhello方法,那就只能通过网络请求的方式来调用,接收网络请求的方式有很多。需要在Producer服务启动时,启动Tomcat,在RPC模块中编写一个Tomcat启动方法,方法中的参数为IP地址和绑定的端口号。RPC框架通常返回的是一个代理对象,然后来执行代理对象的方法来实现服务的调用,接下来我们来编写一下代理类。类,是一个本地注册类,里面保存了接口与对应实现类的映射,保证调用的是想要的实现类的方法,以下是。
2025-03-17 20:04:08
995
原创 聊聊Redis
首先我们来聊一下,Redis是AP还是CP,我个人偏向于AP,在稍微大型的项目中,Redis不可能单节点部署的,如何Redis挂了,系统的效率就会很慢很慢,特别是有短时间高并发的系统,如果只部署单节点的Redis,数据库很大可能因为短暂的大量请求,导致数据库崩溃,所以Redis我个人偏向于AP。
2025-03-10 22:57:23
1055
1
原创 CAP三进二、Base原理和Raft算法
这个算法其实它是强一致和高可用的,强一致性上述已经体验到了,这里的高可用性我们可以来简单聊一聊,其实它也是得力于节点的三种状态机制,当Leader状态的节点,由于设备原因,导致Leader节点挂掉了,但是Follower状态的节点是怎么知道Leader挂掉的,这里也延申出另一个问题,我们前面也聊了Follower状态下的节点会自动的变成候选人状态,那为什么在选出了Leader,Follower就再也没出现候选人的状态呢?往往更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能被极大的弱化了。
2025-03-06 22:52:03
980
原创 I/O流的相关内容
方法其实跟字节流的方法实现差不多但是这里提示一下:字符是由多个字节组成的,所以字符流只能读取字符数据,如果读取字节数据就会发生乱码,但是字节流即能读取字符文件,又能读取字节文件,这就是两者的区别所在,换句话讲就是字符流是建立在字节流的基础上的。这里我们有两个方法,我们来解释一下两者的区别,第一个方法mkdir()创建的是一级目录,而mkdir()创建的是多级目录。I/O流:其实是Input/Ouput的缩写形式,I/O流是非常实用的技术,用来处理数据的传输,如读写/写入文件的操作,网络通讯等。
2023-12-17 21:23:27
234
1
原创 线程终止,线程的相关方法,线程状态图以及线程的同步机制。
这里有俩个非常常用的方法一个是yield:线程的礼让,一个是join:线程插队,线程的礼让:让出cpu,给其他线程先运行,但是会根据cpu的运行状态来确定,如果cpu的资源很丰富则不会礼让成功,所以线程礼让是不确定的,它不一定会成功,线程插队:线程插队跟线程礼让不同,它比较霸道,一旦插队成功是必须先执行完该线程,才会将cpu让出来给其他线程使用。(同步机制的互斥锁大多设置为自己的类即类名.class),该锁是必然有效的,因为类只能有一个,可以根据自己的喜好,自行添加锁。
2023-12-17 02:20:08
268
原创 南京邮电大学数据库实验二
4. 用alter table命令修改movies关系模式,增加引用完整性约束cpc,要求movies表中的producerC必须是在MovieExec表中已有的制片人。提示:check约束,数据库版本5.7以及5.7以下的会有check的定义但是check语句是无效的,即不能对添加的数据进行判断,需要使用触发器来进行处理,5.7版本以上,就可以使用check语句。提示:这里的fields by ',' 这里单引号内的符号是看你文件中是按什么来分割数据的,根据实际情况来自己修改符号。
2023-12-16 23:09:10
2292
4
原创 线程的介绍
程序就是我们编写的代码就叫程序,当我们程序运行的时候则称为进程,在我们现实生活中哪些用到了进程,就比如说我们qq,微信,百度网盘等等软件的使用,当它们在运行的时候,操作系统就会自动的给它们分配内存空间,那线程是什么,线程是由进程创建出来的,是进程的一个实体,一个进程可以拥有多个线程,线程分为两种一个是单线程,还有一个多线程。//这里就是一个模拟的一个run()方法,首先判断传入的对象是否为null,不为null的话就会直接调用传入对象的run()方法。//start0()会调用run()方法。
2023-12-16 18:58:22
129
原创 泛型的相关内容
当我们没有定义泛型时默认E为Object类型,而且泛型最好不要与静态属性定义在一块,因为二者是冲突的,没有确定E类型的时候是无法进行初始化的,泛型的定义不是一定要用E来表示也可以是其他的比如T,S,P等等,泛型的定义必须是引用类型,基本数据类型无法定义泛型。泛型的使用范围很广,可以定义属性,返回类型,数组(泛型定义的数组,不能进行初始化,因为类型不确定,所以无法开辟空间),接口等等,泛型一旦被定义一个固定的引用类型,即可传入本类或者其子类的类型。首先我们来了解一下什么是泛型,泛型的作用又是什么。
2023-12-16 01:50:38
243
原创 Set接口下的实现类HashSet,和Map接口下的HashMap的相关内容
这就是我们必须转换的原因。前面的调用跟前面的时完全相同的,不同点就是在这,它首先对你的hash值进行一个判断,看是否存放在同一个索引位置,如果相同则进行equals()进行比较看是否数组中已存在相同的元素,即比较俩者是否为同一个对象,相同的话前面的add方法中的return则返回的是false。这就是我们HashSet的一大特点,接下来我们来了解一下HashSet的底层机理,HashSet的底层其实调用的是HashMap,HashMap的底层则是(数组+链表+红黑树)。
2023-12-14 23:31:52
464
原创 实现List接口的常用三类
ArrayList底层是可变数组,而LinkedList底层是双向链表,二者的性质不同,LinkedList对增删操作的效率比较高,ArrayList对查改的效率比较高,两者都是线程不安全的,但是在以后的编程中对数据的查改操作更多,所以ArrayList是比较实用的,根据不同情况来选择不同的方式。跟我们的预期是一样的。这里我们选用的是ArrayList的无参构造器,ArrayList也有有参构造器但是机理是差不多的,待会分析,我们先来看一下无参构造器的扩容机理。
2023-12-13 23:44:02
347
原创 集合的基本内容以及迭代器的介绍
我们发现在Degbug增强for的时候发现进入了这个方法上,但是发现又有点眼熟,这不就是迭代器嘛,其实我们增强for的元素遍历就是调用的迭代器,换句话说增强for的本质就是迭代器,所以能有增强for方法的,一定能用迭代器遍历,这就是本次的全部内容,接下来的文章会比较繁琐,因为HashMap,HashSet,Hashtable等等这些类的内容以及源码;这里我们就解决了上述问题,当然大家也是可以重新得到一个新的迭代器来进行遍历。我们会看到增强for跟迭代器的效果是一样的。
2023-12-10 22:46:05
335
原创 Arrarys类的相关细节与知识点
排序过后的会不会正确这里我就先不演示了,感兴趣的朋友可以去尝试一下,copyof()方法顾名思义就是将旧数组完完全全的复制给新数组,fill()这个方法其实就是将数组中的元素按照数组的长度全部替换成指定元素,equals()这个方法我们之前也是聊过的,就是比较的方法,在这里就是数组之间的比较,两个数组完全一样则返回true,不同则返回false(这里的顺序也是必须是一致的,顺序不一致也是返回false),接下来我们重点讲一下Sort()方法的细节和使用。即return n1 - n2。
2023-12-06 23:33:54
290
原创 StringBuffer类和StringBuilder类的相关知识点
但是这俩个我们推荐使用哪个呢,在正常情况下呢我们推荐使用StringBuilder来进行对我们字符串的修改,因为它的效率会比较高,但是StringBuilder是线程不安全的,在特殊的情况下还是得有StringBuffer,StringBudder它是线程安全的。这里才是我们真正将数据存放进builder中的操作,我们上面知道刚创建的时候char[]的时候是直接是将长度扩展到16,但是如果长度超过16又是如何处理的呢,我们来看一下原理。
2023-12-05 23:08:43
242
原创 对String类的深入理解
字符串的初始化方式有两种一种是直接赋值 : String 变量名 = ".....",还有一种是调用构造器进行初始化:String 变量名 = new String("....")待会我们会解释一下这俩个方法的差异,首先我们来了解一下String类的一些基本概念,首先String类它是final的,简单来讲它是无法修改的,但是你在对它重新赋值的时候你会发现,它的值确实被修改了,待会我们会分析它被修改的原因。你在执行String name1 = “孙悟空”;
2023-12-04 23:39:33
183
原创 包装类的相关内容
这里有个小细节得注意一下,Integer默认的数字范围是-128 - 127,超出该范围的话底层就会new Integer();jdk5之前是需要我们进行手动装箱和手动拆箱的,jdk8之后我们就不需要进行手动装箱和拆箱,它代码底层会调用相关方法:我们来看一下代码如何进行自动装箱和拆箱。针对八种基本数据类型相应的引用类型—包装类,包装类就相当于将基本数据类型进行一个装箱的操作,包装类实际上是个类里面有很多定义好的方法,更加方便对数据的处理。大家也可以尝试的去Debug一下追源码,对我们的理解是非常有好处的。
2023-12-03 23:28:49
285
原创 java异常处理
这里我们发现程序给我们抛出来一个算数异常 / by zero,但是你们会发现我们不添加throws这个关键字,它也会给我们抛出这样一个异常,那是因为我们java异常处理机制,在你不做任何处理的情况下默认是throws,最后我们还有一个自定义的异常处理,throw new 自己定义的异常类名 要么继承Exception(属于编译异常)要么继承RuntimeException(属于运行异常)通常都是继承RuntimeException。我们发现不管是否捕获到异常我们的finally中的语句始终会被运行。
2023-12-03 00:23:42
211
原创 enum枚举法
枚举法严格意义上来讲的话,它存放的对象是固定的对象,它只支持读取,不支持修改,当我们需要创建季节这个对象时,我们就要知道,季节它是固定的它只有四个值分别为春、夏、秋、冬,如果我没有传统的创建对象的方法它可以new很多个值,它是支持修改的,因为这样的缘故,所以创建了enum关键字,枚举法有两种形式一个是自定义枚举。在用enum关键字开发一个枚举类的时候它会默认的继承Enum类。如果你试图在main方法中创建新的对象的话,你会发现代码是报错的,并且你如果想修改定义好的这四个对象的时候也是会报错的。
2023-11-26 22:30:22
170
原创 匿名内部类(内部类的重点)
这是匿名内部类的第一种形式,根据匿名内部类是一个对象的形式调用,你会发现在new IA()后面有一个.eat()的方法,就相当于把前面一个整体当成一个对象。匿名内部类也只能使用一次,因为在栈中没有对应的名称指向它,所以它在堆中使用一次就会被回收。匿名内部类的本质还是一个类,根据名称也可得出该类没有类名,匿名内部类同样还是一个对象,所以这也是triger的运行类型会是class inclass$1的原因。匿名内部类它是定义在外部类的局部位置比如说定义在方法内。该形式就是将匿名内部类直接当作实际参数进行传递。
2023-11-26 01:23:08
245
原创 内部类(局部内部类)
这段代码就能体现局部内部类的一些特征,后面还有静态内部类,成员内部类,还有匿名内部类(匿名内部类最主要)后面会单独写一篇关于匿名内部类的实例分析代码,源码中大部分都是匿名内部类的身影,想看懂源码匿名内部类必须学好。内部类可以分为两大类:1.局部内部类 2.匿名内部类(特别重要!)内部类都定义在外部类的成员方法上,有成员内部类和静态内部类两种。如果外部类成员变量名和局部内部类成员变量名重名时按照就近原则访问变量,如果想访问外部类的变量,则可以使用(类名.this.变量名)3.它仅仅作用在代码块或者方法中。
2023-11-24 22:50:09
87
原创 接口实现统一管理的代码实例
这里就可以看出我们的代码看起来就非常的有条理性,这里我们并没有真正的连接数据库,只是用打印文字的方式来做一个示范,希望大家对接口的作用有一个进一步的了解。
2023-11-23 22:35:42
259
原创 接口(interface)
接口的实质其实就是抽象类,在jdk7.0之前接口类中只能有抽象方法,不能有实体方法,在jdk8.0之后接口就能有默认的方法,静态方法。注意:接口是不能被实体化的,并且接口中的所有方法都是public,如果尝试用其他修饰符来修饰方法则会报错,抽象类实现接口时则可以不实现接口的方法,接口的作用其实也不止于此,它还有个很重要的作用:可以提高代码的可读性,统一管理方法名,使代码更加清晰,下一个文章我们可以用一个实例来解说。
2023-11-22 22:53:48
302
1
原创 抽象模板(实例)
该代码就将公共的代码放在了父类中,不一样的方法在子类中进行重写,你会发现只有activity这个方法在两个子类中的表述不一样这也是我们模块的突破点,就可以在抽象类中将这个方法设置为抽象方法,然后进行重写,这样就能达到我们简化代码的目的。
2023-11-21 23:06:13
792
原创 抽象类的实例展示
抽象类的引出是处于当我们设计父类时不知道类中的方法如何实现需要子类继承重写该方法,比如父类是个animal类,动物有很多种,它们有共同的特征比如吃喝睡,但是他们的这些行为都不相同,这就需要将父类设置为抽象类eat drink这些方法也设置为抽象方法,注意抽象类不能和final, private,static这三个一块使用,因为这三个和继承重写相冲突,抽象方法不能有方法体否则会报错,子类必须重写父类的抽象类方法否则也会报错。
2023-11-20 23:28:57
242
1
原创 final关键字的作用
3.类:当被final修饰之后,该类则不能被其他类继承,当类设置为final时类内部不希望被继承的方法就没有必要设置为private,因为类都为final就说明类中的所有方法都无法被继承。1.变量:当被final修饰之后,变量必须进行初始化才能使用,并且初始化之后该变量的值不能被修改,你试图去修改的话就会报错。5.当使用final修饰引用类型时,该引用变量指向的对象不能再改变,但是对象的内容还是可以修改的。final在英文中的意思为最后最终的意思,它可以用来修饰变量,方法和类名。
2023-11-20 22:47:32
216
1
原创 单例模式(懒汉式和饿汉式)
当我们在编写代码时,我们规定一个类中只能创建一个实例对象时,就像说老婆只能有一个这样的特殊情况时,这样我们就可以运用单例模式来创建对象,单例模式有俩种分明是懒汉式和饿汉式,当我们只能创建一个对象时,我们的构造器就要设置为private,让其他类不能访问该类的构造器,所以我们需要先在内部进行构造一个对象,再用一个public修饰的方法来接受创建的对象。下面懒汉式和饿汉式的俩个具体实例和一些必要的解释。但是懒汉式和饿汉式的f1()的方法可以被多次调用付给其他的对象但是其他对象所指向的地址肯定是同一个地址。
2023-11-20 00:05:39
381
1
原创 抽象类(abstract)
2.共享代码和行为:抽象类可以包含非抽象的方法和实例变量,这些方法和变量可以被子类继承和使用。1.定义类层次结构:抽象类可以作为类层次结构中的顶层类,定义通用的属性和方法,子类可以继承并实现具体的功能。3.约束子类的行为:抽象类可以定义抽象方法,要求子类必须实现这些方法,从而约束子类的行为。5.子类实现:继承抽象类的子类必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。4.抽象方法:抽象类可以包含抽象方法,抽象方法没有实际的实现,只有方法签名,即方法名和参数列表。关键字创建抽象类的对象。
2023-11-18 23:46:25
470
1
原创 static的相关内容
静态方法可以直接通过类名来调用,而无需创建类的实例对象。1.静态变量:被 static 修饰的变量称为静态变量,也叫类变量。3.静态代码块:使用 static 修饰的代码块称为静态代码块。静态代码块在类被加载的时候执行,并且只会执行一次。static这个为非访问修饰符中的一个:被它修饰的变量、方法、代码块,称为静态变量、静态方法、静态代码块。静态代码块和属性的优先级高于普通代码块的优先级。静态方法和变量是无法被继承的,因为它不是通过实例对象进行访问,是通过类加载而生成的。2.子类的静态方法和代码块。
2023-11-16 22:37:32
189
1
原创 访问修饰符的访问权限范围
修饰符一共有四种1.public 2.private 3.默认 4.protected。protected:可以被同一包内的类以及其他包中的子类访问。可以根据自己的需要来设定相关的访问权限。修饰符可以修饰类、属性、方法、构造器。public :可以被任何类访问。private:只能在本类中访问。默认:可以被同一包内的类访问。
2023-11-16 22:00:10
733
1
原创 继承的相关内容
这里的a不能访问B类的work方法,用大白话来解释就是a的编译类型为A,因为A内部没有work这个方法所以系统它找不到这个方法所以无法访问,但是你在执行say这个方法时因为运行类型是B,所以还是从子类中先查找该方法,如果子类没有重写该方法则执行父类的say方法,这里如果执行say方法则输出 ############,如果你想访问到子类方法,当然这里你可以直接改为B b = new B();1.类和类之间是可以有继承关系的,被继承的成为基类或者父类,继承的类称之为子类,子类可以使用父类可继承的方法,属性。
2023-11-15 23:47:01
173
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅