使用Bean其实优于Map

Posted chenss15060100790

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Bean其实优于Map相关的知识,希望对你有一定的参考价值。

在很长的时间里,一直以为使用反射技术效率低,对比于使用反射创建对象,可能直接创建Map更快,但是这种认知是错误的,以下以创建一百万个对象为例

 

package spring;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.client.bean.Person;

public class Test {
    public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
        {
            //在很长的时间里,一直以为map是快速的存储结构
            //但是这种认知是错误的,实际测试下,反而是最慢的
            //(但是map支持无限制地填充数据,这一点优于bean对象)
            //原因可能是过多的对象创建,因为每一个对象都需要一个entry等对象进行包装
            List<Map<String,Object>> l = new ArrayList<>();
            Map<String,Object> map;
            int cnt = 1000000;
            long start = System.nanoTime();
            while(cnt-->0){
                map= new HashMap<>();
                map.put("name", "xiaoming");
                map.put("age", cnt);
                map.put("name", "xiaoming");
                map.put("age", cnt);
                l.add(map);
            }
            long end = System.nanoTime();
            System.out.println(l.size());
            System.out.println(start);
            System.out.println(end);
            System.out.println(end-start);
        }
        {
            //阿里的JSON对象优于map,而弱于bean对象
            List<JSONObject> l = new ArrayList<>();
            JSONObject map;
            int cnt = 1000000;
            long start = System.nanoTime();
            while(cnt-->0){
                map= new JSONObject();
                map.put("name", "xiaoming");
                map.put("age", cnt);
                l.add(map);
            }
            long end = System.nanoTime();
            System.out.println(l.size());
            System.out.println(start);
            System.out.println(end);
            System.out.println(end-start);
        }
        {
            //使用bean对象
            List<Person> l = new ArrayList<>();
            Person map;
            int cnt = 1000000;
            long start = System.nanoTime();
            while(cnt-->0){
                map= new Person();
                map.setName("xiaoming");
                map.setAge(cnt);
                l.add(map);
            }
            long end = System.nanoTime();
            System.out.println(l.size());
            System.out.println(start);
            System.out.println(end);
            System.out.println(end-start);  
        }
        {   
            //对java反射进行优化,先解析一部分参数(缓存),这种方式最快
            //唯一的顾虑是在并发情况下是否有问题
            List<Person> l = new ArrayList<>();
            Person map;
            int cnt = 1000000;
            Field fn = Person.class.getDeclaredField("name");
            fn.setAccessible(true);
            Field fa = Person.class.getDeclaredField("age");
            fa.setAccessible(true);
            
            Map<String,Field> f = new HashMap<>();
            f.put("name", fn);
            f.put("age", fa);
            
            long start = System.nanoTime();
            while(cnt-->0){
                map= new Person();
                f.get("name").set(map, "xiaoming");
                f.get("age").set(map, cnt);
                l.add(map);
            }
            long end = System.nanoTime();
            System.out.println(l.size());
            System.out.println(start);
            System.out.println(end);
            System.out.println(end-start);  
        }
        {
            //所有的反射留到使用时再解析,这种方式会随着参数变多,
            //耗时也越来越多,超过某个阶段,效率低于Map
            List<Person> l = new ArrayList<>();
            Person map;
            int cnt = 1000000;
            
            long start = System.nanoTime();
            Field fa,fn;
            while(cnt-->0){
                fn = Person.class.getDeclaredField("name");
                fn.setAccessible(true);
                fa = Person.class.getDeclaredField("age");
                fa.setAccessible(true);
                map= new Person();
                fn.set(map, "xiaoming");
                fa.set(map, cnt);
                l.add(map);
            }
            long end = System.nanoTime();
            System.out.println(l.size());
            System.out.println(start);
            System.out.println(end);
            System.out.println(end-start);  
        }
    }
}

 

以上是关于使用Bean其实优于Map的主要内容,如果未能解决你的问题,请参考以下文章

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

得到了map数值,封装不到bean内

数据框架到RDD这段代码无法工作。

优雅的转换Bean对象 mapstruct使用笔记详解

map转bean速度主要依赖啥

SpringBoot启动报错“Consider defining a bean of type ‘xxx.mapper.UserMapper‘ in your configuration.“(代码片段