多个大底交集工具_开源项目学习笔记(2):工具类库SpringSide Utils

文档:https://github.com/springside/springside4/wiki/SpringSide-Utils-Overview

工具库对开发效率和代码质量的意义其实相当大。

推荐一个我的偶像「江南白衣」开源的工具库 SpringSide Utils,它是对市面上最好的工具库(如Commons Lang,Guava)的选型和封装,让我们只面对这统一的「门面」即可。

江南白衣(主导)出品的最新工具库是 唯品会Java开发基础类库 ,它与SpringSide Utils 一脉相承,但目前我的项目中用的还是SpringSide Utils,唯品会这个库等我回头再学习下。

SpringSide Utils 这个类库有一个缺点:工具类中的工具方法的「方法签名」持续在修改,但版本号一直是5.0.0。这导致了「用较早版本的库进行了开发,但当代码拿到新的环境下去编译,去Maven中央库取得5.0.0的Jar,却出现了『调用的方法出错』」的情况。

不过这只是微小的瑕疵。

下面是我整理的各个包和类的目录,用于方便知道「这个工具类库都有哪些功能啊」。


base包,基本工具系列:

https://github.com/springside/springside4/wiki/Base-Utils

布尔工具BooleanUtil

各种字符串转布尔值,布尔值取反

枚举工具集EnumUtil

枚举类型与long类型的互相转换

关于异常的工具类ExceptionUtil

1. 若干常用函数.

2. StackTrace性能优化相关,尽量使用静态异常避免异常生成时获取StackTrace,及打印StackTrace的消耗

补充一些缺少的参数校验方法的MoreValidate

参数校验统一使用Apache Common Lange Validate, 补充一些缺少的.

对象工具类ObjectUtil

hashCode和toString方法

关于系统设定,平台信息的变量Platforms

分隔符、Java目录、Java版本、操作系统版本

关于Properties的工具类PropertiesUtil

1. 统一读取Properties

2. 从文件或字符串装载Properties

关于系统Properties的工具类SystemPropertiesUtil

1. 统一的读取系统变量,其中Boolean.readBoolean的风格不统一,Double则不支持,都进行了扩展.

2. 简单的合并系统变量(-D),环境变量 和默认值,以系统变量优先,在未引入Commons Config时使用.

3. Properties 本质上是一个HashTable,每次读写都会加锁,所以不支持频繁的System.getProperty(name)来检查系统内容变化 因此扩展了一个ListenableProperties, 在其所关心的属性变化时进行通知.


collection包,容器工具系列:

数组工具类ArrayUtil

JDK Arrays的其他函数,如sort(), toString() 请直接调用

Common Lang ArrayUtils的其他函数,如subarray(),reverse(),indeOf(), 请直接调用

通用Collection的工具集CollectionUtil

判断是否为空/非空,获得第一个/最后一个元素,获得最大/最小的元素

使用扩展容器类型的工具类CommonCollections

联合多个Key来定位Value的HashMap.

创建性能与访问速度更优的微型Map

队列内元素唯一的List, 内部集成了一个HashSet来实现.

ArrayList 与 LinkedList的折衷版

关于List的工具集合ListUtil

