- 博客(147)
- 收藏
- 关注
原创 2024最全 Java 面试八股文
这套互联网 Java 工程师面试题包括了:MyBatis、ZK、Dubbo、EL、Redis、MySQL、并发编程、Java 面试、Spring、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题(共 485 页,32W 字)2024 年的互联网行业竞争越来越严峻,面试也是越来越难,一直以来我都想整理一套完美的面试宝典,奈何难抽出时间,这套 1000+道的 Java 面试手册我整理了整整 1 个月,上传到 Git 上目前 star 数达到了 30K+
2024-03-21 18:09:12 917
原创 LinkedHashMap源码解析和设计思路
HashMap 是无序的,TreeMap 可以按照 key 进行排序,LinkedHashMap 本身是继承 HashMap 的,所以它拥有 HashMap 的所有特性。另外还提供二个特性HashMapMapHashMapEntryEntrybeforeafterheadtailHashMap。
2024-03-21 10:57:42 949
原创 TreeMap源码解析和设计思路
数据结构TreeMap底层使用红黑树(Red-Black Tree),和 HashMap 的红黑树结构一样。红黑树是一种自平衡的二叉查找树。每个节点(Entry)存储键值对数据,并通过左右子节点指针维护树的结构。排序规则TreeMap支持两种排序方式:自然排序(Natural Order)和自定义排序(Custom Order)。自然排序要求键对象实现Comparable接口,并根据对象的compareTo方法进行比较。自定义排序通过在构造时传入Comparator对象来指定排序规则。
2024-03-20 16:18:44 949
原创 HashMap源码解析和设计思路
HashMap是Java集合框架中一种重要的数据结构,它按照Key-Value键值对的形式存储数据,即每一个值(Value)都由一个唯一的键(Key)与之对应。HashMap的工作原理是使用"拉链法"来解决哈希冲突的问题。整个HashMap由以下几个主要部分组成,底层的数据结构主要是:数组 + 链表 + 红黑树。
2024-03-19 10:28:09 801
原创 TreeSet源码解析和设计思路
无论是HashSet还是TreeSet,它们都不允许集合中存在重复的元素,确保了集合中的元素唯一性。HashSet和TreeSet都不是线程安全的,如果在多线程环境下使用,需要额外考虑线程安全性。
2024-03-18 10:45:01 896
原创 HashSet源码解析和设计思路
组合还是继承的把握在设计类时,需要仔细分析和把握何时使用组合(has-a)关系,何时使用继承(is-a)关系。通过HashSet类的实现,我们可以学习如何在不同情况下选择正确的关系来实现代码复用和灵活性。对复杂逻辑进行包装在设计接口时,要尽量简化接口,使其易于使用。这可以通过对复杂逻辑进行包装,提供简单易用的接口来实现。这种做法能够提高代码的可维护性和易用性。对组合的 API 多些了解当使用其他 API 时,对其组合使用方法有所了解。
2024-03-18 09:38:34 954
原创 爬虫的基本原理介绍,实现以及问题解决
爬虫是一种自动化程序,用于从互联网上收集信息。其基本原理是模拟人类用户在网页上的浏览行为,通过发送HTTP请求获取网页内容,然后解析和提取所需的信息。上述代码使用了Python中的requests库发送HTTP请求,并使用BeautifulSoup库解析HTML页面内容。当编写爬虫程序时,首先需要安装Python并了解一些基础知识。实际的爬虫程序可能需要处理更多复杂的情况,比如处理动态网页、登录状态、异常处理等。则会将HTML内容转换为BeautifulSoup对象,方便提取信息。
2024-03-17 18:56:51 1288
原创 LinkedList源码解析和设计思路
LinkedList采用双向链表的数据结构来存储元素,每个节点包含指向前一个节点和后一个节点的引用。它提供了add、remove、get等操作方法,以及支持队列和栈的操作方法。LinkedList还实现了ListIterator接口,可以进行双向迭代操作。用法:LinkedList 是一个双向链表实现的 List,支持在任意位置进行元素的插入和删除操作。可以作为队列(Queue)或双端队列(Deque)使用。使用场景:适合对列表进行频繁的插入和删除操作,因为插入和删除节点的开销较小。
2024-03-17 18:42:26 1086
原创 ArrayList 源码解析和设计思路
它会根据旧的容量大小计算出新的容量大小,并根据需要调整为满足最小容量要求的合适大小。然后将原来的元素复制到新的更大的数组中,完成数组的扩容操作。: 原来的容量大小计算出新的容量大小。这个方法会比较当前数组的容量和需要的最小容量,如果当前容量不足,则会扩大内部数组的容量以满足需求。方法会根据需要的最小容量来确定新的容量大小,并将原来的元素复制到新的更大的数组中。,接着移动需要向前移动的元素,将列表中最后一个元素置空,并返回被删除的元素的值。的容量,它会创建一个新的更大的数组,并将原来的元素复制到新数组中。
2024-03-16 21:52:22 1446
原创 MyBatis中经典的五种设计模式源码剖析,打死都不要忘记!
MyBatis 3.5版本中也广泛使用了多种设计模式,下面是其中一些主要使用的设计模式。
2024-03-15 17:18:59 1487
原创 Java访问者模式源码剖析及使用场景
Java 中的访问者(Visitor)模式是一种行为型设计模式,它将数据结构与数据操作分离,使得在不修改数据结构的情况下可以增加新的操作。抽象访问者(Visitor): 定义了一个访问具体元素的接口,为每个具体元素类声明一个访问操作。具体访问者(ConcreteVisitor): 实现了抽象访问者角色所声明的接口,定义了相应的访问操作。抽象元素(Element): 声明一个接受访问操作的接口,这个接口的入口参数是抽象访问者角色。具体元素(ConcreteElement)
2024-03-13 10:44:52 1204
原创 Java责任链模式源码剖析及使用场景
责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理该请求。在这个模式中,每个处理者都包含对下一个处理者的引用,当收到请求时,它可以选择自行处理请求或者将请求传递给下一个处理者。Java 中的责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过给多个对象处理请求的机会,从而避免了请求的发送者与接收者之间的耦合关系。该模式将接收对象的对象连接成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
2024-03-12 16:36:18 1170
原创 Java策略模式源码剖析及使用场景
策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户端。策略模式的主要角色有Context(上下文): 负责维护一个具体的策略类实例,并根据它来协调算法的执行。Strategy(抽象策略): 定义了一个算法族,声明了一个算法的操作,它有一个或多个具体的策略类实现。ConcreteStrategy(具体策略): 具体实现了 Strategy 接口定义的算法。策略模式的优点算法可以在运行时进行切换,避免了使用复杂的条件语句。
2024-03-12 11:42:40 1320
原创 Java状态模式源码剖析及使用场景
状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。状态模式的核心思想是将对象的状态封装成独立的类,使得对象可以根据自身的状态来获取不同的行为。当对象的内部状态发生改变时,其行为也会随之改变。Context(上下文): 定义客户感兴趣的接口,并维护一个具体状态类的实例。State(状态): 这是一个抽象状态类,它定义了一个与Context的一个或多个行为相关的接口。ConcreteState(具体状态)
2024-03-11 17:29:36 1283
原创 Java解释器模式源码剖析及使用场景
解释器模式(Interpreter Pattern)是一种行为型设计模式,它为语言元素定义了一种表示方式,并定义了一种解释器用于解释这些元素的方式。解释器模式的主要作用是构建一个解释器,用于解释特定的语言或语法。这种语言可以是编程语言、脚本语言或者是任何其他特定领域的语言。抽象表达式(AbstractExpression): 声明一个抽象的解释操作,这是所有终结符表达式和非终结符表达式所共有的接口。终结符表达式(TerminalExpression): 实现与文法中的终结符相关的解释操作。
2024-03-11 16:36:40 1152
原创 Java备忘录模式剖析及使用场景
备忘录模式是一种行为设计模式,它允许在不破坏对象封装性的前提下,捕获并外部化一个对象的内部状态,以便日后可以恢复该对象到之前保存的状态。假设你在玩一个电子游戏,游戏中有一个保存进度的功能。当你保存游戏时,实际上是将游戏的当前状态(比如关卡、分数、生命值等)存储到一个对象(备忘录)中。当你想恢复到保存的进度时,游戏只需从备忘录对象中读取相关数据,从而将自身恢复到之前的状态。有个3个角色发起者(Originator):需要保存和恢复状态的对象。备忘录(Memento):用于存储发起者对象的内部状态。
2024-03-10 23:43:54 999
原创 Java中介者模式剖析及使用场景
介者模式是一种行为型设计模式,它允许对象之间通过一个中介者对象进行通信,而不是直接相互引用。将多对多的关系转化为一对多的关系,对象之间不再直接相互通信,而是通过中介者进行通信,降低了对象之间的耦合度。就好像在一个团队中,每个人都不直接与其他成员交流,而是通过一个团队领导来协调沟通。这样做可以有效减少成员之间的关联,提高系统的灵活性和可维护性下面4个关键,同事对象的状态发生变化时,它会通知中介者,中介者可以根据需要向其他同事对象发送消息或者执行特定的操作。
2024-03-10 22:54:42 1000
原创 Java观察者模式源码剖析及使用场景
解耦合:观察者模式将主题和观察者解耦,主题不需要知道观察者的具体实现,只需要维护一个观察者列表并通知它们。可扩展性好:可以方便地添加新的观察者,而无需修改主题代码。支持广播通信:主题可以向多个观察者对象发送通知,实现一对多的通信模式。
2024-03-10 21:31:42 1025
原创 Java迭代器模式源码剖析及使用场景
迭代器模式提供一种顺序访问集合对象元素的方法,而不需要暴露集合对象的内部表示。迭代器模式可以让不同的集合对象使用统一的迭代接口,从而避免了对集合对象的复杂操作。比如你要清点家里的物品,不同的房间里有不同的物品,但是你只需要一个标准的清点流程(迭代器),就可以清点不同房间里的物品,而不用关心每个房间的具体物品安排。支持不同的遍历方式,迭代器模式简化了遍历操作迭代器模式和集合类相分离,有利于增加新的集合类迭代器模式适用于访问集合元素的多态性对于非常大的数据集合,使用迭代器遍历效率较低。
2024-03-10 14:48:03 413
原创 Java命令模式源码剖析及使用场景
低耦合,命令发送者和执行者完全解耦可以将命令存入队列,实现撤销/恢复操作命令对象可以携带额外的执行信息新增新命令非常方便,无需修改现有代码可能会导致系统有过多的具体命令类命令对象本身冗长适用于需要将操作请求作为对象进行参数化传递的场景适用于需要支持命令队列、命令记录日志、撤销/恢复操作等功能的场景可以考虑使用组合模式组合多个命令形成复合命令在设计阶段就应该考虑是否需要支持撤销/恢复操作命令模式可以为不同对象的相同操作提供统一的接口。
2024-03-10 14:25:09 867
原创 Java模板方法模式源码剖析及使用场景
封装不变部分,扩展可变部分,代码复用性好父类调用子类操作,通过子类扩展增强功能符合开闭原则和里氏替换原则每个不同的实现都需要定义一个子类,类的个数可能过多父类和子类之间存在潜在的扩展性限制编写过程复杂,逻辑较难理解适用于复杂流程,有固定不变的算法骨架和某些可变的细节需要先分清楚算法固定部分和可变部分体现了模板模式的核心思想"继承 + 多态"在框架设计中是常用的模式,可以提高代码的复用性不建议过度使用,需要权衡利弊,避免类膨胀。
2024-03-10 13:41:47 824
原创 Java享元模式源码剖析及使用场景
享元模式是一种结构型设计模式,旨在最大程度地减少内存使用或计算开销。这种模式通过共享对多个类似对象实例所需的状态来实现这一目标。
2024-03-09 18:36:24 500
原创 Java组合模式在项目中使用场景
将对象组合成树形结构以表示“部分-整体”的层次关系。组合模式使得用户对单个对象和组合对象的使用都是相同的。Component(组件):定义了叶子节点和组合节点的公共接口,可以包含一些默认的行为或属性。Leaf(叶子节点):表示树中的叶子结点对象,叶子结点没有子节点。Composite(组合节点):表示树中的组合结点对象,它可以拥有子节点,并且实现了与 Component 相关的操作。
2024-03-09 17:57:17 567
原创 Java桥接模式源码剖析及使用场景
它的主要目的是将抽象化与实现化分离,使得二者可以独立变化,就像一个桥,将两个变化维度连接起来。各个维度都可以独立的变化。故称之为:桥接模式桥接模式的核心在于通过一个桥接接口,将抽象部分与实现部分解耦。这样做的好处是显而易见的,当系统中的某个维度(抽象或实现)需要变更时,不会影响到另一个维度。抽象化角色(Abstraction):它是抽象类的接口,定义了一个实现化的引用和对实现化的操作。修正抽象化角色(Refined Abstraction)
2024-03-09 16:58:21 1156
原创 Java外观模式源码剖析及使用场景
外观模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供了一个统一的高层接口,使得子系统更加容易使用。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。简化系统的调用复杂性。通过外观模式,客户端可以只需调用外观类中的方法就可以完成复杂的操作,无需深入了解子系统的内部工作机制。减小系统的编译依赖。通过外观模式,客户端只需要与外观类发生编译依赖,而无须与子系统的其他模块发生直接依赖。有利于体系结构的拓展。
2024-03-09 13:41:27 1114
原创 Java代理模式源码剖析及使用场景
Java的代理模式是一种结构型设计模式,它为另一个对象提供一个代理或占位符,以便控制对该对象的访问。远程代理(Remote Proxy):为一个位于不同地址空间的对象提供一个本地的代理,隐藏了对真实对象的访问细节,使得客户端能像访问本地对象一样访问远程对象。虚拟代理(Virtual Proxy):在需要创建开销很大的对象时,可以使用虚拟代理来代替真实对象,直到真实对象真正需要时才去创建它。保护代理(Protection Proxy):用于控制对一个对象的访问权限,可以让代理完全拒绝或允许访问某些方法。
2024-03-09 13:01:39 1071
原创 Java适配器模式源码剖析及使用场景
适配器模式(Adapter Pattern)是一种结构型设计模式,它作用于将一个类的接口转换成客户端所期望的另一种接口,从而使原本由于接口不兼容而无法一起工作的那些类可以在一起工作。它属于包装模式的一种。类适配器: 通过继承的方式实现适配器功能对象适配器: 通过组合的方式实现适配器功能。
2024-03-08 16:04:03 1318
原创 Node.js概述与安装和运行
4.npm:Node.js 拥有庞大的第三方模块生态系统,npm (Node Package Manager) 是 Node.js 的包管理器,可以轻松安装和管理这些模块。3.安装完成后,打开命令提示符 (cmd.exe) 并输入 node -v 和 npm -v 分别检查 Node.js 和 npm 的版本号,确认安装成功。3.非阻塞 I/O:Node.js 在处理 I/O 操作时,会将其交给系统内核,并继续处理其他操作,从而提高吞吐量和性能。建议选择 “全部组件” 选项,确保安装所有相关组件。
2024-03-08 10:27:27 644
原创 Java原型模式源码剖析及使用场景
Java 中的原型模式提供了一种创建对象的简单方式,通过将一个对象复制出一个新的实例来创建新对象。然后,每当我们需要创建一个新的图像对象时,只需要从原型对象上克隆一个副本出来,就可以避免重复创建对象的开销。但是,如果字段是引用类型,则会将引用地址复制给新对象,因此新对象和原对象引用同一个对象。原型模式通过对象克隆的方式来创建新的对象,避免了重复创建对象的开销,提高了系统的性能和效率。方法执行的是浅拷贝,如果对象中包含其他对象的引用,那么这些引用指向的对象并不会被克隆。字段指向不同的对象,修改新对象的。
2024-03-08 08:34:01 603
原创 Java建造者模式源码剖析及使用场景
建造者模式通过将对象的构建过程分离出来,使得构建过程变得更加清晰和易于维护。它适用于需要构建复杂对象的场景,可以避免出现过多的构造参数或者复杂的构造逻辑。在项目开发中,我们经常会遇到需要构建复杂对象的场景,这时就可以使用建造者模式。比如,我们需要构建一个包含多种信息的电子邮件对象,包括发件人、收件人、主题、正文、附件等。这种设计模式让我们可以通过链式调用的方式一步步构建最终的字符串对象,而不需要手动拼接字符串。内部也对字符数组进行了优化,避免了频繁地创建新的字符串对象,提高了性能。对象以支持链式调用。
2024-03-07 19:19:37 738 1
原创 Java工厂模式源码剖析及使用场景
总的来说,ResourceLoader接口定义了一个抽象的资源加载工厂,而具体的实现类(如DefaultResourceLoader)则充当了具体的资源加载工厂,根据不同的资源位置返回对应的Resource实现类。总的来说,BeanFactory接口定义了一个抽象的Bean工厂,而具体的实现类(如DefaultListableBeanFactory)则充当了具体的Bean工厂,负责创建和管理Bean实例。接口在Spring中扮演了抽象工厂的角色,它定义了获取Bean实例的标准方法,具体的实现由其子类提供。
2024-03-07 18:50:06 1855
原创 Java单例模式源码剖析及使用场景
单例模式的核心思想是控制实例的创建,确保单例类只有一个实例对象。在Runtime类的实现中,通过一个私有静态变量currentRuntime持有单例实例,getRuntime()方法返回这个实例。Java单例模式是一种常用的设计模式,它的目的是确保一个类只有一个实例,并提供一个全局访问点,用于访问该实例。比如,Runtime类就是一个典型的单例类,用于获取与当前Java应用程序相关的运行时对象。这种方式是单例模式的经典实现方式,兼顾了线程安全性和性能。这种方式在类加载时就完成了实例的创建,是线程安全的。
2024-03-07 15:49:45 1062
原创 Java设计原则代码运用案例和通俗介绍
上面这个例子中,Device接口将扫描、打印、传真功能都定义在一个臃肿的接口里,对于只有打印功能的OldFashionedPrinter类就不得不实现无关的方法。代码案例: 假设我们有一个圆形类Circle,它需要有计算面积、计算周长的方法,如果直接将输出到控制台的打印方法放在Circle类中,就违反了单一职责原则。通俗解释:一个设计良好的模块应该是可扩展的,在不改变已有代码的情况下,可以通过添加新代码来扩展功能。这样做就避免了继承产生的耦合,父类的变化不会影响子类的实现,也符合开闭原则。
2024-03-07 11:38:47 1098
原创 vue axios解决文件流下载乱码
charset=utf-8’ 一定要设置类型,和后端response.setContentType(“application/vnd.ms-excel;charset=utf-8”)一样。前端请求头 {responseType :‘blob’} 一定要加,是单独一个对象,不能放在请求参数里面。
2023-08-03 19:39:16 1454
原创 Java FTP上传多个相同文件,下载相同的文件乱码
文件表保存了多个相同的文件名,因为需要和工程表一一对应起来,一个函件里面有多个工程页面,工程页面下面,只能上传一个文件。出现的问题是上传到ftp服务的文件,被新文件覆盖了。导致加密key跟着被覆盖,点击下载按钮,后台查询文件表旧文件key 和ftp服务新上传的文件加密key不一样。表有函件表,工程表,文件表,工程表内容和文件表文件一一对应。判断数据库里面相同函件,相同文件名,拿到新文件加密key修改旧的加密key。所有文件通过SM4加密保存在此路径下,此路径会保存文件名不一样,文件内容是一样的文件。
2023-04-28 08:57:19 384 1
原创 Linux文件夹赋予drwxr-xr-x权限,不能执行删除,只能mv改名
Linux 给某个文件夹赋予drwxr-xr-x权限:1、语法:chmod 755文件夹 -R2、例子:chmod 755 /usr/tmp/20160808 -R3、没有-R,则只是对当前文件夹赋予权限,文件夹里面的文件夹则不受影响,一般使用时都带-R就不能执行rm -rf删除操作,只能mv改名备份。...
2021-09-29 15:57:50 1067
原创 Java使用JVM工具检测问题
1.jps 显示运行程序的进程、编码、主类目录信息public class Demo01 { /** * jps : 显示进程ID,主类名称 * jps -v: 显示进程ID,主类名称以及详细编码信息 * jps -l:显示进程ID,主类目录 * * @param args * @throws IOException */ public static void main(String[] args) throws
2021-09-12 00:14:55 746 4
C++中用substr()函数消除前后空格的解决方法详解.docx
2024-03-25
Java用户注册登录模块业务拆解步骤.docx
2024-03-25
curl日常使用命令详解.docx
2024-03-25
如何安装node.js教程.docx
2024-03-25
Mysql增删改查语句.txt
2024-03-25
DirectX修复工具V4.3加强版(升级一键自动)
2024-03-24
java图书管理系统毕业设计(源代码+论文).zip
2024-03-24
卷王问卷考试系统,提供功能最强大的调查问卷、考试系统.zip
2024-03-24
JAVA物业管理系统设计与实现(论文+源代码).zip
2024-03-24
一线大厂 AI 技术实践.zip
2024-03-21
Java编程游戏开发,面向对象编程(OOP)
2024-03-10
Paython代码实现爱心代码
2024-03-10
涵盖了 Java 基础、集合、源码、并发、虚拟机、框架、数据库、网络编程、设计模式、新特性和数据结构等多个知识领域的面试突击
2024-03-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人