![](https://img-blog.csdnimg.cn/733d7999f4c94ffda710fd5b304050c3.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
细说Java基础
文章平均质量分 71
Java基础知识
盐咔咔
奔跑起来像是一到春天的闪电
展开
-
深度思考:为什么需要泛型?
不知道大家平时在进行后端编程的时候有没有考虑过一个概念:泛型编程,就像面向对象、面向接口编程一样,很常用以致于用成为了大家广泛的习惯原创 2022-07-11 07:00:23 · 568 阅读 · 6 评论 -
深度思考:到底什么是面向接口编程?
在以往的编程学习中,我们听说过很多编程概念,比如面向对象编程(OOP)、面向方面编程(AOP)、面向过程编程(POP),以及还有今天要进行深入思考的面向接口编程(IOP)。原创 2022-06-04 19:05:03 · 1498 阅读 · 14 评论 -
玩转Java注解
1 为什么需要注解因为注解起源与JDK1.5,所以先带你们去挖一挖Sun官方当时刚刚发行JDK1.5时的文档,目前在Oracle官网链接:https://docs.oracle.com/javase/1.5.0/docs/relnotes/features.html#annotationshttps://docs.oracle.com/javase/1.5.0/docs/guide/apt/index.html如果你不愿意自己看的话,我截取了一些重点的内容并且翻译了下:翻译:- 元数据(原创 2022-04-05 13:34:12 · 579 阅读 · 0 评论 -
玩转Java枚举
枚举在Java中的本质是一个"语法糖",那么,翻译翻译,什么是语法糖?假如你每天骑自行车去上班,可以说是蹬自行车去上班,但文雅一点的说法就是开车(自行车也是车)去上班,但本质上都是骑自行车上班,但这里说成了开车上班,就这是“语法糖”。1 枚举的一般使用1.1 代替public static finalpublic enum RoleEnum { USER, MANAGER, ADMIN}使用:public static void main(String[] args) {原创 2021-10-22 11:28:02 · 215 阅读 · 0 评论 -
深入浅出组合模式
深入浅出组合模式1 概念基本概念:组合模式是结构型设计模式的一种,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性。主要解决:将整体的各个部分都一视同仁,共同进行处理或操作,具有一致的行为,使得操作者与复杂的部分元素解耦合。2 应用场景树形菜单目录、文件管理部门-员工管理整体与部分的场景…3 代码实现【场景说明】公司的工资结算系统需要计算出每位员工和每个部门的工资,使用组合模式实现一个程序,能够分别计算出每位员工的薪资和每个部门的工资总和【类的设计】【原创 2021-09-26 12:42:50 · 99 阅读 · 0 评论 -
深入浅出装饰者模式
1 简单介绍装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。四个重要角色:抽象组件Component:一个接口或者抽象类,是定义我们最核心的对象(最原始的对象),被装饰类的抽象。具体组件ConcreteComponent:最核心、最原始、最基本的接口或抽象类Component的实现原创 2021-10-09 17:26:16 · 107 阅读 · 0 评论 -
详解Java中ThreadLocal类型
1 基本概念ThreadLocal类提供了线程局部变量。这些变量与普通变量的不同之处在于,每个访问一个变量(通过其get或set方法)的线程都有自己的、独立初始化的变量副本。ThreadLocal实例通常是希望将状态与线程关联起来的类中的私有静态字段(例如,用户ID或事务ID)。例如,下面的类生成每个线程本地的唯一标识符。 线程的id在第一次调用ThreadId.get()时被赋值,并且在后续调用中保持不变。public class ThreadId { // 包含要分配的下一个线程ID的原子原创 2021-10-13 14:35:49 · 370 阅读 · 2 评论 -
玩转Java泛型
1 翻译翻译什么是泛型泛型,英文Generics,是JDK1.5中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。作用:泛化类型安全消除强制类型转换向后兼容2 泛型常用的字符ET?<E extends T><E super T>3 泛型的一般使用新建几个实体类GrandFather、Fat原创 2021-10-08 10:47:30 · 116 阅读 · 0 评论 -
深入浅出建造者模式-干货!
1 简介建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。实用范围当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。当构造过程必须允许被构造的对象有不同表示时。角色在这样的设计模式中,有以下几个角色:builder:为创建一个产品对象的各个部件指定抽象接口。ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。D原创 2021-08-20 09:46:07 · 175 阅读 · 0 评论 -
数据结构之串—字符串而不是羊肉串
1 串的介绍概念:串是由零个或多个字符串组成的有限序列,又名叫字符串。例如:str = “abc”,当字符串由零个字符组成时,被称为空串,即 str = null2 字符串的比较说到字符串的比较,想到的只有“==”,其实字符串也可以使用"<","<=",">=",">"等符号来比较,当然使用这些符号来比较时主要是根据字符串中每个字符的ASCII来比较,再举个例子:String str1 = "abc";String str2 = "abcd";String str3原创 2021-08-25 10:59:18 · 189 阅读 · 0 评论 -
玩转Java反射机制
欢迎大家关注B站韩顺平老师,冲冲冲!为什么需要反射?------反射是框架的灵魂1 一个需求引入反射需求:1.根据配置文件reflect.peoperties的内容创建Student对象并调用sayHello()方法classname=org.ymx.Studentmethodname=sayHello这样的需求在学习框架时特别多,即通过外部文件配置,在不修改源码情况下来控制程序,也符合设计模式的ocp原则(开闭原则:不修改源码,扩容功能)2 反射机制2.1 Reflection .原创 2021-09-03 09:46:46 · 190 阅读 · 0 评论 -
深入浅出模板方法模式
1 概念在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。2 应用场景有多个子类共有的方法,且逻辑相同。重要的、复杂的方法,可以考虑作为模板方法。3 实际使用案例3.1 场景分析一个国际上市公司的老板Tom经常去不同的国家谈合作,邮件中需要进行自我介绍,在不同的国家需要不同的语言,但是介绍的模板都是相同的,主需要更换不同语言的名字就可以实现自我介原创 2021-08-29 08:15:24 · 148 阅读 · 0 评论 -
深入浅出过滤器模式
过滤器模式(Filter Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。过滤器模式中几个常见的角色:AbstractFilter(抽象过滤器角色):在客户端可以调用它的方法,在抽象过滤器角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的实现类去,传递给相应的实现类对象处理。ConcreteFilter(具原创 2021-08-14 09:09:24 · 272 阅读 · 2 评论 -
深入浅出职责链模式
深入浅出职责链模式简介 职责链模式在面向对象程式设计里是一种软件设计模式,它包含了一些命令对象和一系列的处理对象。每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。该模式还描述了往该处理链的末尾添加新的处理对象的方法。 责任链模式涉及到的角色如下所示:● **抽象处理者(Handler)角色:**原创 2021-08-16 10:26:06 · 127 阅读 · 0 评论 -
什么是双亲委派?如何打破双亲委派?
1 双亲委派(又称双亲委托)作用:保证类加载的有序性和安全性类加载器的分类:作用:保证JVM的核心类和用户的类都能得到正常加载双亲委派机制:向上委派:当类加载器加载一个类时,首先会向他的父类加载器进行委派,直到启动类加载器。向下委派:当启动类加载器发现自己无法加载这个类时,会委派给他的子类加载器进行加载,如果直到最后一个子类还不能加载,就抛出ClassNotFound异常。2 如何打破双亲委派两个典型的方法:自定义类加载器,重写loadClass方法使用线程上下文类加载器原创 2021-08-12 09:22:59 · 4529 阅读 · 0 评论 -
CountDownLatch和CyclicBarrier你使用过吗?
1 CountDownLatch1.1 含义一种同步辅助,允许一个或多个线程等待一组正在其他线程中执行的操作完成。CountDownLatch使用给定的计数进行初始化。由于对countDown方法的调用,await方法会阻塞,直到当前计数为零,在此之后,所有正在等待的线程都会被释放,后续对await的调用会立即返回。这是一种一次性现象——计数无法重置。如果需要重置计数的版本,可以考虑使用CyclicBarrier。CountDownLatch是一个通用的同步工具,可以用于许多目的。初始化计数为1的Co原创 2021-07-31 22:52:26 · 178 阅读 · 0 评论 -
关于阻塞队列
1 概念和数据结构支持以下操作的队列:在检索元素时等待队列变为非空在存储元素时等待队列中的空间变为可用。BlockingQueue方法有四种形式,具有不同的处理操作的方法,这些操作不能立即得到满足,但可能在将来的某个时候得到满足:第一个抛出异常,第二个返回一个特殊值(null或false,取决于操作),第三个阻塞当前线程,直到操作成功,第四个阻塞只有给定的最大时间限制,然后放弃。这些方法总结如下表: BlockingQueue方法的总结接下来是Bloc原创 2021-08-02 09:50:24 · 252 阅读 · 0 评论 -
try{...}catch(){...}finally{...}语句你真的理解吗?
/** * @desc: 探究try...catch...finally语句块 * 六种模式: * (1)try{ ... } catch(){ ... }finally{ ... } ... return; * (2)try{ ... return;}catch(){ ... } finally{ ... } ... return; * (3)try{ ... } catch(){ ... return;} finally{ ... } ... return; * (4)try{ ....原创 2021-08-10 10:53:15 · 179 阅读 · 0 评论 -
深入浅出适配器模式
深入浅出适配器模式简介在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。对象适配器模式在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。类适配器模式这种适配器模式下,适配器继承自已实现的类(一般多重继承)适配器模式思想:适配器模式的宗旨:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。原创 2021-07-13 09:04:50 · 132 阅读 · 0 评论 -
JSP九大内置对象及基本使用
什么是内置对象?一句话解释:自带,不需要new 也能使用的对象1 Jsp的九个内置对象JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception1.1 request对象request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系原创 2021-07-09 13:21:35 · 11058 阅读 · 4 评论 -
详解Java线程的几种状态
线程的几种状态一言不合翻源码,一下就是Thread类源码中State内置枚举,列举出了Java线程的几种状态:/** * A thread state. A thread can be in one of the following states: * <ul> * <li>{@link #NEW}<br> * A thread that has not yet started is in this state. * </li>原创 2021-07-16 06:55:41 · 890 阅读 · 0 评论 -
一篇文章学会Java十大排序算法
Java十大排序算法1.1 选择排序选择排序算法的运作如下:①从待排序序列中,找到关键字最小的元素;②如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;③从余下的 N - 1 个元素中,找出关键字最小的元素,重复①、②步,直到排序结束。/** * 选择排序 * * @param array * @return */public static int[] selectSort(int[] array) { for (int i = 0; i < array.l转载 2021-07-14 08:35:44 · 129 阅读 · 0 评论 -
Java线程池的理解和使用
1 池化思想程序的运行的本质是占用系统的资源,而池化技术就是优化资源的使用,比如线程池、连接池、内存池、对象池等等,因为频繁的创建和回收资源也是一种浪费资源的过程,所以使用池化技术,将各种资源事先创建好,等到有进程或线程请求的时候再进行分配,使用完成后进行回收,这样就会很大程度的较少浪费。一句话总结:池化技术就是事先准备好一些资源,有人要用,就来我这里拿,用完之后还给我。线程池的好处:1、降低资源的消耗2、提高响应的速度3、方便管理。2 线程池的使用和源码分析《阿里巴巴Java开发手册》中原创 2021-07-12 08:13:47 · 145 阅读 · 4 评论 -
谈一谈synchronized和ReentrantLock
1 Synchronized1.1 定义 java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍可以访问该object中原创 2021-07-08 21:02:41 · 227 阅读 · 2 评论 -
浅谈一下CAS和ABA问题
浅谈一下CAS和ABA问题1 CAS概念CAS(Compare And Swap)比较并交换,CAS 算法的过程是这样:它包含 3 个参数CAS(V,A,B)。V 表示要更新的变量(内存值),A 表示预期值,B 表示新值。当且仅当 V 值等于 A 值时,才会将 V 的值设为B,如果 V 值和 A 值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。最后,CAS 返回当前 V 的真实值。CAS 操作是抱着乐观的态度进行的(乐观锁),它总是认为自己可以成功完成操作。当多个线程同时使用 CAS 操作一原创 2021-07-15 14:15:13 · 1497 阅读 · 0 评论 -
详解Java中HashMap、HashTable、ConcurrentHashMap常见问题
1 大致对比名称线程是否安全实现接口父类能否使用Null作为键值对HashMap不安全Map、Cloneable、SerializableAbstractMap可以使用一个null作为键值对HashTable安全Map、Cloneable、SerializableDictionary不可以使用null作为键值对ConcurrentHashMap安全ConcurrentMap、SerializableAbstractMap不可以使用null作为键原创 2021-07-09 11:02:20 · 260 阅读 · 4 评论 -
JVM还没学明白,又来了JMM!
JMM(Java Memory Model,Java内存模型),是一种抽象的概念 并不真实存在,它描述的是一组规则或规范通过规范定制了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式.JMM关于同步规定:线程解锁前,必须把共享变量的值刷新回主内存线程加锁前,必须读取主内存的最新值到自己的工作内存加锁解锁是同一把锁由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方成为栈空间),工作内存是每个线程的私有数据区域,而Java内存模型中规定所原创 2021-07-11 08:22:12 · 129 阅读 · 4 评论 -
Java中for循环的六种形态
/** * @desc: for循环的使用 * @author: Mr_YanMingXin * @create: 2021/7/25-20:07 **/public class Test01 { /** * 方式一:for(变量初始化;boolean表达式;) * 最经常使用的for循环 */ public static void Test01() { for (int i = 0; i < 10; i++) { .原创 2021-07-25 20:43:16 · 402 阅读 · 0 评论 -
JVM GC和常见垃圾回收算法
1 GC要做的四件事2 判断哪些是垃圾2.1 引用计数法在Java中,引用和对象是有关联的,如果要操作对象必须用引用进行,因此很显然一个办法就是通过引用计数来判断该对象是否可以回收,简单讲,如果一个对象没有任何与之关联的引用,即他的引用计数都不为0,则说明对象不太可能被用到,那么这个对象就是可回收对象。2.2 根搜索算法(可达性分析)因为引用计数法存在引用循环的问题,Java还使用了可达性分析的方法,通过一系列的“GC roots”对象作为起点搜索,如果在“GC roots”和一个对象之间没有原创 2021-07-06 10:02:39 · 154 阅读 · 2 评论 -
认识 Semaphore
Semaphore简介Semaphore 一般译作 信号量,它也是一种线程同步工具,主要用于多个线程对共享资源进行并行操作的一种工具类。它代表了一种许可的概念,是否允许多线程对同一资源进行操作的许可,使用 Semaphore 可以控制并发访问资源的线程个数。使用场景Semaphore 的使用场景主要用于流量控制,比如数据库连接,同时使用的数据库连接会有数量限制,数据库连接不能超过一定的数量,当连接到达了限制数量后,后面的线程只能排队等前面的线程释放数据库连接后才能获得数据库连接。再比如交通公路上的红原创 2021-07-27 10:31:34 · 205 阅读 · 0 评论 -
Java数据结构之链表及其常见算法
一、什么是链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访原创 2021-06-25 20:47:07 · 505 阅读 · 0 评论 -
Java优先队列(堆)理解和使用
什么是优先队列(堆)Java中堆的使用(小根堆为例)原创 2021-06-10 19:54:36 · 1514 阅读 · 0 评论 -
equal 和 == 在对象、变量类型下的不同情况
你是否遇到过这样的问题? String str1 = "Hello"; String str2 = new String("Hello"); String str3 = str2; // 引用传递 System.out.println(str1 == str2); System.out.println(str1 == str3); System.out.println(str2 == str3);原创 2021-06-06 11:28:21 · 116 阅读 · 0 评论 -
Java实现信号量机制(生产者消费者问题)的三种方式
一、什么是信号量机制 信号量(Semaphore),是在程序在多线程环境下使用的一种措施或方案,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量semaphore,然后将等待操作以及释放操作分别放置在每个关键代码段的首末端。确认这原创 2021-06-22 14:12:30 · 2007 阅读 · 4 评论 -
代理模式与动态代理
代理模式与动态代理1 概述代理模式是在二十三种设计模式中比较接近现实生活和容易理解的一种设计模式,简单的来说就是A通过B的代理,与C进行通信,如图:当然这样看来并没有增加A与C通信的效率,反而多了一层代理,但是,当A多了以后呢?显然,这样可以只让B与C进行通信,类似于多加了一层的代理层,专门用来处理请求,再来一个现实点的例子:如果一个人有事想找你你可以直接与他对话,而如果一群人想找你你一定不能同时与他们进行对话,就需要一个一个的回复,比如我们平常的移动联系方式微信,此时他就可以代理你进行消息的原创 2021-07-04 15:28:57 · 354 阅读 · 8 评论 -
Java中类的加载机制和反射相关概念
本篇文章主要知识点因为最近在刷面试题,遇到了很多的基础问题都出了错,所以利用空闲时间大肆的回顾下基础,顺便总结出了一些知识点来进行分享,如果能帮助到你请点个赞吧!1.Java一个类中代码的执行次序2.当一个子类继承父类时,子类实例化时,子类和父类代码的执行次序3.final关键词的一些验证4.反射到底都能获取类的什么东西下面我们来依次进行试验:1 Java中代码的执行次序我们来新建一个类,一个类中的东西也无非就是属性(private、public修饰等等),方法(private、publ原创 2021-06-11 15:37:39 · 1083 阅读 · 4 评论 -
回顾一下单例模式
在Java的23中设计模式中,单例模式是最简单也是最常考的一个设计模式,实现单例模式的方式有很多种,而且有的实现方式会考虑线程安全和反射机制的破坏,其中最常见的不外乎懒汉模式、饿汉模式、双重检查式和枚举式,加下来就每个方式的单例模式进行代码的实现,以此来做一个对比。1 懒汉模式 顾名思义,懒汉就是在需要的时候去做事情,因此懒汉模式就是在需要原创 2021-07-01 13:58:16 · 93 阅读 · 0 评论 -
深入浅出工厂模式
工厂模式属于二十三种设计模式之一,但是我们平时还会听到简单工厂和抽象工厂,而它们又与工厂模式有什么异同呢?接下来解释下:工厂模式、简单工厂模式、抽象工厂模式异同工厂模式和抽象工厂模式属于二十三种设计模式的创建型模式,而简单工厂模式则不属于二十三种设计模式。工厂模式不使用new创建对象,而是使用Factory模式;简单工厂模式是通过FW模式来建立对象;抽象工厂模式使用迭代模式来创建对象工厂模式在使用时可以随时设置变量,不用提前进行设置。简单工厂模式中需要使用参数或者配置文件等已经定义好的变原创 2021-07-02 21:31:46 · 132 阅读 · 2 评论 -
Java基础之IO&NIO操作文件流
一、简介1.1 IO(BIO)—阻塞式IO起源于JDK1.0java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。1.2 NIO—非阻塞式IO起源于JDK1.41.3 BIO和NIO对比原创 2021-03-27 10:22:40 · 759 阅读 · 0 评论