
Java基础
文章平均质量分 71
介绍java基础知识
Guo_j_
坚持学习,持续进步
展开
-
基于Spring Task的定时任务实现及原理分析
很多情况下任务并非需要立即执行,而是需要在指定时间或指定频率执行,这不可能人工去操作,所以定时任务就出现了。基于Spring Task的定时任务实现及原理分析原创 2022-06-15 10:04:05 · 4071 阅读 · 0 评论 -
java访问修饰符
private 和 public 两极分化,前者只能在类内部访问,后者在所有位置可访问default 包访问权限,只要在一个包下【不管是否存在父子关系】都可以访问,也是默认访问修饰符protected 包和子类可以访问。对于子类的访问权限,有说存在特殊情况,此处略去。...原创 2021-11-24 21:25:53 · 197 阅读 · 0 评论 -
java抽象类
定义如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰。抽象方法是无法执行的,因此其所在类也无法实例化,必须要定义为抽象类,抽象类同样使用abstract修饰。即抽象方法是抽象类无法实例化的根本原因。抽象方法实质是多态思想的体现,即只定义了框架,其具体实现由子类完成。类似设计模式中对变化部分的处理。特点抽象类不能用来实例化对象,可以避免被new,声明抽象类的唯一目的是为了将来对该类进行扩充。如果一个类继承于一个抽象类,则子类必须实现父类的抽象方原创 2021-11-24 21:24:30 · 259 阅读 · 0 评论 -
java构造方法的三种调用场景
java的构造方法是一种特殊类型的方法,其作用用于初始化实例的内部字段。有三种调用场景在业务处理语句块中调用构造方法这是构造方法最常出现的调用场景,用于创建实例。定义了一个业务类,在业务处理语句块中,调用该类的构造方法创建该类实例。编译器会根据形参列表自动调用对应的构造方法,将实参传递给类字段,完成实例的初始化。在构造方法中调用另一个构造方法当类中有多个构造方法时,可在一个构造方法中使用this(形参列表)调用其对应的构造方法,此时this表示当前对象引用。需要注意的时,这种调用方式只能出现在主调原创 2021-11-24 21:08:23 · 1874 阅读 · 0 评论 -
java集合框架(2)Iterable接口
该接口是集合类的最顶层接口,其字面意义是可以迭代的意思,可以理解为实现这个接口的集合类获得了迭代遍历的能力。Iterable接口出现在 JDK1.5,只有iterator()一个方法,该方法返回一个迭代器实例引用,用于遍历当前集合实现类。此时Iterable接口此时定义了一种遍历集合的规范,即可使用迭代器遍历集合。同时,该接口的集合实现类也可以使用for-each遍历集合,但这只是一种语法糖,在经过编译之后产生的class文件中,for-each语句会转化为基于迭代器的遍历方式。在JDk1.8中,Ite原创 2021-11-15 22:14:32 · 502 阅读 · 0 评论 -
java集合框架系列(1)集合框架概述
持有一批引用在编程实践过程中,很多业务场景需要处理一批不确定数量的对象,而又没有必要为每一个对象创建引用(通俗讲,为对象起一个名字),使用对象引用来逐个持有这些对象。很自然地,容器可以解决这一问题。在逻辑层面,容器在内存中(不是持久化存储)为多项数据提供存储空间。此时,可以创建容器对象,并将这一批对象存储在容器对象中,即使用一个容器对象引用持有一批对象。对象封装一堆数据,集合存储一堆对象在java的实现层面,数组和集合类都可称为容器,都可以持有一批引用。集合扩充了数组其中,静态数组被java原创 2021-11-15 22:13:03 · 273 阅读 · 0 评论 -
java的两种比较器
比较算法日常生活中,如果想比较两个数的大小,可采用做差的方式,做差结果的正负可用来判断两个数的大小。假设A - B = C若整数C > 0,说明 A > B ;若整数C = 0,说明 A = B;若整数C < 0,说明 A < B;java的两种比较器均基于以上判断逻辑,将两个待比较的Object经过某种处理,返回一个整数值,然后根据整个整数值的正负判断大小。类似地,自定义实现比较器时,也是同样道理,经过逻辑处理之后,返回一个整数。内部比较器(基于Comparable原创 2021-10-22 11:27:36 · 1776 阅读 · 0 评论 -
三种方法返回值为空的处理方式
在学习策略模式时,给某方法传入参数key,返回对应的策略。此时存在key没有对应的策略,即该方法的返回值未空(null),对这种情况有不同的处理方式。1、直接返回null这种方式是最差劲的一种。由于返回值定义为StrategyInterface类型,后续可能有其他操作,直接返回null会造成空指针异常。 public static StrategyInterface getStrategy(String promotionKey){ StrategyInterface si = PR原创 2021-10-20 14:58:42 · 8620 阅读 · 0 评论 -
三种java常量封装方式(枚举、类、接口)
在工程代码里面不应该出现常量字符串和常量数字之类的硬编码内容,java常量可以放在类中,也可以放在接口中。既然使常量,需要保证其值不发生变化,这两种方式各有自己的实现方式。1、常量放在类中类通过一下两个约束,保证常量不被修改。1)私有化构造器,保证类不被创建和继承2)使用 private static final 关键字修饰常量public class Constants { /** * 构造器私有 * 私有化构造函数即可防止创建对象,表明该类只原创 2021-10-20 14:40:51 · 1225 阅读 · 1 评论 -
java的泛型
泛型是一个使用<>(尖括号的位置在使用泛型类的类名后面,ClassName)引起来的参数类型,既然是参数,一方面起到占位作用,另一方面只在具体使用时才会确定具体的类型。需要注意,泛型的类型只能时引用数据类型,不能是基本数据类型。并且,只有这个引用类型不确定,而其他操作时确定的。Jdk1.5前使用Object占位(代表所有要接收或返回的数据类型),之后使用泛型,即泛型替代Object的作用。默认情况,集合可以存储任意类型的数据元素(底层Object类型数组),但这种方式方便存储,但不利于后续处原创 2021-10-18 11:08:58 · 488 阅读 · 0 评论 -
详解java集合框架中的迭代器模式(Iterator接口 Iterable接口)
在设计模式系列之 迭代器模式中介绍了迭代器模式的基本知识,该模式主要包含了抽象迭代器、具体迭代器、抽象聚合类、具体聚合类。前两个类规范了对聚合类的遍历方式,后两个类主要用于存储数据和提供对应的迭代器。java集合框架涉及的众多类,譬如ArrayList、HashMap等,都可称为用于存储数据的聚合类,并且java的作者也为其提供了对应迭代器。随着java语言的版本更迭,其集合框架使用迭代器模式的方式同样发生了变化。本文基于不同版本JDK,分别介绍迭代器模式在java集合框架(除去Map相关接口)中应用。原创 2021-10-16 18:50:21 · 717 阅读 · 0 评论 -
详解堆(heap)
定义满二叉树最后一层全部都是叶子节点,其他各层的所有节点都有两个子节点的二叉树。其特点是第k层有 2k-1个节点,整棵二叉树有2k-1个节点。完全二叉树若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边。观察满二叉树可以发现,从根节点开始,对满二叉树排序(1-based),可以发现对于序号为 i 的节点,其左孩子的序号为 2 * i ,其右孩子的序号为 2 * i + 1。从定义可知,完全二叉树存在节点的位置和原创 2021-09-18 16:09:47 · 440 阅读 · 0 评论 -
详解二叉搜索树(Binary Search Tree,BST)
同线性结构的类似,树型结构也是一种组织数据元素的数据结构。这种结构中的数据元素存在一对多的关系,在逻辑上像一颗倒立(一对多)的树。若树中节点的分支个数的最大值为m,则该树被称为m叉树,因此二叉树指树中所有节点的的分叉最多只能有2个。特别指出的是,树型结构没有一叉树,最小的就是二叉树,即分支个数的最大值为1时,该树也可称为二叉树,甚至只有一个节点也是二叉树,null也是二叉树。二分搜索树又称为二分查找树、二分排序树,是一种添加了限定条件的二叉树。其定义为若树的左子树不为空,则左子树上的所有节点的值都小于原创 2021-09-08 11:25:35 · 652 阅读 · 0 评论 -
详解链表LinkedList
线性表是n个数据元素的有限序列,在存储线性表时,需要存储数据元素和元素之间的关系。根据存储关系的不同,在计算机的物理层面对线性表的表示分为两种形式顺序存储。线性表的元素可存储在地址连续的内存单元中。此时内存单元中存储的是元素的值,而元素的前后关系通过内存单元地址的前后关系隐式体现。链式存储。线性表的元素可存储在任意地址的内存单元中。其中,内存单元中存储元素值和用于指向直接后继的信息,元素的关系显式存储在节点中。顺序存储和链式存储都是线性表的底层基础实现。其中,使用链式存储的线性表可称为链表。链表原创 2021-08-31 13:37:40 · 229 阅读 · 0 评论 -
数字字符转为对应数字
问题描述在leetcode的第415-字符串相加时,需要把数字字符转为数字,例如把 char c = '1'转换为 int i = 1。由于char是基本数据类型,可以通过隐式类型转换为int值,且该值为字符对应的ASCll码,因此直接不能直接使用强制类型转换。 char cc = '1'; int i = (int)cc; System.out.println(i);//49.不是数字1.解决方式将基本数据类型char装箱为对应类Character,再将类转原创 2021-08-30 21:58:03 · 2748 阅读 · 0 评论 -
详解队列Queue
同栈类似,队列也是一种受限的线性表。其中受限指队列的操作是线性表的子集,它要求所有元素必须从一端插入新元素,从另外一端删除元素。添加元素的一端叫队尾 ,删除元素的一端叫队首。图1 队列逻辑模型根据底层使用的数据容器的不同,队列可分为以下两大类顺序队列:使用数组作为数据容器链式队列:使用链表作为数据容器队列的逻辑定义是其具备先进先出(first in first out,FIFO)的特点,这种特点决定了队列的应用场景。队列接口根据队列的描述,可知队列的操作包括出队、入队、查看队首、获取队原创 2021-08-26 17:14:55 · 484 阅读 · 0 评论 -
详解栈Stack
栈是限定仅在表尾进行插入或删除操作得线性表。从数据结构来看,栈也是一种线性结构。但由于其操作只能在表尾完成,因此是操作受限的线性表,也可称为限定性的数据结构。栈的逻辑定义决定了栈具备了后进先出(last in first out,FILO)的明显特征,基于该特征,栈在计算机世界中有很多应用场景。符号匹配中缀表达式转换为后缀表达式计算后缀表达式实现函数的嵌套调用HTML 和 XML 文件中的标签匹配网页浏览器中已访问页面的历史记录Java 中的程序计数栈、堆栈word的撤销操作栈的操作原创 2021-08-26 14:38:27 · 281 阅读 · 0 评论 -
实现java动态数组
java自身的数组属于静态数组,即无法自动伸缩容量。动态数组则是在静态数据的基础上,使用代码逻辑实现数组容量的自动伸缩,如下代码。java.util.ArrayList的实现原理与下面代码类似。import java.util.Arrays;/** * 数组有一个前置条件,一个挨着一个存储。 */public class Array<E> { /** * 步骤一 定义类变量 */ private E[] data; //size具有实际计原创 2021-08-26 14:24:40 · 299 阅读 · 0 评论 -
String实例创建及池化分析
在设计层面,java的字符串要求其值一旦定义,不可再发生变化。在实现层面,通过使用final修改String类的成员变量value实现其不可变性。在代码实践中,字符串极高的使用频率,那么同样存在大量使用重复字符串的场景。出于节省jvm内存空间和提升读取效率的考虑,结合java字符串的不可变性,很自然的考虑在内存中设计一个共享区,存放一份可能重复使用的字符串,使所用使用该字符串的程序指令直接从共享区读取,而不是每次使用时重新创建。在java体系中,这个共享区被称为字符串常量池,把字符串放入字符串常量池的原创 2021-08-24 13:42:10 · 388 阅读 · 0 评论 -
详解java静态数组
数组是一种线性表顾名思义,数组就是数据组合在一起,是一个存储数据容器。其一般定义: 数组是具有相同数据类型元素的有序集合。从定义可知所有元素必须是相同数据类型。那么可以推导数组也是一种数据类型,且它的类型由其元素的数据类型决定。其中,数据类型刻画操作对象的特性,是一个值的集合和该值集上的一组操作的总称,即 数据类型 = 值域 + 操作。数组中元素是有序的。有序指数据元素之间的关系,即除首尾元素,其他元素都有且只有一个前驱元素、后继元素。元素有序说明数组是一种线性表,在逻辑内存上,数组不管原创 2021-08-13 14:01:54 · 4568 阅读 · 0 评论 -
详解Java反射Reflection
前言虚拟机的语言无关性我们知道,虚拟机规范了Class文件(是一种二进制文件)的标准结构,Class文件中每个字节代表的含义是确定的,譬如每个类文件的头4个字节称为魔数,任一符合标准结构的Class文件都可以被虚拟机识别并加载。但虚拟机并不关心Class文件的来源,它有可能是由java程序编译生成的,也有可能是Scala程序编译生成的,即所谓的语言无关性。通俗的讲,只要把符合规范的Class文件给虚拟机,虚拟机就可以按照规定步骤完成加载、链接、初始化等操作。对于java语言来说,java程序的业务源代原创 2021-03-17 11:19:53 · 1078 阅读 · 3 评论