# 工具类

返回:源码

# 排名前16的工具类

# org.apache.commons.lang3

# org.springframework.util

# java.util——Collection

返回顶部

# java.util——字符串格式化操作Formatter

说明符 适用于 输出
%a 浮点数 (除了BigDecimal) 浮点数的十六进制输出
%b 任何类型 如果为非空则为“true”,为空则为“false”
%c 字符 Unicode字符
%d 证书(包括byte, short, int, long, bigint) 十进制整数
%e 浮点数 科学计数的十进制数
%f 浮点数 十进制数
%g 浮点数 十进制数,根据值和精度可能以科学计数法显示
%h 任何类型 通过hashCode()方法输出的16进制数
%n 平台相关的换行符
%o 整数(包括byte, short, int, long, bigint) 八进制数
%s 任何类型 字符串
%t 日期/时间 (包含long, Calendar, Date 和TemporalAccessor) %t是日期/时间转换的前缀。后面还需要跟其他的标识,请参考下面的日期/时间转换。
%x 整数(包含byte, short, int, long, bigint) 十六进制字符串

# 具体日期和时间格式

注意:使用 “%T” 替换下面的“%t”可以将输出结果变成大写形式。

标识 注释
%tA 星期几的全名,例如 “Sunday“, “Monday“。
%ta 星期几的缩写,例如 “Sun“, “Mon“。
%tB 月份的全名,例如 “January“, “February“。
%tb 月份的缩写,例如 “Jan“, “Feb“。
%tC 年的世纪部分的格式为两位数,从 “00“到“99”。
%tc 日期和时间的格式为 “%ta %tb %td %tT %tZ %tY” 如 “Fri Feb 17 07:45:42 PST 2017“。
%tD 格式为 “%tm/%td/%ty“ 的日期。
%td 两位的日期格式,从 “01”到 “31“。
%te 没有前导0的日期,从 “1” 到 “31”。
%tF 使用 “%tY-%tm-%td“ 格式的 ISO 8601 日期。
%tH 24小时制的小时,从 “00” 到 “23“。
%th 同 %tb。
%tI 12小时制的小时,从 “01” 到 “12“。
%tj 带前导0的年中的日期,从 “001” 到“366“。
%tk 没有前导0的24小时制,从 “0” 到 “23“。
%tl 没有前导0的12小时制,从 “1” 到“12“。
%tM 带前导0的分钟,从 “00” 到“59“。
%tm 带前导0的月份,从 “01” 到 “12“。
%tN 带前导0的9位纳秒数,从 “000000000” to “999999999”.
%tp 和区域相关的 “am” or “pm” 标记。
%tQ 1970年1月1日00:00:00 UTC 以来的毫秒。
%tR 24小时制的时间,如:“%tH:%tM“。
%tr 2位数字格式的秒,从 “00” 到 “60”。 “60” 需要支持闰秒。
%ts 1970年1月1日00:00:00 UTC以后的秒数。
%tT 24小时制的时分秒,如: “%tH:%tM:%tS“。
%tY 4位的年份格式,从 “0000” 到 “9999“。
%ty 2位的年份格式,从 “00” 到 “99“。
%tZ 时区缩写,如:“UTC“, “PST“。
%tz 与GMT的时区偏移量,如 -0800。

# 参数索引

参数索引是以 $结尾,在%后面的数字,用于指定在参数列表中的参数。 参数索引从 1 开始。

String.format("%2$s", 32, "Hello"); // 输出:"Hello"
1

# 格式化整数

使用%d格式说明符,您可以使用所有整数类型的参数,包括byte,short,int,long 和BigInteger。默认格式:

String.format("%d", 93); // 输出:93
1
  • 指定宽度:
String.format("%20d", 93); // 输出:|                  93|
1
  • 指定宽度内的左对齐:
String.format("%-20d", 93); // 输出:|93                  |
1
  • 用零填充:
String.format("%020d", 93); // 输出:|00000000000000000093|
1
  • 用”+”号打印正数(负数总是包含”-“):
String.format("%+20d", 93);  // 输出:|                 +93|
String.format("%+20d", -93); // 输出:|                 -93|
1
2
  • 正数之前的空格,按正常值计算负数的“-”。
String.format("% d", 93);  // 输出:| 93|
String.format("% d", -36); // 输出:|-36|
1
2
  • 使用和区域相关的千位分隔符,美国的是“,”:
String.format("%,d", 10000000); // 输出:|10,000,000|
1
  • 中国的也一样:
String.format(Locale.CHINA, "%,d", 10000000)// 输出:|10,000,000|
1
  • 使用左边括号括起来可以跳过“-”。
String.format("%(d", -36); // 输出:|(36)|
1
  • 八进制输出。
String.format("%o"), 93); // 输出:135
1
  • 十六进制输出。
String.format("%x", 93); // 输出:5d
1
  • 八进制和十六进制输出的替代表示。

带前导0的八进制和带前导”0x“的十六进制输出:

String.format("%#o", 93); // 输出:0135
String.format("%#x", 93); // 输出:0x5d
String.format("%#X", 93); // 输出:0X5D
1
2
3

# 字符串和字符转换

默认格式。

  • 打印整个字符串。
String.format("%s", "Hello World"); // 输出:"Hello World"
1
  • 指定字段长度。
String.format("%20s", "Hello World"); // 输出:|         Hello World|
1
  • 左对齐文本。
String.format("%-20s", "Hello World"); // 输出:|Hello World         |
1
  • 指定最大字符数。
