- 对于字段名称与类型完全一样时,两者无区别
- 对于字段名称相同,但是类型不一样(如int <=> Integer)时,BeanUtils拷贝,而BeanCopier不拷贝(需要通过转换才能完成拷贝)
- BeanUtils与BeanCopier第一个字母不需要大小写之外,其他的部分是需要严格区分大小写的
- 百万数据BeanCopier拷贝性能优于BeanUtils 2到5倍
对于字段名称与类型完全一样时,两者无区别
//User对象
@Data
public class User {
private String name;
private Integer age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
//UserDto 对象
@Data
public class UserDto {
private String name;
private Integer age;
}
//测试类
public class TestCopy {
public static void main(String[] args) {
User user = new User("aisino",10);
UserDto userDto1 = new UserDto();
BeanUtils.copyProperties(user,userDto1);
System.out.println("BeanUtils拷贝结果:"+userDto1);
BeanCopier beanCopier = BeanCopier.create(User.class,UserDto.class,false);
// userConverter converter = new userConverter();
UserDto userDto2 = new UserDto();
beanCopier.copy(user,userDto2,null);
System.out.println("BeanCopier拷贝结果:"+userDto2);
}
}
//运行结果
BeanUtils拷贝结果:UserDto(name=aisino, age=10)
BeanCopier拷贝结果:UserDto(name=aisino, age=10)
对于字段名称相同,但是类型不一样(如int <=> Integer)时,BeanUtils拷贝,而BeanCopier不拷贝(需要通过转换才能完成拷贝)
//User对象
@Data
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
//UserDto 对象
@Data
public class UserDto {
private String name;
private Integer age;
}
//测试类
public class TestCopy {
public static void main(String[] args) {
User user = new User("aisino",10);
UserDto userDto1 = new UserDto();
BeanUtils.copyProperties(user,userDto1);
System.out.println("BeanUtils拷贝结果:"+userDto1);
BeanCopier beanCopier = BeanCopier.create(User.class,UserDto.class,false);
// userConverter converter = new userConverter();
UserDto userDto2 = new UserDto();
beanCopier.copy(user,userDto2,null);
System.out.println("BeanCopier拷贝结果:"+userDto2);
}
}
//运行结果
BeanUtils拷贝结果:UserDto(name=aisino, age=10)
BeanCopier拷贝结果:UserDto(name=aisino, age=10)
//测试类 (BeanCopier 通过实现Converter接口来实现不同类型拷贝)
public class TestCopy {
public static void main(String[] args) {
User user = new User("aisino",10);
UserDto userDto1 = new UserDto();
BeanUtils.copyProperties(user,userDto1);
System.out.println("BeanUtils拷贝结果:"+userDto1);
BeanCopier beanCopier = BeanCopier.create(User.class,UserDto.class,true);
userConverter converter = new userConverter();
UserDto userDto2 = new UserDto();
beanCopier.copy(user,userDto2,converter);
System.out.println("BeanCopier拷贝结果:"+userDto2);
}
static class userConverter implements Converter {
@Override
public Object convert(Object value, Class target, Object context) {
if (value instanceof Integer){
return (Integer) value;
}else if (value instanceof String){
return (String) value;
}
return null;
}
}
}
// 运行结果
BeanUtils拷贝结果:UserDto(name=aisino, age=10)
BeanCopier拷贝结果:UserDto(name=aisino, age=10)
BeanUtils与BeanCopier第一个字母不需要大小写之外,其他的部分是需要严格区分大小写的
//User对象
@Data
public class User {
private String name;
private Integer ageA;
public User(String name, Integer ageA) {
this.name = name;
this.ageA = ageA;
}
}
//UserDto 对象
@Data
public class UserDto {
private String name;
private Integer agea;
}
//测试类
public class TestCopy {
public static void main(String[] args) {
User user = new User("aisino",10);
UserDto userDto1 = new UserDto();
BeanUtils.copyProperties(user,userDto1);
System.out.println("BeanUtils拷贝结果:"+userDto1);
BeanCopier beanCopier = BeanCopier.create(User.class,UserDto.class,false);
UserDto userDto2 = new UserDto();
beanCopier.copy(user,userDto2,null);
System.out.println("BeanCopier拷贝结果:"+userDto2);
}
}
//运行结果
BeanUtils拷贝结果:UserDto(name=aisino, agea=null)
BeanCopier拷贝结果:UserDto(name=aisino, agea=null)
百万数据BeanCopier拷贝性能优于BeanUtils 2到5倍
//User对象
@Data
public class User {
private String name;
private Integer age;
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
}
//UserDto
@Data
public class UserDto {
private String name;
private Integer age;
}
//测试类
public class TestCopy {
public static void main(String[] args) {
//创建一个1000万对象
List<User> userList = new ArrayList<>();
for (int i = 0; i < 1000000; i++) {
userList.add(new User("test"+i,i));
}
//开始计时
long startTime = System.currentTimeMillis();
userList.stream().forEach(user ->
BeanUtils.copyProperties(user,new UserDto()));
//消耗时间
long beanUtilsTime = System.currentTimeMillis() - startTime;
startTime = System.currentTimeMillis();
BeanCopier beanCopier = BeanCopier.create(User.class, UserDto.class, false);
userList.stream().forEach(user -> {
beanCopier.copy(user,new UserDto(),null);
});
//消耗时间
long beanCopierTime = System.currentTimeMillis() - startTime;
System.out.println("BeanUtils属性拷贝消耗时间:"+beanUtilsTime+"毫秒");
System.out.println("BeanCopier属性拷贝消耗时间:"+beanCopierTime+"毫秒");
}
}
// 运行结果
BeanUtils属性拷贝消耗时间:1274毫秒
BeanCopier属性拷贝消耗时间:342毫秒