Java
文章平均质量分 64
随性笔记
星辰引路-Lefan
这个作者很懒,什么都没留下…
展开
-
设计模式——解释器模式
想象你正在设计一款计算器应用,用户输入的算术表达式需要被解析并计算出结果。解释器模式就像一个迷你计算器引擎,其中“数字”是终结符表达式,“加号”、“减号”等运算符是非终结符表达式。当你输入"30 + 20"时,解释器会根据预设好的规则理解这个表达式,并返回结果50。原创 2024-01-17 16:37:47 · 1043 阅读 · 0 评论 -
设计模式——中介者模式
想象一下你在一个朋友聚会上,大家想要交流却不能大声喊叫以免打扰到其他人。这时主持人(中介者)就起到了关键作用,他接收每个人的话并传递给其他人。在这个场景中,参与者(同事类)只需告诉主持人他们的信息,无需直接与其他所有人交谈,这样简化了沟通流程且降低了混乱程度。原创 2024-01-17 16:28:11 · 773 阅读 · 0 评论 -
设计模式——访问者模式
想象你正在管理一个图书馆,书架上有各种书籍和盒子(代表文件和文件夹)。当你要统计所有书籍的数量和总体积时,你可以扮演“访问者”的角色,逐个检查每本书籍和盒子。打开盒子后,再继续检查盒子里的内容。在这个过程中,你不需要修改书本或盒子本身,而是通过定义一套针对不同对象的操作规则(访问者接口),实现了灵活的功能扩展。原创 2024-01-17 16:23:14 · 730 阅读 · 0 评论 -
设计模式——状态模式
想象一下你正在经营一家网店,客户下单后,订单的状态会从“待支付”变成“已支付”,然后变成“待发货”等等。状态模式就是将这些不同的阶段分别封装成不同的状态类,在每个阶段下订单有不同的处理逻辑。例如,当订单处于“待支付”状态时,系统会尝试进行收款;而在“已支付”状态下,则开始准备商品打包发货。原创 2024-01-17 15:18:42 · 726 阅读 · 0 评论 -
设计模式——备忘录模式
设想你正在玩一款电子游戏,每当你存档的时候,游戏就会把你的角色状态(等级、装备、位置等)打包成一个“备忘录”,然后存入存档文件中。当你想要读取存档时,游戏会从存档文件中取出“备忘录”,并将角色状态恢复到存档时的样子。在这个过程中,游戏程序(发起人)通过备忘录模式保护了内部状态信息,而存档系统(管理器)仅负责保存和加载这些备忘录。原创 2024-01-17 15:10:29 · 937 阅读 · 0 评论 -
设计模式——命令模式
想象你正在使用遥控器操作电视。遥控器是调用者,开关电视的操作就是命令,而电视则是接收者。当你按下遥控器上的开关键时,实际上是向电视发送了一个“打开”的命令,电视接收到这个命令后执行打开操作。这种情况下,无论遥控器如何变化(比如换成了语音遥控器),只要遵循相同的命令接口,都能控制电视打开或关闭。原创 2024-01-17 15:02:37 · 678 阅读 · 0 评论 -
设计模式——责任链模式
想象你正在为一家公司构建一个请假申请审批系统。部门经理、人事主管和CEO都可以审批员工的请假申请。当员工提交申请时,它首先到达部门经理处,如果经理有权批准这个天数的假期则直接处理,否则把申请转交给人事主管,以此类推。在这个例子中,部门经理、人事主管和CEO就形成了一个“责任链”,每个环节都是一个处理者,他们按照一定的顺序处理请求,直到找到合适的审批者为止。原创 2024-01-17 14:48:50 · 770 阅读 · 0 评论 -
设计模式——迭代器模式
想象你有一个装满了书的书架,但书架有各种各样的形状和大小。迭代器就像是一个能够帮你找到书架上每本书的图书管理员,不论书架结构如何复杂。每次当你说“下一本”时,图书管理员都能准确地拿出一本书给你,而你并不需要知道书架内部是怎么存放书籍的。原创 2024-01-17 14:21:04 · 693 阅读 · 0 评论 -
设计模式——观察者模式
想象你是一个新闻机构,有很多家报纸订阅你的新闻。每次有新的新闻时,你需要逐一打电话给每一家报纸告诉他们最新消息。在程序世界里,新闻机构就是“主题”,而各家报纸是“观察者”。当新闻机构有新消息时,只需调用notifyObservers()方法,就像打一圈电话一样,所有订阅的报纸(观察者)就会自动得到通知并更新自己的内容。原创 2024-01-16 13:59:32 · 758 阅读 · 0 评论 -
设计模式——模板方法模式
想象你正在教孩子做一道菜,这个过程中包含了切菜、炒菜和上菜三个步骤。作为家长,你会告诉孩子整个做菜的大致流程(模板方法),但是让孩子自己决定如何切菜和炒菜(抽象方法)。这样,每次做不同的菜时,只要按照你设定的基本流程走,但具体怎么切怎么炒可以根据不同菜品自由发挥。原创 2024-01-16 13:47:54 · 716 阅读 · 0 评论 -
设计模式——策略模式
设想你经营一家餐厅,顾客可以选择不同的支付方式进行结账,比如现金、刷卡或手机支付。每种支付方式就是一个策略,当顾客选择某种支付方式时,服务员就执行相应的“策略”,即进行相应的支付处理。策略模式在这里的作用就是让服务员(上下文)可以根据客户要求灵活地调用不同支付方式(策略)的结账流程,而无需知道每种支付方式的具体实现细节。原创 2024-01-13 17:23:44 · 724 阅读 · 0 评论 -
设计模式——代理模式
想象你正在经营一家咖啡店,顾客通常会直接向服务员点单。这时,服务员就是咖啡师的代理,他们接收顾客的订单并将之传递给咖啡师制作。同时,服务员还可以在这个过程中做额外的事情,比如记录订单信息、确认库存等。这就是代理模式的一个简化示例:服务员就像是咖啡师的代理,负责管控对咖啡师服务的访问,并在必要时扩展附加功能。原创 2024-01-13 17:18:23 · 892 阅读 · 0 评论 -
设计模式——享元模式
想象你正在运营一家制作个性化T恤衫的公司,每种颜色的T恤都是单独的一件衣服。为了节约成本,你会把每种颜色的T恤看作是共享资源,即每个颜色只准备一件基础T恤。当客户订购某种颜色的T恤时,只要仓库中有对应颜色的基础T恤,就直接使用这件基础T恤进行个性化的打印,而不是每次都生产一件全新的T恤。这就是享元模式的思想,在这里,颜色就是内部状态,而T恤上的文字或图案则是外部状态。原创 2024-01-13 17:14:05 · 850 阅读 · 0 评论 -
设计模式——外观模式
想象你正在运营一家高级餐厅,客人并不需要知道制作一道菜背后的复杂流程(购买食材、洗切烹饪、装饰摆盘等)。他们只需向服务员点餐,服务员就是“外观”,他将协调厨房里的各个岗位,确保菜品顺利送达客人面前。在这个过程中,客户只与服务员互动,而不需要了解厨房内部的工作细节。原创 2024-01-13 17:06:47 · 562 阅读 · 0 评论 -
设计模式——装饰器模式
想象一下你在一个咖啡店点了一杯简单的咖啡,然后又决定加糖。在现实生活中,这就像在原有的咖啡上附加了一个“加糖”的行为。在程序设计中,装饰器模式就是模拟这个过程:先创建一杯基础咖啡,然后用一个“加糖装饰器”去包裹它,使得最终得到的是带有附加功能(即加了糖)的新咖啡对象,但客户并不需要知道装饰过程,只需要按照统一的咖啡接口来操作即可。原创 2024-01-13 16:54:11 · 654 阅读 · 0 评论 -
设计模式——组合模式
想象一下你正在管理一家公司,这家公司由员工组成,有些员工直接向你报告(叶子节点),有些员工是团队领导,他们手下还有其他员工(容器节点)。组合模式允许你对每位员工或整个团队下达命令时使用相同的方式,无论是单独与某位员工交谈,还是召开团队会议进行沟通。原创 2024-01-13 16:48:50 · 852 阅读 · 0 评论 -
设计模式——桥接模式
想象你正在设计一款画图软件,该软件支持不同类型的图形(如圆形、矩形等)和不同的渲染引擎(如简单的线条渲染、3D渲染等)。如果直接把渲染方式硬编码到图形类里,那么每次增加新的渲染方式就得修改所有图形类;反之,若将渲染方式作为可替换的组件,就可以灵活地选择不同的渲染方式绘制任何图形,这就像是给每个图形配备了一座“桥”,这座“桥”可以根据需求连接不同的渲染引擎。原创 2024-01-13 16:42:37 · 935 阅读 · 0 评论 -
设计模式——适配器模式
想象你有一个老式的Walkman播放器,但是你想用它来连接到你的新式蓝牙音箱上听音乐。适配器就像是一个转换插头,它的一端可以插入Walkman的耳机插孔,另一端则符合蓝牙音箱的充电口标准。这样,尽管两者接口不同,但通过适配器就能让他们互相配合工作了。原创 2024-01-13 16:36:43 · 794 阅读 · 0 评论 -
设计模式——原型模式
想象一下你在制作粘土玩具,每次做新的玩具都要从一团基础的粘土开始,揉捏、塑形很费时间。原型模式就像是你可以先做好一个模型玩具,然后只需要将这个模型压成新的粘土块,就得到一个一模一样的初始形态的玩具,再稍加修改就能快速做出很多类似但不完全一样的玩具。在原型模式中,核心概念是一个接口或抽象类,它声明了克隆自己的方法(通常称为clone())。具体实现这个接口或继承该抽象类的类会提供一个实现克隆自身的操作。通过调用此方法,就可以快速复制出一个与原对象具有相同状态的新对象。原创 2024-01-13 13:53:42 · 599 阅读 · 0 评论 -
设计模式——建造者模式
想象你正在经营一家电脑装配店,客户可以选择定制自己的台式机。抽象建造者就像是一个装配说明书,列出了装机的所有步骤;具体建造者则按照说明书中每一步骤去实际安装主板、CPU和内存等配件;而导演者则是根据客户的订单要求,指挥建造者按正确的顺序进行装配。最后得到的就是一台完全符合客户需求的定制化台式电脑。原创 2024-01-13 13:45:30 · 601 阅读 · 0 评论 -
设计模式——单例模式
然而,在现代Java编程中,由于并发容器和依赖注入框架的普及,直接使用单例可能会带来测试困难、扩展性问题以及违反面向接口编程的原则,因此在某些情况下,它被视为一种反模式。为了防止多个实例被创建,通常会将构造函数设为私有(private),从而阻止其他对象通过new关键字直接实例化该类。这样一来,无论多少人来申请,接待员每次都会给他们同一张卡,确保了俱乐部内部不会有多余的入口出现。在这个例子中,只有当singleton为null且同时有多个线程尝试实例化时,才会进行同步操作,避免了不必要的同步开销。原创 2024-01-13 08:55:56 · 668 阅读 · 0 评论 -
设计模式——工厂模式
【代码】设计模式——工厂模式。原创 2024-01-13 08:46:21 · 490 阅读 · 0 评论 -
Java学习笔记(十一)——JUC并发编程(超详细)
线程和进程进程:一个程序的集合,一个进程至少包含一个进程;Java默认有两个进程,main、GC线程:一个进程某个功能由线程负责对于Java而言Thread、Runnable、Callable真的可以开启线程吗?开不了,通过本地方法native()调用并发和并行并发编程:并发、并行,本质是充分利用CPU的资源并发:多线程操作同一个资源并行:多个线程同时执行;线程池线程有几个状态?public enum State { //新生 NEW,原创 2021-10-18 23:46:47 · 269 阅读 · 0 评论 -
Java学习笔记(七)——IO流
IO流基本方法示例一import java.io.FileWriter;import java.io.IOException;public class test { public static void main(String[] args)throws IOException { //创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件 //而且该文件会被创建到指定目录下,如果该目录下已有同名文件,将被覆盖 FileW原创 2021-04-11 20:57:28 · 274 阅读 · 0 评论 -
Java学习笔记(六)——集合
基本方法import java.util.ArrayList;class note{ public static void main(String[] args) { //创建一个集合容器 ArrayList al=new ArrayList(); //1.添加元素 al.add("java1"); al.add("java2"); al.add("java3"); al.add(原创 2021-02-04 23:22:56 · 228 阅读 · 0 评论 -
Java学习预科(三)——字符串
返回目标字串出现的次数class note{ public static int get(String str,String key){ int count=0; int index=0; while((index=str.indexOf(key))!=-1){ str=str.substring(index+key.length()); count++; } retur原创 2021-01-15 13:37:46 · 164 阅读 · 2 评论 -
Java学习路线
阶段一(夯实基础)Java基础语法学习目标:1.熟悉Java等基本概念2.掌握Eclipse/IDEA集成开发工具的安装、配置和应用3.熟悉Java基本语法、基本类型、运算符和表达式4.掌握分支、循环逻辑语句、数组等知识的应用Java面向对象编程学习目标:1.理解面向对象思想和概念2.学会面向对象分析方法3.掌握类、对象、继承、多态的使用4.熟悉重写、重载、抽象类、内部类以及设计模式的应用Java核心类库学习目标:1.掌握Java核心类库的应用,例如字符串、日期、集合原创 2021-01-07 15:27:00 · 183 阅读 · 0 评论 -
Java学习笔记(九)——多线程常用方法
如何停止线程?只有一种,run方法结束。开启多线程运行,运行代码通常是循环结构,只要控制住循环,就可以让run方法结束,也就是线程结束。特殊情况:当线程处于了冻结状态,就不会读取到标记,那么线程就不会结束。当没有指定的方式让冻结的线程恢复到运行状态时,这是需要对冻结进行清除,强制让线程恢复到运行状态中来,这样就可以操作标记让线程结束。Thread类中提供了该类方法interrupt()class StopThread implements Runnable{ private原创 2020-12-23 23:51:08 · 156 阅读 · 0 评论 -
Java学习笔记(十)——线程间通信
线程间通信线程间通讯:其实就是多个线程在操作同一个资源,但是操作的动作不同。wait(),notify(),notifyAll(),用来操作线程为什么定义在了Object类中?①这些方法存在于同步中(因为要对持有监视器(锁)的线程操作)②使用这些方法必须要标识所属的同步的锁③锁可以是任意对象,所以任意对象调用的方法一定定义Object类中。wait(),sleep()有什么区别?wait()释放资源,释放锁sleep()释放资源,不释放锁class Res{ private S原创 2020-12-23 23:14:21 · 217 阅读 · 3 评论 -
Java学习笔记(八)——多线程
创建线程的第一种方式:继承Thread类步骤:①定义类继承Thread②复写Thread类中的run方法,目的:将自定义代码存储在run方法中,让线程运行③调用线程的start方法,该方法两个作用:启动线程,调用run方法Thread为什么要覆盖run方法呢?Thread类用于描述线程,该类就定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法,也就是说Thread类中的run方法,用于存储线程要运行的代码。代码示例class Test_thread extends原创 2020-12-22 16:35:26 · 1309 阅读 · 5 评论 -
Java学习预科(一)——权限问题
权限问题:publicprotecteddefaultprivate同一个类中√√√√同一个包中√√√×子类√√××不同包中√×××原创 2020-12-20 22:45:34 · 115 阅读 · 0 评论 -
Java学习笔记(五)——异常
throws和throw的区别:throws使用在函数上;用于抛出异常类,可以跟多个,用逗号隔开。throw使用在函数内;用于抛出异常对象。当函数内容有throw抛出异常对象,并未进行try处理,必须要在函数上声明,否则编译失败。(RuntimeException除外,函数内如果抛出RuntimeException异常,函数上可以不用声明)异常有两种:编译时被检测异常:该异常在编译时,如果没有处理(没有抛也没有try),编译失败;该异常被标识,代表着可以被处理。运行时检测(编译时不检测)原创 2020-12-20 22:27:52 · 150 阅读 · 1 评论 -
Java学习笔记(二)——多态
多态:多态的体现:父类的引用指向了自己的子类对象。父类的引用也可以指向接收自己的子类对象。在多态中成员函数的特点:在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有编译通过,如果没有编译失败;在运行时期:参阅对象所属的类中是否有调用方法。补充:instanceof方法用于判断所属类型代码示例 1abstract class Animal{ public abstract void eat();}class Cat extends Animal{原创 2020-12-20 22:24:40 · 273 阅读 · 2 评论 -
Java学习笔记(三)——抽象类
代码示例 1/*需求:获取一段程序运行的时间。原理:获取程序开始和结束的时间并相减即可。获取时间:System.currentTimeMillis();模板方法:在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去,由该子类去完成。*/abstract class GetTime{ public final void getTime(){ long start=System.currentTi原创 2020-12-20 22:18:27 · 189 阅读 · 0 评论 -
Java学习笔记(四)——匿名类
匿名对象使用方式:当对对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化。如果对一个对象进行多个成员调用,必须给这个对象起个名字。可以将匿名对象作为实际参数进行传递。代码示例interface Inter{ void method();}class Test_anonymous{ static Inter function(){ return new Inter(){ //匿名对象类 public void meth原创 2020-12-20 22:00:12 · 172 阅读 · 0 评论 -
Java学习预科(二)——this,super,static应用
this的应用:当定义类中的功能时,该函数内部都要用到调用该函数的对象时,这时用this来表示这个对象;但凡本类功能内部使用了本类对象,都用this表示。static的应用:每一个应用程序中都有共性的功能,可以将这些功能进行抽取,独立封装,以便复用。特点:随着类的加载而加载:静态会随着类的消失而消失,生命周期最长;优先于对象存在:静态先存在,对象后存在;被所有对象所共享;可以直接被类名所调用(类名.静态成员)。使用注意事项:静态方法只能访问静态成员,非静态方法既可以访问原创 2020-12-20 21:46:45 · 203 阅读 · 0 评论 -
Java学习笔记(一)——构造函数
什么时候定义构造函数:当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中。构造代码块:作用:给对象进行初始化。对象一建立就运行,而且优先于构造函数执行。和构造函数的区别:构造代码块是给所有对象进行统一初始化;而构造函数是给对应的对象初始化。构造代码块中定义的是不同对象共性的初始化内容。class Car { String color="red"; int num=4; void run(){ System.out.print(co原创 2020-12-20 21:29:36 · 138 阅读 · 0 评论