随笔分类 - java
关于java语言的博客
摘要:前言 今天使用美团外卖时,发现可以按照距离对商家进行排序,就想研究一下地图上的两个点之间的距离是如何计算出来的。 原理 假设地球上有A(ja,wa),B(jb,wb)两点,根据经纬度计算球面距离的公式为 R 地球半径 arccos 反余弦函数 cos 余弦函数 sin 正弦函数 ja,jb A和B的
阅读全文
摘要:前言 DNS(Domain Name System)域名系统,因为访问一台服务器只能通过IP来访问,所以需要先将域名转换成IP地址。 解析流程 以chrome浏览器访问mail.baidu.com网址为例, 检查浏览器缓存中是否存在该域名对应的IP,如果存在则解析结束,否则继续。 检查操作系统的ho
阅读全文
摘要:例子代码 public class Client { public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(() -> { System.out.println(
阅读全文
摘要:简介 在项目中我们有时候会有创建复杂PDF的需求,如订单合同,今天我们使用itext工具来实现此功能。 实现 maven依赖 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version
阅读全文
摘要:简介 今天看到其他图片处理工具的打码功能,就想使用java实现一下,可以对指定区域打码。 实现 原图 打码后的图 代码实现 import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; im
阅读全文
摘要:前言 对于Maven项目,不需要使用IDEA的jar包导出功能,直接package就行。 创建Artifacts 选择打包类型为jar 配置MainClass MainClass为jar运行的启动类,包含main方法。 也会自动生成MANIFEST.MF文件,可以看做jar包的描述文件,MainCl
阅读全文
摘要:左移(<<) 将一个数对应的二进制表示整体左移,不考虑符号位,左边超出的部分舍弃,右边补零。 正数 以数字10为例,二进制表示为 00000000 00000000 00000000 00001010 第一位为符号位,0表示正数,1表示负数。左移1位之后为 00000000 00000000 000
阅读全文
摘要:前言 Objenesis是一个小的java库,主要用来实例化类对象,java本身仅支持通过构造器实例化,实例化时必须使用合适的构造器,但有些情况下不能使用这种方式实例化: 构造器需要参数 构造器有副作用 构造器会抛异常 一些常见的类库都要求类包含一个默认的无参构造器,而Objenesis可以绕过构造
阅读全文
摘要:前言 在看objenesis(一个提供多种实例化对象的方式的库)的源码时,发现其中使用到了ReflectionFactory类,它会绕过构造器来实例化对象,且会跳过类成员变量的初始化。 简单使用 使用反射实例化对象 import java.lang.reflect.Constructor; publ
阅读全文
摘要:前言 Unsafe类位于sun.misc包下,它是java实现高并发的基础,通过它可以执行一些不安全的操作,如像C语言一样直接操作内存资源, 它提供的这些方法增强了java对底层资源的操作能力,但同时也增加了程序出错的风险,所以对它的使用一定要慎重。 核心功能介绍 Unsafe提供的API大致可分为
阅读全文
摘要:简单使用 import java.util.function.Consumer; public class TestLambda { public static void main(String[] args) { Consumer<String> consumer = System.out::pr
阅读全文
摘要:死锁定义 线程死锁描述的是这样一种情况:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。 由于线程被无限期地阻塞,因此程序不可能正常终止。如下图所示,线程 A 持有资源 2,线程 B 持有资源 1, 它们同时都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态。 产生死锁的4
阅读全文
摘要:前言 jsr305是一个规范,具体来说是一套用来给代码分析工具(如IDEA)检查代码缺陷用的注解,类似jsr303(Bean Validation规范)。今天在学习Spring源码时,发现其中使用到了jsr305中的注解。 Spring中的NonNull注解中使用到了jsr305中的Nonnull注
阅读全文
摘要:定义 表示一个作用于某对象结构中的各元素的操作,它使得可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 结构 Visitor,访问者接口,每个具体元素类对应一个访问操作,参数类型标识了被访问的具体元素。 ConcreteVisitor,具体的访问者对象,实现了访问者接口。 Element,
阅读全文
摘要:定义 将抽象部分和它的实现部分分离,使它们都可以独立地变化。在现实生活中,某些类有两个或多个维度的变化, 如图形既可以按形状分,又可以按颜色分,如何画不同形状不同颜色的图形呢,如果用继承方式,m 种形状 n 种颜色的图形就有 m * n 种, 不但对应的子类很多,而且扩展困难,桥接模式就能很好的解决
阅读全文
摘要:桥接方法 定义 在源方法和目标方法之间创建一个中间层,通常作为泛型的类型擦除过程的一部分。 第一个例子 public class Person implements Comparable<Person> { @Override public int compareTo(Person o) { ret
阅读全文
摘要:定义 使每个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求, 直到有一个对象处理它为止。如公司员工请假,可以批假的领导有部门负责人、副总经理、总经理等,但每个领导可以批准的天数不同, 员工只需要提交申请,不需要知道最终由谁批准。 结构
阅读全文
摘要:定义 动态地给一个对象添加一些额外的功能,就增加功能来说,装饰者模式比生成子类更为灵活。 如我们生活中的早餐煎饼,可以加鸡蛋,加香肠,加蔬菜,可以很灵活的组合。 结构 Component,抽象组件,定义为一个接口来规范被装饰的对象。 ConcreteComponent,具体的组件对象,实现组件接口,
阅读全文
摘要:定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。这里的文法就是语言的语法规则。 结构 AbstractExpression,抽象解释器角色,定义解释器的接口,约定解释器的解释操作。 TerminalExpression,终结符解释器,用来实现语法
阅读全文
摘要:定义 运用共享技术有效地支持大量细粒度的对象。如围棋中的黑白棋子,教室中的凳子和桌子,这些对象有很多相似的地方, 如果将其中相同的地方提取出来共享,就能节省大量的系统资源,这就是享元模式的适用场景。 结构 Flyweight,享元接口,可以接收并作用于外部数据。 ConcreteFlyweight,
阅读全文