java基础
文章平均质量分 62
Fairy要carry
欲戴其冠,必承其重
展开
-
责任链模式
【代码】责任链模式。原创 2024-03-18 22:41:13 · 611 阅读 · 0 评论 -
SPI机制
关系图:原创 2023-02-07 18:11:13 · 69 阅读 · 0 评论 -
面试:使用泛型的意义
适用于多种数据类型执行相同的代码(代码复用)原创 2023-02-07 15:49:44 · 70 阅读 · 0 评论 -
单例模式深入
前言:今天公司让我搭建设计模式的课程,结果在单例模式被教训了一波,发现有很多都没有深入1.单例类:2.反射破坏单例模式:本质利用类的构造方法得到类的实例结果:发现是不同的实例——>原因:反射获得单例类的构造函数,使得单例类失效3.如何预防?因为我们反射它是调用了零次构造函数所以我们只需要防止连续被调用两次构造函数即可,需要进行次数统计(多线程下需要保证次数count不安全的情况)在构造函数里面进行上锁判断count如果>0说明前面有人来过,抛出异常即可,否则count++;结果抛出异常1.单原创 2022-12-05 21:45:58 · 351 阅读 · 0 评论 -
并发修改冲突
增加一个功能,如果更新失败,线程进行重试操作,定义一个while循环,成功跳出,否则重试。在Mybatis-plus配置类种添加乐观锁插件。根据version去进行cas是否能够修改数据。原创 2022-11-20 00:58:31 · 366 阅读 · 0 评论 -
Java深拷贝和浅拷贝
虽然student1.clone得到的student2对象与自己是不一样的,但是主对象一样,修改teacher属性都会发生改变。被复制对象的所有变量都含有与原来对象相同的值,所以说对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。两个引用指向的都是不同对象,并且所引用的teacher也是隔离的——>深拷贝相比于浅拷贝速度较慢并且花销较大。深拷贝是一个整个独立的对象拷贝,会拷贝所有的属性。转载 2022-10-30 02:24:35 · 92 阅读 · 0 评论 -
装饰者模式
解决扩展性不好,解决继承不符合开闭原则的问题,比如我们定义了两个类——>米饭+面条,然后定义一个火腿那么就会产生更多的子类。装饰者模式比继承更具良好的扩展性,完美的遵循开闭原则,继承是静态的附加责任,装饰者则是动态的附加责任。我们这个装饰者模式强调的是一种功能上的扩展(在不改变原有对象结构的情况下)原创 2022-10-14 23:55:12 · 69 阅读 · 0 评论 -
外观模式(设计模式)
简而言之 就是隐藏了具体的流程,提供一个更高层次的接口给到客户端去调用,就不需要去在意具体的业务交叉逻辑,比如去银行开证明。原创 2022-10-12 18:36:54 · 69 阅读 · 0 评论 -
组合模式+桥接模式
将。原创 2022-10-12 18:13:20 · 683 阅读 · 1 评论 -
模板方法模式+享元模式
一般我们享元模式是结合工厂模式来的,通过一个工厂类返回享元对象,然后还结合了单例模式,相同的对象直接返回,提高了对象实例的复用性抽象享元角色。原创 2022-10-12 16:30:58 · 139 阅读 · 0 评论 -
责任链模式
客户端只需要关注自己的请求,不需要关注请求是给到谁处理的,而处理类也不知道自己处理的是谁。3.设置链表中每个处理链级的关系,客户端发送请求。2.处理类的实现类leader和Boss。1.处理请求的Handler基类。原创 2022-10-12 11:38:05 · 121 阅读 · 0 评论 -
状态模式+策略模式
看看状态模式和策略模式的区别:状态模式的图:它侧重的是状态带来的影响,比如1代表心情不好要打游戏,2是要吃饭——>状态改变,所做的行为改变(可以client改变也可以自己改变)策略模式图:侧重的是某个行为具体的事,比如游戏怎么打,陪人打还是怎么打,侧重的是行为的具体(完全是client改变,比如学生来了刷学生卡,老人来了刷老人卡)场景:1.比如我们的ThreadPoolExecutor线程池中实现了拒绝策略,用的就是策略模式,在客户端指定(也就是我们构造器中指定,然后有默认的拒绝策略)2.原创 2022-10-12 02:46:55 · 211 阅读 · 0 评论 -
工厂模式(简单工厂模式+工厂方法模式+抽象工厂模式)
在工厂方法模式中,我们使用一个工厂创建一个产品,一个具体工厂对应一个具体产品,但有时候我们需要一个工厂能够提供多个产品对象,而不是单一的对象,这个时候我们就需要使用抽象工厂模式。,每次添加新产品就需要修改工厂类。在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展维护,并且工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。提供专门的工厂类用于创建对象,实现了对象创建和使用的职责分离,客户端不需知道所创建的具体产品类的类名以及创建过程,只需知道具体产品类所对应的参数即可。原创 2022-10-11 18:05:24 · 536 阅读 · 0 评论 -
HashTable和HashMap的区别
由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。而如果没有正确的同步的话,多个线程是不能共享HashMap的。3.添加k-v时算法不一致:HashMap添加元素时,是使用自定义的哈希算法,而HashTable是直接采用key的hashCode()——>当已用容量>总容量 * 负载因子时,HashMap 扩容规则为当前容量翻倍,Hashtable 扩容规则为当前容量翻倍 +1。,Hashtable 初始容量为:11,两者的负载因子默认都是:0.75。.原创 2022-08-17 21:40:45 · 347 阅读 · 0 评论 -
KeySet和EntrySet区别
与get(Object key)相比,get(Object key)只能返回到指定键所映射的值,不能一次全部取出。而keySet()和entrySet()可以。keySet()和entrySet(),是Map集合中的两种取值方法。返回值类型 Set将map集合转成set集合,再通过迭代器取出。返回此映射中包含的键的 Set 视图。返回此映射中包含的键的 Set 视图。使用keySet取键并且打印。Map集合中没有迭代器,返回值类型 Set...转载 2022-08-15 16:52:49 · 2696 阅读 · 0 评论 -
Java基础面试题
equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。...原创 2022-08-15 16:12:58 · 179 阅读 · 0 评论 -
为什么NIO比BIO效率高
目录BIO实例为什么BIO效率会低些主要对比: 服务端 客户端线程池类任务类1.socketServer的accept()接收客户端的方法是阻塞的,如果连接通道没有数据传输,就白给了另外,一个线程调用read() 或write()时,该线程被阻塞,直到有数据被读取或者数据写入。该线程在阻塞期间不能做其他事情2.服务端监听取得socket后,将这个socket分给一个线程去处理。此时socket需要等待有效的请求数据到来后,才可以真正开始处理请求。3.socket交给线程后,这时原创 2022-08-06 23:39:28 · 364 阅读 · 0 评论 -
NIO学习
一样的思路,遍历所有消息,判断消息是否可读,然后通过消息得到对应的channel,因为在服务端中就已经将消息转发给客户端channel了,所以在这里我们直接channel.read(buffer),将消息输出到buffer中,然后打印buffer缓冲区的信息。判断事件是否是可接收的,如果是,说明客户端有channel链接了selector(我们这里通过服务端的channel的accept方法监听得到客户端的channel,并设置客户端channel的配置,然后将其注册给selector)...原创 2022-08-06 22:40:43 · 399 阅读 · 0 评论 -
字符流与字节流的区别
某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。,但是如果程序没有关闭,则缓冲区中的内容是无法输出的,所以得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。,所以在开发中,字节流使用较为广泛;1.Java的字节流。.转载 2022-08-03 23:00:18 · 113 阅读 · 0 评论 -
Stream流的使用
好原创 2022-06-23 14:14:56 · 820 阅读 · 0 评论 -
面试-多态
1.对于多态的理解直接上场景:我们写项目控制层,一般注入不是直接上业务接口吗,然后通过业务接口调用它的实现类方法;简单俩说,体现的就是一种接口多种实现2.多态与继承多态是建立在继承的基础上的,指的是不同的子类在继承父类后分别重写父类的方法,在继承中体现不同的形式;条件:1.是在创建子类的时候必须使用父类new子类的方式,一句话,允许将子类类型的指针赋值给父类类型的指针2.上面说的比较清楚了(继承)3.向上转型3.多态作用1.每个派生类的功能不需要再自己去弄,直接对抽象基类进行处理就行,抽象类+方法,派原创 2022-06-17 20:39:43 · 178 阅读 · 0 评论 -
从Http思考项目中的cookie和session+ServletContext
为什么我们要用cookie和session?首先,先说说Http,首先我们都知道的http是无状态的,什么是无状态?,就指协议对事务处理没有记忆能力,缺少状态意味着->如果后续处理需要前面的信息,需要重传,那么我每次连接传输的数据量就会很大,1,1+1,1+2,1+3...这不巨难受;它不像我们的Socket那样,连接了两个终端,夹个通道随便相互发信息通信,http的客户端只能通过请求服务器获取相关文件内容以及信息;那么问题来了,我们做一个网站,怎么在其他页面中也保存用户信息呢?,毕竟我登录之后要执行业务操原创 2022-06-13 19:50:32 · 367 阅读 · 0 评论 -
GET、POST与@RequestBody与@RequestParam
目录@RequestBody@RequestParamget、post请求@PathVariable@RequestBody注解@RequestBody接收的参数是来自请求体中的,一般用于处理非Content-Type:application/x-www-form-urlencoded编码格式的数据,一般用于处理:application/json、application/xml等类型数据像我们做的项目,如果说是application/json类型的数据,我们是用@..原创 2022-05-26 14:46:04 · 3261 阅读 · 0 评论 -
Java+JSON序列化
Java序列化 :(11条消息) java序列化详解_文盲青年的博客-CSDN博客_java序列化JSON序列化方案:(11条消息) JSON序列化方案知识概括_GeorgeLin98的博客-CSDN博客_json序列化方式转载 2022-05-15 14:20:14 · 429 阅读 · 0 评论 -
HashMap
目录特点:引伸:特点:1.哈希映射,以key-value储存数据保存在数组中;2.位置:通过元素的key计算它的哈希值,如果是int类型就是2^32内,然后通过hashcode&(数组容量-1)——>得到的余数就是位置,hashcode相同放的就是一个2.出现问题:因为hashcode是可能一样的,那么我们怎么储存元素呢?可以通过链表的方式储存元素,同一个位置我们可以用链表来放元素;3.缺点:无序4.可以有null值:(并且分配了哈希值.原创 2022-04-21 09:48:38 · 194 阅读 · 0 评论 -
手写线程池
package com.example.juc.ThreadPool;import lombok.extern.slf4j.Slf4j;import java.util.ArrayDeque;import java.util.Deque;import java.util.HashSet;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Condition;import java.util.conc.原创 2022-04-20 17:41:23 · 270 阅读 · 0 评论 -
保护性拷贝+亨元模式
不可变对象线程安全可变的一个线程安全使用:package com.example.juc.Automic.Date;import lombok.extern.slf4j.Slf4j;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.concurrent.locks.ReentrantLock;/** * @author diao 2022/4/19 */...原创 2022-04-19 19:54:43 · 337 阅读 · 0 评论 -
final
理解final首先,我们知道的是,final修饰的变量都是不能改变的,也就是说其他线程都修改不了;特点:1、不可继承,不可重写;2、final修饰而局部参数,都是需要初始化的;作用:它会在赋值之后加上一个写屏障——>1.有序性:保障写屏障之前的操作不会重排序到写屏障之后;2.读可见:写屏障之前的所有修改、赋值操作都会同步到主存中;体现出了只读不能改;举个例子:如果没有final,默认是0,那么其他线程就会读取到a为0的情况,但是你加上final,就不会出现,没有...原创 2022-04-19 19:22:11 · 97 阅读 · 0 评论 -
刷题04(牛客)
目录请求头HttpResponseMVC模式注意事项抽象类和接口之间的错误instanceOf方法请求头HttpResponse设置响应头给客户端(HttpServletResponse接口中的几个方法)会发现:答案就只有ab——>response.setHeader(String s,String value);reponse.addHeader(..,..);区别:getHeaders():返回同名的header,一个数组;addHe..原创 2022-04-07 17:31:30 · 360 阅读 · 0 评论 -
刷题2(牛客)
目录关于抽象类和接口类加载关于抽象类和接口C:接口没有构造方法,所以不能实例化;——>子类可以抽象类虽然有构造方法,但是是用来初始化的,所以也不能实例化;——>所以有构造方法的类也不一定能够实例化;AD:Java只支持单继承,但是接口是可以多实现的;补充:构造方法在一个类中是可以多声明的;类加载...原创 2022-04-06 22:57:14 · 418 阅读 · 0 评论 -
刷题01(牛客)
目录==和equals,hashcode常见错误序列化线程抢占资源abstract和finalJava类加载器引导类加载器(bootstrap class loader):扩展类加载器(extensions class loader):系统类加载器(system class loader):反射==和equals,hashcode常见错误equal:不能用于基本数据类型的比较(因为这是一个继承与Object的方法);用于进行对象的比较,二者..原创 2022-04-05 21:42:38 · 493 阅读 · 0 评论 -
JUC-01
目录线程与进程的区别:并发:并行:运行效率异步调用:单核多核处理多线程单线程性能例子:线程与进程的区别:进程:用来加载指令(操作)至CPU中,读取数据进内存的;相当于是管理数据与指令,IO的;当一个程序被执行时,进程就会被开启,指令被加载到CPU读取操作(后面会给指令分配时间片),将磁盘中的数据加载到内存中;线程:具体是执行指令的,一个线程就是一个指令流,你可以理解为进程是储存线程的,一个进程里面可以有多个线程,进程会给线程分配资源,以此给...原创 2022-03-31 16:08:34 · 179 阅读 · 0 评论 -
动态代理回顾
首先回顾一下代理简而言之,就是隐藏自己的身份干自己想干的事对于正向代理比如说你去访问美国的网站,但是靠你个人是访问不到的(因为不支持国内用户)。所以你得利用中介(也就是代理服务器),对于美国网站来说,他不知道是你还是代理服务器访问的,所以就ok;了;好处:隐藏了客户端的IP,保证了用户的安全对于反向代理:比如说,你是农村种水果的,你要卖水果,但是你在农村不好卖出去,所以你需要通过中介,来进行出售,对于买水果的我们来说,我们是不知道这个水果的来源的,这就是反向代理;好处:保原创 2022-03-28 10:22:46 · 231 阅读 · 0 评论 -
里氏替换原则
简而言之:子类可以扩展父类的功能,但是不能改变父类原有的功能,也就是说:子类extends父类时,除了添加新的方法完成功能,尽量不要重写父类方法; Bird bird1 = new Swallow();任何基类出现的地方,子类一定可以出现;引用:在之前的项目中,业务实现类调用接口的方法,而这个接口就相当于基类,它的实现类是被mybatis根据接口的类名以及方法名动态代理生成,并加载到容器中,那么我们调用接口的方法,其实就是调用的接口实现类的方法;也就是说,基类T1对象o1,子类类型原创 2022-03-26 16:05:37 · 570 阅读 · 0 评论 -
hasNext()与next()
问题起源:package 大数详解;import java.util.Scanner;/** * @author diao 2022/3/6 */public class test { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int i=1; while(sc.hasNext()){ Syste原创 2022-03-06 23:56:56 · 1811 阅读 · 0 评论 -
JVM-02阶段学习
目录堆内存诊断:利用jstack分析线程状况:字符串拼接新的感悟:StringTable:直接内存:直接内存释放原理:JVM垃圾回收:如何判断对象可以回收:1.引用计数法:2.可达分析:五种引用:强引用:软引用:弱引用:虚引用:终结器引用:垃圾回收算法:标记清除:标记整理:复制:JVM分代回收机制:回收流程:GC分析:相关JVM参数垃圾回收器大致分类:相关概念:堆内存诊断:1...原创 2022-02-16 23:31:18 · 805 阅读 · 2 评论 -
IO流回顾
BufferedReader与BufferWriter:介绍:有利于提高字符流的读写效率,引入了缓冲机制;BufferedReader与BufferedWriter各拥有8192个字符缓冲区:—>当BufferedReader读取外部资源时,会将资源先放满缓冲区,之后若调用read(),也是先从缓冲区开始读取的;而BufferedWriter,当我们使用它引入资源或是说写入文件时,写入的数据也并不会先输送到目的地,而是现在缓冲区中;例子:一个数组一个数组的读取:package原创 2022-02-14 18:09:50 · 142 阅读 · 0 评论