String.format("%.5s", "Hello World"); // 输出:|Hello|
1
  • 指定宽度和最大字符数。
String.format("%20.5s", "Hello World"); // 输出:|               Hello|
1

# 再见 BeanUtils对比 12 种 Bean 自动映射工具,就它性能最拉跨

用于对象属性转换

有12种,包括:普通的getset、json2Json、Apache属性拷贝、Spring属性拷贝、bean-mapping、bean-mapping-asm、BeanCopier、Orika、Dozer、ModelMapper、JMapper、MapStruct

BeanUtils.copyProperties

BeanUtils.copyProperties 是大家代码里最常出现的工具类,但只要你不把它用错成 Apache 包下的,而是使用 Spring 提供的,就基本还不会对性能造成多大影响。

p

# get\set

  • 推荐:★★★☆☆
  • 性能:★★★★★
  • 手段:手写

# json2Json

  • 推荐:☆☆☆☆☆
  • 性能:★☆☆☆☆
  • 手段:把对象转JSON串,再把JSON转另外一个对象

# Apache copyProperties

  • 推荐:☆☆☆☆☆
  • 性能:★☆☆☆☆
  • 手段:Introspector 机制获取到类的属性来进行赋值操作
  • 点评:有坑,兼容性交差,不建议使用

# Spring copyProperties

  • 推荐:★★★☆☆
  • 性能:★★★★☆
  • 手段:Introspector机制获取到类的属性来进行赋值操作
  • 点评:同样是反射的属性拷贝,Spring 提供的 copyProperties 要比 Apache 好用的多,只要你不用错,基本不会有啥问题。
@Component
public class SpringCopyPropertiesAssembler implements IAssembler<UserVO, UserDTO> {

    @Override
    public UserDTO sourceToTarget(UserVO var) {
        UserDTO userDTO = new UserDTO();
        BeanUtils.copyProperties(var, userDTO);
        return userDTO;
    }
}
1
2
3
4
5
6
7
8
9
10

# Bean Mapping

  • 推荐:★★☆☆☆
  • 性能:★★★☆☆
  • 手段:属性拷贝

# Bean Mapping ASM

  • 推荐:★★★☆☆
  • 性能:★★★★☆
  • 手段:基于ASM字节码框架实现
  • 点评:与普通的 Bean Mapping 相比,性能有所提升,可以使用。

# BeanCopier

@Component
public class BeanCopierAssembler implements IAssembler<UserVO, UserDTO> {

    @Override
    public UserDTO sourceToTarget(UserVO var) {
        UserDTO userDTO = new UserDTO();
        BeanCopier beanCopier = BeanCopier.create(var.getClass(), userDTO.getClass(), false);
        beanCopier.copy(var, userDTO, null);
        return userDTO;
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
  • 推荐:★★★☆☆
  • 性能:★★★★☆
  • 手段:基于CGlib字节码操作生成get、set方法
  • 点评:整体性能很不错,使用也不复杂,可以使用

# Orika

# Dozer

# ModelMapper

@Component
public class ModelMapperAssembler implements IAssembler<UserVO, UserDTO> {

    private static ModelMapper modelMapper = new ModelMapper();

    static {
        modelMapper.addMappings(new PropertyMap<UserVO, UserDTO>() {
            @Override
            protected void configure() {
                // 属性值不一样可以自己操作
                map().setUserId(source.getUserId());
            }
        });
    }

    @Override
    public UserDTO sourceToTarget(UserVO var) {
        return modelMapper.map(var, UserDTO.class);
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  • 官网:http://modelmapper.org
  • 推荐:★★★☆☆
  • 性能:★★★☆☆
  • 手段:基于ASM字节码实现
  • 点评:转换对象数量较少时性能不错,如果同时大批量转换对象,性能有所下降

# JMapper

JMapper<UserDTO, UserVO> jMapper = new JMapper<>(UserDTO.class, UserVO.class, new JMapperAPI()
        .add(JMapperAPI.mappedClass(UserDTO.class)
                .add(JMapperAPI.attribute("userId")
                        .value("userId"))
                .add(JMapperAPI.attribute("userNickName")
                        .value("userNickName"))
                .add(JMapperAPI.attribute("createTime")
                        .value("createTime"))
        ));
1
2
3
4
5
6
7
8
9
  • 官网:https://github.com/jmapper-framework/jmapper-core/wiki
  • 推荐:★★★★☆
  • 性能:★★★★★
  • 手段:Elegance, high performance and robustness all in one java bean mapper
  • 点评:速度真心可以,不过结合 SpringBoot 感觉有的一点点麻烦,可能姿势不对

# MapStruct

@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, unmappedSourcePolicy = ReportingPolicy.IGNORE)
public interface UserDTOMapping extends IMapping<UserVO, UserDTO> {

    /** 用于测试的单例 */
    IMapping<UserVO, UserDTO> INSTANCE = Mappers.getMapper(UserDTOMapping.class);

    @Mapping(target = "userId", source = "userId")
    @Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
    @Override
    UserDTO sourceToTarget(UserVO var1);

    @Mapping(target = "userId", source = "userId")
    @Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
    @Override
    UserVO targetToSource(UserDTO var1);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  • 官网:https://github.com/mapstruct/mapstruct
  • 推荐:★★★★★
  • 性能:★★★★★
  • 手段:直接在编译期生成对应的get、set,像手写的代码一样
  • 点评:速度很快,不需要到运行期处理,结合到框架中使用方便