
Java概要
Java
Spirit_NKlaus
逆风的方向,更适合飞翔
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java使用OSHI获取服务器信息
OSHI可以获取系统信息(CPU、内存、磁盘、网络等),纯Java实现(通过JNA访问本地API,无需安装本地库),跨平台支持。原创 2025-07-11 13:59:18 · 344 阅读 · 0 评论 -
Java实现简单的异步分批记录日志
项目中日志记录是一个不可或缺的部分,通过自己定义日志信息可以保存方便我们排查问题的日志记录。然而传统的同步日志记录方式可能会在高并发环境下成为性能瓶颈。为了解决这个问题,异步日志记录成为了一种流行的优化手段。编写一个一步日志管理器。原创 2024-08-07 13:38:06 · 398 阅读 · 0 评论 -
Java设计模式——桥连模式
桥接模式简单来说就是通过将抽象部分和具体部分分离,使它们可以独立地变化。如果你的一个类存在多个变化维度(如抽象和具体的实现)。若使用继承来处理这些变化,将会导致类层次结构的急剧增加,难以管理和维护。并且,继承会将抽象部分和具体部分紧密耦合,不利于独立地进行扩展和变化。此时不妨考虑使用桥连模式。假定一个不同的级别信息发送方式的例子。原创 2024-02-29 22:08:13 · 703 阅读 · 0 评论 -
Java设计模式——模板方法模式
当你在设计一个业务功能时,有一些方法/算法的结构是固定的,但其中的某些步骤可能会因不同的情境而发生不同的变化。你希望固定核心结构部分,然后灵活的去定制一些特定的步骤。这个时候可以考虑使用模板方法,通过定义一个抽象的父类,其中包含了方法/算法的核心结构,但某些步骤使用抽象方法或受保护的虚拟方法来表示,这些方法由子类来实现。这使得子类可以在不改变核心方法的同时根据需要重写特定的步骤。父类中的模板方法调用这些步骤,确保算法的整体流程一致。假定一个网课流程的例子。原创 2024-02-26 23:13:11 · 567 阅读 · 0 评论 -
Java设计模式——责任链模式
当一个请求需要在多个对象之间传递,每个对象都可能处理该请求或将其传递给下一个对象。在这种情况下,需要避免将发送者与接收者之间的耦合,以及确定请求的处理方式。此时可使用责任链模式,它的优点有降低耦合度(无需关心哪个对象会处理请求),灵活性(可以动态地改变它们之间的顺序和职责),可扩展性(添加新的处理者,而不会影响现有代码),可维护性(处理者之间职责分开,便于维护);责任链模式也有限制,比如可能导致请求无法被处理或者处理链太长而导致性能问题。假定一个权限认证的例子。二、与建造者模式相结合。原创 2024-02-20 22:22:16 · 1159 阅读 · 0 评论 -
Java设计模式——策略模式
在软件系统可能需要根据不同的情境或条件使用不同的算法或行为,但是这些算法的选择和使用可能会频繁变化。在一个类中或许可以通过一系列的条件判断去区分算法的使用,但是这就会导致代码的臃肿不堪,难以维护和扩展。这时我们需要一种方式来灵活地选择和切换不同的算法。这时就可以考虑策略模式,它的主要优点是实现了算法的解耦,使得算法可以独立于客户端而变化。它提高了代码的可维护性和扩展性,因为新的策略可以很容易地添加到系统中。然而策略模式也可能导致类的数量增加,因为每个算法都需要一个对应的策略类。假定一个支付方式选择例子。原创 2024-02-20 21:47:36 · 858 阅读 · 0 评论 -
自定义Jpa代码生成器
实现方式就是使用freemarker模板技术,预先定义我们需要生成的文件,如entity,dto,dao,service,serviceImpl,controller,然后通过获取数据库中的表和列信息,填充模板中的参数内容最后输出java文件。2、定义一个基础类,基础类中定义了数据库表的共有列字段,如id,更新人,更新时间,审核人,审核时间,审核状态,通过使用@PrePersist注解修饰的方法,每次给更新时间和审核时间设置默认值,业务代码中不需要再做处理。4,数据模型实体,表格信息和列信息。原创 2023-11-24 15:38:52 · 1080 阅读 · 0 评论 -
Java实现树形结构和递归查询
树形结构的数据一般是利用类似于id和parent_id之前的关系来构造,以部门为例,当前部门的信息中需要知道自己的部门编号和上一级的部门编号,才能构造出树形结构的数据,先准备好能够构造树形结构的数据。部门的基础实体和部门树实体。编写一个测试类运行查看效果。原创 2023-11-07 14:10:25 · 712 阅读 · 0 评论 -
Java实现图片添加水印文字
项目中遇到要在图片上添加水印文字,类似于像生日贺卡那种推送,就是有一张底图,然后我们需要动态替换掉上面名字,性别,部门啥的给公司人员推送一个生日祝福,一开始使用富文本和一些html转图片的工具来做,发现效果不佳,许多样式无法识别等等,后来还是决定使用Java自带的Graphics2D来实现,通过坐标来控制位置,但是颜色和字体那些可能没有前端那么丰富,简单分享一下吧。水印实体/** * 水印辅助类 * * @author: YuanXing on 2021/01/16 */@Datapu原创 2021-01-27 09:36:15 · 638 阅读 · 0 评论 -
Java中节点字符串转换,用于SQL排序
在实际开发中我们可能会遇到有节点字段的数据(例如1.1;1.2.1;3.1.2;2.6.3;1.10.1;1.10.1.2),需求中可能还要对节点字段进行升序,或者倒序的排序,这样的话SQL中现成的排序是做不到的,当然可以自己写函数实现,也可以在Java代码中自定义排序方法,我这里建议在我们表字段添加一个节点排序字段(将1.1转换成001001这种类似的字段保存起来便于排序使用),名称你们随意起,知道作用就行,下面写一个字符串转换的方法。public class TestUtil { pub原创 2020-07-07 11:45:55 · 399 阅读 · 0 评论 -
Java中新旧日期时间的使用
最近做项目涉及到时间的计算,这里拿出一个以年为增长的计算,关于日期的计算可以借助Calendar类,其中涉及使用正则去得到字符串中的数字参加计算,顺带一提Pattern类和Matcher类。Pattern类:pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该...原创 2019-08-09 16:29:35 · 2610 阅读 · 0 评论 -
Java中使用Redis生成自增长的单号
redis.set方法详解String set(String key, String value, String nxxx, String expx, long time);该方法是: 存储数据到缓存中,并制定过期时间和当Key存在时是否覆盖。nxxx: 只能取NX或者XX,如果取NX,则只有当key不存在是才进行set,如果取XX,则只有当key已经存在时才进行setexpx: 只能取...原创 2019-02-27 16:51:56 · 4455 阅读 · 0 评论 -
Java设计模式——建造者模式
所谓建造者模式就是将复杂对象的构建过程与其表示分离,使得同样的构建过程可以产生不同的表现形式。例如我们玩游戏时玩家每次游戏可以选择玩不一样的英雄,而这些英雄会有共同的一些属性如,名称,等级,角色,我们每次不用管内部是如何构造英雄的,只需要拿到不同英雄就可以,简单看下的代码。/** * 英雄的实体 */public class Hero { private String n...原创 2019-10-09 15:25:22 · 207 阅读 · 0 评论 -
Java设计模式——单例模式
特点:单例类只能有一个实例单例类必须自己创建自己的唯一实例单例类必须给所有其他对象提供这一实例实现单例模式:饿汉式:在类加载时完成初始化(立即加载),所以线程安全懒汉式:在类加载时不会初始化(延时加载),在多线程的情况下会产生多个single对象静态内部类实现1,饿汉式的两种方式/** * 饿汉式1 */public class Singleton { ...原创 2019-10-07 16:34:11 · 230 阅读 · 0 评论 -
Java设计模式——抽象工厂模式
假设一家4s店卖宝马和大众两种汽车,并且车种分为轿车和卡车两种,像这种工厂产品来自多个等级结构的,简单工厂和工厂方法难以实现需求,这时我们可以使用抽象工厂来实现。下面看一下代码的简单实现;1,先定义轿车和卡车的接口//轿车public interface Sedan { public void run();}//卡车public interface Truc...原创 2019-10-07 14:17:25 · 316 阅读 · 0 评论 -
Java内部类和匿名内部类
一,内部类:类内部的类就是内部类,就是把一个类定义在另一个类中,那么内部的类就是内部类,内部类不能直接创建,创建方式为外部类.内部类 变量名 = new 外部类对象.new 内部类对象内部类的特点:1,本类可以直接创建内部类对象2,内部类对象可以访问外部类的属性和方法package interior;public class TestInner { public stati...原创 2019-08-17 21:31:35 · 175 阅读 · 0 评论 -
Java中final,finally,finalize的区别
一,final修饰符(可作用在类,方法,变量上)1,final 类:final 类不能被继承,没有类能够继承 final 类的任何特性。2,final 方法:类中的 final 方法可以被子类继承,但是不能被子类修改。声明 final 方法的主要目的是防止该方法的内容被修改。3,final 变量:一旦赋值后,不能被重新赋值。被 final 修饰的实例变量必须显式指定初始值。final 修饰符...原创 2019-08-22 11:24:36 · 223 阅读 · 0 评论 -
Java反射
反射:反射机制是在运行状态中1,对于任意一个类都能知道它的所有属性和方法2,对于任意一个对象都能调用它的所有方法和属性反射的功能:1,在运行时判断任意一个对象所属的类2,在运行时构造任意一个类的对象3,在运行时判断任意一个类所具有的的成员变量和方法4,在运行时调用任意一个对象的方法5,生成动态代理获取反射对象的三种方式(Class为反射的入口,本质上讲,一个对象对应的一个不变...原创 2019-08-16 14:13:38 · 232 阅读 · 0 评论 -
Java泛型
为何要使用泛型?首先我们以ArrayList为例,在使用ArrayList的时候常会遇到两个问题1,当获取一个值的时候必须进行强制类型转换2,当向其中放入值的时候没有约束只要是对象就行了所以对数据操作失误便会引起程序报错,于是我们可以使用泛型提供的类型参数来解决这个问题ArrayList<String> arr = new ArrayList<String>();...原创 2019-08-04 21:51:54 · 272 阅读 · 0 评论 -
Java面向对象之重写重载与多态
一,重写(Override):子类对父类允许访问的方法在不改变返回值和形参的重新编写public class Father{ public void skill(){ System.out.println("造导弹"); }}public class Son extends Father{ public void skill(){ super...原创 2019-07-25 17:13:16 · 283 阅读 · 0 评论 -
Java数组插入算法
1,创建一个乱序的数组;2,Arrays.sort()进行升序排序;3,从控制台输入一个新的数字;4,在数组中找到新数字插入的位置;5,把老数组以及新数字放在新数组合适的位置;public static void main(String[] args) { int a[]={14,30,22,46,38}; Arrays.sort(a); Scanner s...转载 2017-09-15 13:30:12 · 607 阅读 · 0 评论 -
Java数组简单使用
一、数组1、数组什么情况使用:当遇到定义大量变量保存相同类型的数据时,使用数组可以大大简化程序。2、数组的声明:类型 数组名 [] ; char c [] ;3、分配空间:数组名 = new 类型 [长度] ; c = new char[5] ;4、数组申明和分配空间可一步进行: char c[] = new char[5] ;5、数组赋值:数组名 [下标] = 变量 ; c ...原创 2017-09-11 13:33:04 · 337 阅读 · 0 评论 -
Java分支结构与循环结构
一、分支结构1、if语句:if语句将根据条件的真假,判断if的从属语句,也就是条件符合才能执行里面的代码。格式:if(条件){处理}2、if-else结构:if-else结构根据一个布尔值的真假来选择做不同的事情,也就是如果..否则..的意思。格式:if(条件){处理1}else{处理2}3、嵌套if语句:在条件内针对真假情况,再指定条件进行判断,形成更多的分支。格式:if(条件){处理1if...原创 2017-09-08 21:49:09 · 504 阅读 · 0 评论 -
Java定时框架quartz简介
我们在写Java程序中经常会写一些定时执行的任务,例如每天执行一次什么方法,几分钟或者几个小时调用一次存储过程等等Quartz的三个核心概念:任务:执行工作的内容,Quartz提供job接口来支持任务定义触发器:定义触发job执行的事件触发规则,Quartz提供Trigger类及其子类支持触发功能调度器:Quartz提供Scheduler接口,将工作任务和触发器绑定,保证任务可以在正确的时...原创 2018-10-25 16:25:26 · 978 阅读 · 0 评论 -
Java中字符串分割
split分割字符串(分隔符如:* ^ : | , . @)单个字符作为分隔符时用\\进行转义,这里以|为例子,(,和@)可以不用String proceName = "my|wo|and|en";String[] proStr = proceName.split("\\|");for(String str : proStr){ System.out.println(st...原创 2018-10-23 18:08:01 · 927 阅读 · 0 评论 -
Java中==和equals(),equalsIgnoreCase()
关于==和equals,我们需要知道java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean他们之间的比较,应用双等号(==),比较的是他们的值。2.复合数据类型(类)当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后...原创 2018-10-23 18:54:59 · 708 阅读 · 1 评论 -
Java中基本数据类型与包装类,字符串转换
存储范围大小:byte-short-char-int-long-float-double低级到高级自动类型转换:int i = 5;float f = i;double d = i;高级到低级强制类型转换:int a = 20;byte b = (byte) a;double d = 2.99;int in = (int) d;基本类型转包装类:...原创 2018-10-24 13:42:21 · 376 阅读 · 0 评论 -
Java集合之List,Set,Map
List:有序,可重复一,List接口的三个典例实现: List list1 = new ArrayList(); 底层数据结构是数组,查询快,增删慢;线程不安全,效率高 List list2 = new Vector(); 底层数据结构是数组,查询快,增删慢;线程安全,效率低,几乎已经淘汰了这个集合 List list3 = new ...原创 2018-12-15 09:51:58 · 294 阅读 · 0 评论 -
Java 静态方法和实例方法的区别
在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。静态方法只能访问静态成员,实例方法可以访问静态和实例成员。之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象。同样,因为实例方法可以访问实例成员变量,如果允许静态方法调用实例方法,...原创 2019-02-28 16:54:16 · 952 阅读 · 0 评论 -
Java中 toString(),(String),String.valueOf 的区别
1,toString()Map<String, String> map = new HashMap<String, String>();map.put("beginDate", "2019-04-29");Object beginDate = map.get("beginDate");if(beginDate!=null&&StringUtil...原创 2019-04-29 10:30:48 · 736 阅读 · 0 评论 -
Java面向对象之抽象类与接口
一,抽象类:如果一个类中没有包含足够的信息来描绘一个具体对象,这样的类就是抽象类抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样抽象类必须被继承才能使用,一个类只能继承一个抽象类Java中使用abstract class来定义抽象类public abstract class Person{ private String n...原创 2019-07-29 17:19:40 · 212 阅读 · 0 评论