BeanMap和JSON对象相互转换 对比
目录
可以使用fastjson的JSON,进行Bean对象和Map相互转换,也可以用BeanMap的方式进行进行Bean对象和Map相互转换,两种之间的效率如何呢? 该如何选择?
0,数据准备:
Shape 单个对象
public class Shape implements Cloneable {
private String color;
private String type;
public Shape() {
}
public Shape(String color, String type) {
this.color = color;
this.type = type;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public Object clone() {
Object clone = null;
try {
clone = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
@Override
public String toString() {
return "Shape{" +
"color='" + color + '\'' +
", type='" + type + '\'' +
'}';
}
}
List<Shape>数据 ShapeFactory
public class ShapeFactory {
private static final String COLORS[] =
{ "红色", "粉红色", "绿色", "蓝色", "棕色", "橘色" };
private static final String SHAPES[] =
{ "圆形", "三角形", "长方形", "平行四边形", "扇形", "梯形" };
public static List<Shape> create(int size) {
List<Shape> shapeList = new ArrayList<>();
// 先造一个原型
Shape prototypeShape = new Shape(getRandomColor(), getRandomShape());
for(int i=0; i < size; ++i) {
Shape clone = (Shape) prototypeShape.clone();//复制原型
clone.setColor(getRandomColor());
clone.setType(getRandomShape());
shapeList.add(clone);
}
return shapeList;
}
private static String getRandomColor() {
return COLORS[(int)(Math.random()*COLORS.length)];
}
private static String getRandomShape() {
return SHAPES[(int)(Math.random()*COLORS.length)];
}
}
ListMaps数据
public class ShapeListMapFactory {
private static final String COLORS[] =
{ "红色", "粉红色", "绿色", "蓝色", "棕色", "橘色" };
private static final String SHAPES[] =
{ "圆形", "三角形", "长方形", "平行四边形", "扇形", "梯形" };
public static List<Map<String,Object>> create(int size) {
List<Map<String,Object>> shapeList = new ArrayList<>();
for(int i=0; i < size; ++i) {
Map<String,Object> single = new HashMap<>();
single.put("color", getRandomColor());
single.put("type", getRandomShape());
shapeList.add(single);
}
return shapeList;
}
private static String getRandomColor() {
return COLORS[(int)(Math.random()*COLORS.length)];
}
private static String getRandomShape() {
return SHAPES[(int)(Math.random()*COLORS.length)];
}
}
BeanMapUtis代码:
import org.springframework.cglib.beans.BeanMap;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
public class BeanMapUtils {
/**
* 将对象转换为map
* @param bean
* @return
*/
public static <T> Map<String, Object> changeBeanToMap(T bean) {
Map<String, Object> map = new HashMap<>();
if (bean != null) {
BeanMap beanMap = BeanMap.create(bean);
for (Object key : beanMap.keySet()) {
map.put(String.valueOf(key), beanMap.get(key));
}
}
return map;
}
/**
* 将map转换为bean对象
* @param map
* @param bean
* @return
*/
public static <T> T changeMapToBean(Map<String, Object> map, T bean) {
BeanMap beanMap = BeanMap.create(bean); // 识别对应类型的内容
beanMap.putAll(map); // 添加数据
return bean;
}
/**
* 将List<Bean>转换为List<Map<String, Object>>
*
* @param sourceList
* @return
*/
public static <T> List<Map<String, Object>> changeBeansToList(List<T> sourceList) {
List<Map<String, Object>> srclist = Collections.emptyList();
if (sourceList != null && sourceList.size() > 0) {
srclist = new ArrayList<>(sourceList.size());
Map<String, Object> map;
for (T bean : sourceList) {
map = changeBeanToMap(bean);
srclist.add(map);
}
}
return srclist;
}
/**
* 将List<Map<String,Object>>转换为List<Bean>
* @param sourceList
* @param clazz
* @param <T>
* @return
*/
public static <T> List<T> changeListToBeans(List<Map<String, Object>> sourceList, Class<T> clazz) {
List<T> srclist = Collections.emptyList();
if (sourceList != null && sourceList.size() > 0) {
try {
srclist = new ArrayList<>(sourceList.size());
T bean;
for (Map<String, Object> map1 : sourceList) {
bean = changeMapToBean(map1, clazz.getDeclaredConstructor().newInstance());
srclist.add(bean);
}
} catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException | InstantiationException ex) {
ex.printStackTrace();
}
}
return srclist;
}
}
1,对比Bean对象转换为List的情况
测试:
private final static int SIZE = 1500000;
private static List<Map<String, Object>> shapeLists = ShapeListMapFactory.create(SIZE);
private static List<Shape> shapeBeanList = ShapeFactory.create(SIZE);
public static void main(String[] args) {
System.out.println("======== compare BeanMap and JOSN change beans to list ===========");
testBeansToList();
changeBeansToListMap();
}
public static void testBeansToList(){
System.out.println("========== BeanMapUtils change beans to listMap ============");
long startTime = System.currentTimeMillis();
BeanMapUtils.changeBeansToList(shapeBeanList);
long endTime = System.currentTimeMillis();
System.out.println("BeanMapUtils.beansToMaps 转换耗费的时间:" + (endTime - startTime) + "ms");
}
public static void changeBeansToListMap() {
List<Map> mapList=new ArrayList<>();
System.out.println("========== JSON change beans to list ============");
long startTime = System.currentTimeMillis();
for(Object shape: shapeBeanList){
Map map = JSON.parseObject(JSONObject.toJSONString(shape), Map.class);
mapList.add(map);
}
long endTime = System.currentTimeMillis();
System.out.println("JSON BeanToListMap 转换耗费的时间:" + (endTime - startTime) + "ms");
}
将size改为: 1500000
结果1:
======== compare BeanMap and JOSN change beans to list ===========
========== BeanMapUtils change beans to listMap ============
BeanMapUtils.beansToMaps 转换耗费的时间:2071ms
========== JSON change beans to list ============
JSON BeanToListMap 转换耗费的时间:1571ms
结果2:
======== compare BeanMap and JOSN change beans to list ===========
========== BeanMapUtils change beans to listMap ============
BeanMapUtils.beansToMaps 转换耗费的时间:1668ms
========== JSON change beans to list ============
JSON BeanToListMap 转换耗费的时间:1074ms
将size改为: 2000000
结果3:
======== compare BeanMap and JOSN change beans to list ===========
========== BeanMapUtils change beans to listMap ============
BeanMapUtils.beansToMaps 转换耗费的时间:1668ms
========== JSON change beans to list ============
JSON BeanToListMap 转换耗费的时间:1074ms
结果4:
======== compare BeanMap and JOSN change beans to list ===========
========== BeanMapUtils change beans to listMap ============
BeanMapUtils.beansToMaps 转换耗费的时间:2267ms
========== JSON change beans to list ============
JSON BeanToListMap 转换耗费的时间:9948ms
分析:
有结果可以看出,超过2百万的时候,JSON处理把beans转为list的时候,效率会低很多,但是在1百万以内的数据,使用JSON的效率会更好。
2,对比 将List转换为Bean对象
测试:
private final static int SIZE = 1500000;
private static List<Map<String, Object>> shapeLists = ShapeListMapFactory.create(SIZE);
private static List<Shape> shapeBeanList = ShapeFactory.create(SIZE);
public static void main(String[] args) {
System.out.println("======== compare BeanMap and JOSN change list to beans ===========");
testListToBeans();
testListMapToBeans();
}
public static void testListToBeans(){
System.out.println("======== BeanMapUtils change listMap to beans ========");
long startTime = System.currentTimeMillis();
BeanMapUtils.changeListToBeans(shapeLists, Shape.class);
long endTime = System.currentTimeMillis();
System.out.println("BeanMapUtils.mapsToBeans 转换耗费的时间:" + (endTime - startTime) + "ms");
}
public static void testListMapToBeans() {
List<Shape> shapeList=new ArrayList<>();
System.out.println("========== JSON change list to Bean ============");
Shape single;
long startTime = System.currentTimeMillis();
for(Object map: shapeLists){
single= JSON.parseObject(JSONObject.toJSONString(map),Shape.class);
shapeList.add(single);
}
long endTime = System.currentTimeMillis();
System.out.println("JSON ListMapToBean 转换耗费的时间:" + (endTime - startTime) + "ms");
}
size: 1500000
结果1:
======== compare BeanMap and JOSN change list to beans ===========
======== BeanMapUtils change listMap to beans ========
BeanMapUtils.mapsToBeans 转换耗费的时间:462ms
========== JSON change list to Bean ============
JSON ListMapToBean 转换耗费的时间:1135ms
结果2:
======== compare BeanMap and JOSN change list to beans ===========
======== BeanMapUtils change listMap to beans ========
BeanMapUtils.mapsToBeans 转换耗费的时间:460ms
========== JSON change list to Bean ============
JSON ListMapToBean 转换耗费的时间:1176ms
size: 2000000
结果3:
======== compare BeanMap and JOSN change list to beans ===========
======== BeanMapUtils change listMap to beans ========
BeanMapUtils.mapsToBeans 转换耗费的时间:1988ms
========== JSON change list to Bean ============
JSON ListMapToBean 转换耗费的时间:1455ms
结果4:
======== compare BeanMap and JOSN change list to beans ===========
======== BeanMapUtils change listMap to beans ========
BeanMapUtils.mapsToBeans 转换耗费的时间:2723ms
========== JSON change list to Bean ============
JSON ListMapToBean 转换耗费的时间:2196ms
分析:
有结果可以看出,超过2百万的时候,使用JSON处理把list转为beans的时候,效率会更好,但是在1百万以内的数据,反而使用BeanMap的效率会更好。跟上一个的内容的结论正好反过来了。大家可以改改改size的值进行测试比较。
总结
比较完两者的效率,在数据量很大的情况下,进行Bean转为为List的情况下,BeanMap的方式比较合适。
不过实际中一般也不会进行那样大量的转换。项目里面有fastjson的话,就优先考虑使用JSON的方式去处理,没有就用BeanMap的方式去处理。