1. 常用函数(如是否为空,sort/binarySearch/shuffle/reverse(via JDK Collection)

2. 各种构造函数(from guava and JDK Collection)

3. 各种扩展List类型的创建函数

5. 集合运算:交集,并集, 差集, 补集,from Commons Collection,但对其不合理的地方做了修正

关于Map的工具集合MapUtil

1. 常用函数(如是否为空)

2. 对于并发Map,增加putIfAbsent(返回最终值版), createIfAbsent这两个重要函数(from Common Lang)

3. 便捷的构造函数(via guava,Java Collections,并增加了用数组,List等方式初始化Map的函数)

4. 特殊的类型,包括WeakConcurrentHashMap, IntObjectHashMap, MapCounter, MultiKeyMap, RangeMap

Queue工具集QueueUtil

1.各种Queue,Dequeue的创建

2.特殊类型Queue:LIFO的Stack, LRU的Queue

关于Set的工具集合SetUtil

1. 各种Set的创建函数, 包括ConcurrentHashSet

2. 集合运算函数(交集,并集等,from guava)

线程安全的HashSet类ConcurrentHashSet

JDK并没有提供ConcurrenHashSet,考虑到JDK的HashSet也是基于HashMap实现的,因此ConcurrenHashSet也由ConcurrenHashMap完成。

用于装两个元素的类Pair

引入一个简简单单的Pair, 用于返回值返回两个元素.

自动排序的ArrayList类——SortedArrayList

从Jodd整体复制,部分指定了index的操作不支持,如 add(index, element)

Key为原子类型的集合类IntObjectHashMap

在数据结构上与HashMap不一样,空间占用与读写性能俱比原来更优.

Key为原子类型的集合类LongObjectHashMap

在数据结构上与HashMap不一样,空间占用与读写性能俱比原来更优.


concurrent包,并发工具系列

并发工具类ConcurrentTools

CountDownLatch、CyclicBarrier的工厂方法,及限流、采样工厂。

线程工具类ThreadUtil

不抛出异常的sleep方法,获得调用者/当前方法的类名、方法名。

ThreadLocal上下文ThreadLocalContext

提供简单的put/get方法用于简化ThreadLocal变量的存取

基本Future实现类BasicFuture

从Apache HttpClient 4.2 移植,一个Future实现类的基本框架.

程序触发的ThreadDump——ThreadDumpper

因为ThreadDump本身会造成JVM停顿,所以加上了开关和最少间隔时间的选项(默认不限制)

因为ThreadInfo的toString()最多只会打印8层的StackTrace,所以加上了最大打印层数的选项.(默认为8)

concurrent.jsr166e包(暂时看不懂,搁置)

concurrent.threadpool包,线程池工具类

有队列且线程数可变的线程池QueuableCachedThreadPool

通过控制TaskQueue,线程数,但线程数到达最大时会进入Queue中

线程池建造者类ThreadPoolBuilder

对比JDK Executors中的newFixedThreadPool(), newCachedThreadPool(),newScheduledThreadPool, 提供更多有用的配置项.

JDK Executors中的FixedPool的工作队列无限长,CachedPool的可能线程数无限多

这个建造者类可以为FixedPool设置队列长度,为CachedPool设置线程数。

线程池工具集ThreadPoolUtil

1. 优雅关闭线程池的方法(via guava)

2. 创建可自定义线程名的ThreadFactory(via guava)

3. 防止第三方Runnable未捕捉异常导致线程跑飞


io包,IO工具系列:

文件工具类FileUtil:

「文件读写」静态方法:

读文件到字节数组 / 字符串 / 字符串list

写 / 追加 内容到文件

获得文件的 输入 / 输出 流

「文件及目录操作」静态方法:

复制 / 移动 / 删除 文件(夹)

判断文件(夹)是否存在,获得文件扩展名

文件树遍历工具类FileTreeWalker:

列出指定目录下所有文件(包含或不包含文件夹),可以指定后缀名或通配符

文件路径工具类FilePathUtil:

将文件路径根据运行平台标准化成响应的路径字符串,整理路径,拼接路径名,获得上层目录的路径,获得参数clazz所在的Jar文件的绝对路径

流工具类IOUtil:

从流中读取字符串

向流中写入字符串

从输入流复制到输出流

针对classpath下资源文件的工具类ResourceUtil:

ResourceUtil.toString("application.properties")

兼容的工具集URLResourceUtil:

兼容url为无前缀,file://与classpath:// 三种情况


log包,日志工具

带限流功能的Logger——ThrottledSlf4jLogger

该logger在配置的时间间隔内只输出一条日志。


mapper包,Mapper系列(转换工具):

实体类A到实体类B的属性复制工具类BeanMapper:

映射单个实体 / 实体List / 实体数组

实体类和JSON字符串互相转化的工具类JsonMapper:

实体转JSON

JSON转实体

实体转JSONP

实体类和XML字符串互相转化的工具类XmlMapper:

实体转XML

XML转实体


misc包,ID生成工具:

封装各种生成唯一性ID算法的工具类IdGenerator

可以生成字符串,Long,byte[]


net包,网络工具系列:

IP工具类IPUtil

主要包含int, String/IPV4String, InetAdress/Inet4Address之间的互相转换

关于网络的工具类NetUtil

1. 获取Local Address

2. 查找空闲端口


number包,数字工具系列:

数学相关工具类MathUtil:

2的倍数的计算

其他函数如最大公约数, 乘方,开方,安全的取模,可控制取整方向的相除等。

数字工具类NumberUtil

1.原始类型数字与byte[]的双向转换(via Guava)

2.判断字符串是否数字, 是否16进制字符串(via Common Lang)

3.10机制/16进制字符串 与 原始类型数字/数字对象 的双向转换(参考Common Lang自写)

随机数工具类RandomUtil

1. 获取无锁的ThreadLocalRandom, 性能较佳的SecureRandom

2. 保证没有负数陷阱,也能更精确设定范围的nextInt/nextLong/nextDouble

3. 随机字符串

单位转换工具UnitConverter

将带单位的时间字符串转化为毫秒数.


reflect包,反射工具系列:

https://github.com/springside/springside4/wiki/Reflection

获取Class信息的工具类ClassUtil:

1. 取shortClassName 和 packageName

2. 获取全部父类,全部接口,以及全部Annotation

3. 获取标注了annotation的所有属性和方法

4. 获取方法与属性 (兼容了原始类型的参数, 并默认将方法与属性设为可访问)

5. 其他杂项

基于Cglib, 基于字节码生成的快速反射的工具类FastMethodInvoker

比如反射调用A类的“hello” 方法,cglib会直接生成一个调用a.hello()的FastMethod子类.

基于JDK的反射工具类MethodInvoker

不如上面的FastMethodInvoker快

反射工具类ReflectionUtil

1. 对于构造函数,直接使用本类即可

2. 对于方法调用,本类全部是一次性调用的简化方法,如果考虑性能,对反复调用的方法应使用 MethodInvoker 及 FastMethodInvoker.

3. 对于直接属性访问,恰当使用本类中的一次性调用,和基于预先获取的Field对象反复调用两种做法.


security包,安全工具:

安全工具类CryptoUtil

支持HMAC-SHA1消息签名 及 DES/AES对称加密的工具类.

摘要、签名、加密中,这个工具类提供签名和加密功能。摘要的功能由工具类HashUtil提供,见「文本工具」。


text包,文本工具:

https://github.com/springside/springside4/wiki/Text

编码常量类Charsets

提供Charsets.UTF_8 这样的常量

csv工具类CsvUtil

对象集合转csv,csv一行转字符数组

编码工具类EncodeUtil

Hex和Base64的编码解码,Base64的编码解码方法有URL安全的方法

转义工具类EscapeUtil

URL、XML、HTML的编码解码

Hash工具类HashUtil

1.SHA-1, 安全性较高, 返回byte[](可用Encodes进一步被编码为Hex, Base64)

MD5的安全性较低, 只在文件Checksum时支持.

crc32, murmur32这些不追求安全性, 性能较高, 返回int.

对StringUtils补充一些方法的MoreStringUtil

高性能的Split,单独replace first/last,判断字符串是否以字母开头 / 结尾,如果结尾字符为c, 去除掉该字符.,计算字符串被UTF8编码后的字节数

StringBuilder持有类StringBuilderHolder

通过StringBuilderHolder.getGlobal获得线程唯一的StringBuilder,能提升性能

文本校验工具TextValidator

通过正则表达判断是否正确的手机号,固定电话,身份证,邮箱等.

通配符匹配检验工具WildcardMatcher

验证给定字符串是否符合通配符表达式


time包,日期时间工具

缓存了的日期格式化工具类CachingDateFormatter

DateFormat.format()消耗较大,如果时间戳是递增的,而且同一单位内有多次format(),使用用本类减少重复调用.

日期提供者ClockUtil

使用它而不是直接取得系统时间, 方便测试,能获得系统当前时间、系统当前时间戳、操作系统启动到现在的纳秒数。

日期格式化工具DateFormatUtil

更好的Date的parse()与format(),及格式化时间间隔

日期工具类DateUtil

日期比较,日期往前往后滚动,直接设置时间字段,获取日期的位置(如是在一周的第几天),获得往前往后的时间(如当天第一秒),闰年及每月天数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值