java.util
工具类 | 主要方法 | 说明 |
Objects | isNull、nonNull | 判断空对象 |
requireNonNull | 在对象为空时,抛出空指针异常 | |
equals | 判断两个对象是否相等(有坑,慎用) | |
hashCode | 获取某个对象的hashCode | |
Collections | sort & binarySearch | sort 底层使用的就是 Arrays.sort 方法,binarySearch 底层是自己重写了二分查找算法 |
max、min | 最大/最小值 | |
singletonList | 返回一个只能存放一个元素的List | |
emptyList | 在判空之后,需要返回空集合,就可以使用emptyList方法 | |
synchronizedList、 synchronizedMap、 synchronizedSet | java中的很多集合,比如:ArrayList、LinkedList、HashMap、HashSet等,都是线程不安全的。 将这些线程不安全的集合,直接转换成线程安全集合 | |
Arrays | fill | 给数组赋值 |
sort | 对数组排序 | |
equals | 数组比较 | |
stream | 流操作。 数组求和:Arrays.stream(arr).sum(); 获取数组最大值:Arrays.stream(arr).max().getAsInt(); | |
binarySearch | 能对排序好的数组进行二分查找 | |
asList | 将数组转化成List集合。注意:用此方法得到的List的长度是不可变的。 |
org.springframework
工具类 | 主要方法 | 说明 |
ClassUtils | getAllInterfaces | |
getPackageName | ||
BeanUtils | copyProperties | 将一个JavaBean所有属性赋值给另一个JavaBean对象中 |
instantiateClass | 实例化某个类 | |
ReflectionUtils | ||
Base64Utils | encode、decode | |
SerializationUtils | serialize、deserialize | 把数据进行序列化和反序列化处理 |
Apache Common
Apache Commons(org.apache.commons)是对JDK的拓展,包含了很多开源的工具。
工具类 | 主要方法 | 说明 |
ObjectUtils | defaultIfNull | 如果对象为空,则返回默认值。 |
allNotNull | 检查多个对象是否都不为空。如果所有对象都不为空,则返回true;否则返回false。 | |
StringUtils | isBlank、isNotBlank | 是否为null、是否为""、是否为空字符串(引号中间有空格)" "、制表符、换行符、换页符和回车。 |
isEmpty、isNotEmpty | 没有忽略空格参数,是以是否为空和是否存在未判断依据。 | |
equals() | 字符串比较 | |
isNumeric | 是否为纯数字 | |
join | 拼接字符串 | |
contains | 包含字符串 | |
ArrayUtils | isEmpty、isNotEmpty | |
contains | ||
add、addAll | 添加数组元素/数组 | |
clone | ||
BoolUtils | isTrue、isFlase | |
isNotTrue isNotFlase | ||
CollectionUtils | isEmpty、isNotEmpty | 非空判断 |
countMatches | 匹配数 | |
exists | 是否存在 | |
union | 并集 | |
IOUtils | write | |
copy | ||
toByteArray | ||
DigestUtils | md5Hex | md5加密 |
sha256Hex | sha256加密 | |
BeanUtils | copyProperties | 将一个JavaBean所有属性赋值给另一个JavaBean对象中 |
populate | 将一个Map集合的数据封装到一个JavaBean对象中 | |
getProperty setProperty | 对JavaBean的属性进行赋值和取值 | |
StopWatch | start stop createStarted getTime | 传统的计时方式使用System.currentTimeMillis()来实现,但是其操作相对繁琐,不够灵活。 StopWatch类提供了更方便、更灵活的计时功能,能够精确地计算程序的运行时间,并且还提供了暂停、恢复、重置和获取切点时间的功能 |
Pair | getLeft getRight of | 配对,抽象基类,实现了Map.Entry接口 |
MutablePair | 可变配对 | |
ImmutablePair | 不可变配对 | |
Triple | getLeft getRight getMiddle of | 三组数据,抽象基类 |
MutableTriple | 可变的 | |
ImmutableTriple | 不可变的 |
Google Guava
Guava工程包含了若干被Google的 Java项目广泛依赖的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。 所有这些工具每天都在被Google的工程师应用在产品服务中。在很多我们使用的框架中几乎每个框架都会用到Guava,Guava包含的工具类丰富,是每个Java程序员都必须要熟练掌握的技能。
集合工具类
Guava 提供了一些常用的集合计算工具类,可以帮助开发者轻松地对集合进行计算和操作。
- Iterators类:提供了一些静态方法,用于对迭代器进行操作,如转换、过滤、合并等。
- Lists类:提供了一些静态方法,用于对列表进行操作,如反转、拆分、排序等。
- Sets类:提供了一些静态方法,用于对Set进行操作,如取交集、并集、差集等。
- Maps类:提供了一些静态方法,用于对Map进行操作,如转换、合并、排序等。
- Multisets类:提供了一些静态方法,用于对多重集合进行操作,如计算元素出现的次数、取交集、并集等。
- Multimaps类:提供了一些静态方法,用于对多重映射进行操作,如计算键值对数量、转换、合并等。
工具类 | 主要方法 | 说明 |
Lists | newArrayList | 创建空集合/初始化集合 |
partition | 分页 | |
reverse | 颠倒顺序 | |
transform | 流处理。例如: List<String> list = Lists.newArrayList("a","b","c"); List<String> transformList = Lists.transform(list, x -> x.toUpperCase()); | |
Maps | newHashMap | 创建空集合/初始化集合 |
Sets | newHashSet | 创建空集合/初始化集合 |
union | 求并集 | |
intersection | 求交集 | |
filter | 过滤 | |
Iterables |
Multimap(多图)
参考资料:https://www.python100.com/html/79323.html
Multimap是Google Guava提供的一个数据结构,它可以保存一个key对应多个value的映射关系,可以在使用Map <K,Collection <V >>的地方实现。
Multimap提供了多个实现类,包括ArrayListMultimap
、
HashMultimap
、LinkedListMultimap、LinkedHashMultimap和TreeMultimap,它们的实现方式不同,在不同的场景下选择不同的实现类可以提高性能。
多图的优点:
- 借助函数“put”添加键值对之前,无需填充空集合。
- 除了空集合的情况外,“get”方法不会返回null。
- 当且仅当键已映射到至少一个值时,该键才会出现在Multimap中。
- 如果多图中的键没有关联值,则将从多图中隐式删除该键。
- 可以通过函数“大小”获得多图中的值数。
Range(区间)
Range是Guava提供的一个类,用于表示一个不可变的范围,或者说是区间。这个区间可以是任何Comparable类型,比如整数、浮点数,甚至是日期。
Range常用的方法:
Range<Integer> range1 = Range.closed(1, 5); // 闭区间,包含1和5
Range<Integer> range2 = Range.open(1, 5); // 开区间,不包含1和5
Range<Integer> range3 = Range.greaterThan(10); // 大于10
Range<Integer> lessThanFive = Range.lessThan(5); // (-∞, 5)
Range<Integer> upToFive = Range.atMost(5); // (-∞, 5]
boolean isInRange = range.contains(5); // 判断5是否在这个区间内
boolean isConnected = range1.isConnected(range2); // 判断range1和range2是否相连
Range<Integer> intersection = range1.intersection(range2); // 获取range1和range2的交集
Range<Integer> span = range1.span(range2); // 获取range1和range2的并集
Table
Guava的Table是一种特殊的数据结构,它允许你使用两个键(通常被称为行键和列键)来映射一值你可以将Table视为一个二维的Map,其中每个单元格都由行键和列键唯一确定,并存储一个值。
Guava提供了几种Table的实现类,每种都有其特定的用途和性能特点:
- HashBasedTable:这是最常用的实现,它基于哈希表来存储数据。HashBasedTable提供了快速的插入、查找和删除操作,并且不保证任何特定的键顺序。
- TreeBasedTable:这个实现基于红黑树,它根据键的自然顺序或者提供的比较器对行键和列键进行排序。TreeBasedTable在按键顺序遍历数据时非常高效,但插入和查找操作可能比哈希表慢。
- ImmutableTable:这是一个不可变的Table实现,它在创建时接收所有数据,并且之后不允许修改。ImmutableTable对于需要共享或发布不可变数据集的情况非常有用,同时它提供了高效的内存使用。
常用示例:
// 创建一个Table实例
Table<String, String, Integer> workHoursTable = HashBasedTable.create();
// 检索数据
Integer aliceProjectAHours = workHoursTable.get("Alice", "ProjectA");
// 使用row()方法获取特定行的映射
Map<String, Integer> aliceWorkHours = workHoursTable.row("Alice");
// 使用column()方法获取特定列的映射
Map<String, Integer> projectAWorkHours = workHoursTable.column("ProjectA");
// 遍历表格
for (Table.Cell<String, String, Integer> cell : workHoursTable.cellSet()) {
System.out.println(cell.getRowKey() + " worked " + cell.getValue() + " hours on " + cell.getColumnKey() + ".");
}
// 修改数据
workHoursTable.put("Alice", "ProjectA", aliceProjectAHours + 5); // Alice在ProjectA上多工作了5小时
// 检查是否包含某个键值对
boolean hasBobOnProjectB = workHoursTable.contains("Bob", "ProjectB");
// 检查行键或列键是否存在
boolean hasRowKeyCharlie = workHoursTable.containsRow("Charlie");
boolean hasColumnKeyProjectD = workHoursTable.containsColumn("ProjectD");
// 获取所有的行键、列键或值
Set<String> allRowKeys = workHoursTable.rowKeySet();
Set<String> allColumnKeys = workHoursTable.columnKeySet();
Set<Integer> allValues = workHoursTable.values();
// 移除数据
workHoursTable.remove("Alice", "ProjectB"); // Alice不再在ProjectB上工作
Immutable(不可变)集合
参考资料:https://www.kancloud.cn/digest/guava/154022
Guava提供了对JDK里标准集合类里的immutable版本的简单方便的实现,以及Guava自己的一些专门集合类的immutable实现。为什么需要构建一个不可变的对象?原因有以下几点:
- 在并发程序中,使用Immutable既保证线程安全性,也大大增强了并发时的效率(跟并发锁方式相比)。尤其当一个对象是值对象时,更应该考虑采用Immutable方式;
- 被不可信的类库使用时会很安全;
- 如果一个对象不需要支持修改操作(mutation),将会节省空间和时间的开销;经过分析,所有不可变的集合实现都比可变集合更加有效地利用内存;
- 可以当作一个常量来对待,并且这个对象在以后也不会被改变。
Immutable集合创建方法:
- 用copyOf方法, 譬如, ImmutableSet.copyOf(set)
- 使用of方法,譬如,ImmutableSet.of("a", "b", "c")或者ImmutableMap.of("a", 1, "b", 2)
- 使用Builder类
Jackson
参考资料:Java序列化之Jackson详解 - 上善若泪 - 博客园
Jackson和Fastjson都是比较出名的JSON解析库,SpringMVC默认使用的是Jackson,而且在企业项目中也大多使用的是Jackson。Jackson主要由三个核心包组成:
- jackson-databind:提供了通用的数据绑定功能(将Java对象与JSON数据相互转换)
- jackson-core:提供了核心的低级JSON处理API(例如JsonParser和JsonGenerator)
- jackson-annotations:提供了用于配置数据绑定的注解
ObjectMapper
这是Jackson库的核心类,用于序列化和反序列化操作。主要方法有:
- writeValueAsString(Object):将Java对象序列化为JSON字符串
- readValue(String, Class):将JSON字符串反序列化为Java对象
- setDateFormat(new SimpleDateFormat("yyyy-MM-dd")):处理Java日期和时间类型
JsonNode
用于表示JSON树模型中的节点,可以是对象、数组、字符串、数字等。主要方法有:
- get(String):获取指定字段的子节点。
- path(String):获取指定字段的子节点,如果不存在则返回一个“missing”节点。
- isObject():检查当前节点是否是一个对象。
- isArray():检查当前节点是否是一个数组。
JsonGenerator
用于将JSON数据写入数据源(如文件、输出流或字符串缓冲区)。主要方法有:
-
- writeStartObject():写入开始对象标记({)。
- writeFieldName(String):写入字段名称。
- writeString(String):写入字符串值。
- writeEndObject():写入结束对象标记(})。
注解
Jackson提供了一系列注解来配置序列化和反序列化过程。一些常用注解包括:
@JsonProperty:指定字段在JSON数据中的名称。
@JsonIgnore:指定字段在序列化和反序列化过程中被忽略。
@JsonCreator:指定用于反序列化的构造函数或工厂方法。
@JsonSerialize:指定用于序列化特定字段或类的自定义序列化器。
@JsonDeserialize:指定用于反序列化特定字段或类的自定义反序列化器。
定制Jackson(Jackson2ObjectMapperBuilderCustomizer)
参考资料:Spring Boot2中如何优雅地个性化定制Jackson - 八卦程序 - 博客园
Fastjson
也被称为 Alibaba FastJSON 或阿里巴巴 JSON,是一个高性能的 Java JSON 处理库,用于在 Java 应用程序中解析和生成 JSON 数据。FastJSON 以其卓越的性能和功能丰富的特点而闻名,并在阿里巴巴的开源项目和其他许多 Java 应用程序中广泛使用。它采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson。
JSON类
JSON类是JSONObject和JSONArray抽象基类,里面提供了大量静态方法。
方法 | 描述 |
JSON.toJSONString() | 序列化 |
JSON.parseObject() | 反序列化 1、JSON串 --> JSONObject JSONObject jsonObj = JSON.parseObject(jsonStr); 2、JSON串 --> Java 对象 Order order = JSON.parseObject(jsonStr, Order.class); 3、JSON串 --> Java 对象(带泛型) ResultDTO<OrderDTO> result = JSON.parseObject(jsonStr, new TypeReference<ResultDTO<OrderDTO>>() {}); |
JSON.parseArray() | 将 JSON 数组字符串解析为 Java 数组。 1、JSON串 --> JSONArray JSONArray jsonArray = JSON.parseArray(jsonStr); 2、JSON串 --> List List<Order> orderList = JSON.parseArray(jsonStr, Order.class); List<Order> orderList = JSON.parseArray(JSON.toJSONString(list), Order.class); 3、List --> JSONArray JSONArray array = JSON.parseArray(JSON.toJSONString(list)); |
JSON.toJSON() | 将Java 对象转换为 JSON 对象(JSONObject)。 |
JSON.isValid() | 检查 JSON 字符串是否合法。 |
JSONObject类
JSONObject 实现 Map 接口,而且定义了一个map字段,在初始化的时候可根据是否需要有序来初始化为 LinkedHashMap 或者 HashMap
JSONObject 相当于一个 Map,当操作 JSONObject 的时候,其实是调用了Map的方法
方法 | 描述 |
containsKey () | 是否包含指定的键。 |
keySet () | 获取 JSON 对象的键集合。 |
values () | 获取 JSON 对象的值集合。 |
remove () | 从 JSON 对象中删除指定的键。 |
clear () | 清空 JSON 对象中的所有键值对。 |
isEmpty () | 检查 JSON 对象是否为空。 |
clear () | 清空 JSON 对象中的所有键值对。 |
get () | 获取 JSON 对象中的属性值。
|
putIfAbsent () | 如果不存在键,则向 JSON 对象添加键值对。 |
put() | 向 JSON 对象添加键值对。 |
putAll () | 向 JSON 对象中添加键值对。 |
size () | 获取 JSON 对象的元素数量。 |
containsValue () | 检查 JSON 对象是否包含指定的值。 |
putAll () | 清空 JSON 对象中的所有键值对。 |
getInnerMap () | 用于对象转Map。 OrderDTO orderDTO = new OrderDTO("1001", "Alice", "1"); Map<String, Object> innerMap = JSON.parseObject(JSON.toJSONString(orderDTO)).getInnerMap(); |
JSONArray类
用于表示 JSON 数组。它继承自 java.util.ArrayList,因此具有 ArrayList 的所有方法,同时还提供了一些专门用于处理 JSON 数据的方法。以下是 JSONArray 的一些常用方法:
1,add(Object obj): 向数组中添加一个元素。
2,add(int index, Object obj): 在指定索引位置插入一个元素。
3,remove(int index): 删除指定索引位置的元素。
4,size(): 获取数组的长度(即元素个数)。
5,isEmpty(): 判断数组是否为空。
6,get(int index): 获取指定索引位置的元素。
7,set(int index, Object obj): 设置指定索引位置的元素值。
8,contains(Object obj): 判断数组中是否包含指定的元素。
9,indexOf(Object obj): 获取指定元素的索引位置,如果不存在则返回 -1。
10,toList(): 将数组转换为 Java 中的 List 对象。
11,toString(): 将数组转换为 JSON 字符串表示形式。
12,toJSONString(): 将数组转换为 JSON 字符串表示形式,使用双引号括起来。
13,parseArray(String text): 将 JSON 字符串转换为 JSONArray 对象。
14,parseArray(String text, Class<?> clazz): 将 JSON 字符串转换为指定类型的 JSONArray 对象。
15,parseArray(Map<String, ?> map): 将 Map 对象转换为 JSONArray 对象。
16,parseArray(Collection<?> collection): 将集合对象转换为 JSONArray 对象。
17,fromObject(Object obj): 将 Java 对象转换为 JSONArray 对象。
18,toJavaList(Class<?> clazz): 将 JSONArray 对象转换为指定类型的 Java List 对象。
19,toJavaArray(Class<?> clazz): 将 JSONArray 对象转换为指定类型的 Java Array 对象。
TypeReference类
参考资料:https://juejin.cn/post/6885180672428900365
TypeReference是Java中的一个工具类,主要用于描述复杂泛型的信息。 在使用fastJson库进行泛型反序列化时,TypeReference的用途尤为明显。例如,在处理JSON对象到Java对象的映射时,如果JSON对象包含泛型列表或其他复杂数据结构,TypeReference可以帮助明确指定反序列化的类型,从而确保数据被正确地映射到Java对象中。
具体来说,TypeReference通过getActualTypeArguments方法获取泛型类型的实际参数,这些参数是泛型类或接口定义中的类型变量在实际使用时被替换的具体类型。这个过程涉及到对泛型信息的反射和缓存处理,以确保在反序列化时能够准确地应用这些类型信息。
此外,TypeReference的使用不仅仅局限于fastJson库,它还可以与Jackson一起使用,通过提供子类实例来获取完整的泛型类型信息。例如,在使用Jackson库时,可以通过ObjectMapper的readValue方法,并传入一个TypeReference子类实例,来实现对泛型对象的反序列化。