zoukankan      html  css  js  c++  java
  • 项目中消息的格式化方法

    在很多项目中经常打印Log,返回操作之后的响应消息给客户端等都会涉及到消息的格式化,一般都是会有一个消息模板,然后传入一些特定的参数值达到项目的需要。在Java中处理方式一般有以下三种:

    1. 使用StringBuilder

    使用一个StringBuilder对象进行封装,然后toString传给终端,OK,这个是很普遍的做法,只是在代码上不是很美观,但是性能在本文中三个方案中应该是最高的。假设有这样一个场景,需要对用户登陆消息进行Log。

            String username = "Jack";
            StringBuilder sb = new StringBuilder();
            sb.append(username)
                    .append(" login system at ")
                    .append(new Date());
            logger.info(sb.toString());

    2. 使用String.format

    String类也提供了format()方法可以对消息进行格式化,这种方式是依赖通配符完成的,一般操作是这样的:

            String username = "Jack";
            logger.info(String.format("%s login system at %s", username, new Date()));

    3. 使用MessageFormat

            String username = "Jack";
            logger.info(MessageFormat.format("{0} login system at {1,date,yyyy-MM-dd HH:mm:ss}", username, new Date()));

    MessageFormat则使用的是占位符,占位符可以配置的元素有以下几种,应该很好理解,可以对日期和Number类型的参数做格式化:

     { ArgumentIndex }
     { ArgumentIndex , FormatType }
     { ArgumentIndex , FormatType , FormatStyle }

    在不是特别care性能可以使用MessageFormat更加灵活,代码也会更加美观。

    我做了一个简单的耗时测试,各执行1000w次:

    如下代码:

           String username = "Jack";
            long start = System.currentTimeMillis();
            for (int i=0; i<10000000; i++) {
                StringBuilder sb = new StringBuilder();
                sb.append(username)
                        .append(" login system at ")
                        .append(new Date());
    //            logger.info(sb.toString());
            }
            long end1 = System.currentTimeMillis();
            for (int i=0; i<10000000; i++) {
                String.format("%s login system at %s", username, new Date());
    //            logger.info(String.format("%s login system at %s", username, new Date()));
            }
            long end2 = System.currentTimeMillis();
            for (int i=0; i<10000000; i++) {
    //            logger.info(MessageFormat.format("{0} login system at {1,date,yyyy-MM-dd HH:mm:ss}", username, new Date()));
                MessageFormat.format("{0} login system at {1,date,yyyy-MM-dd HH:mm:ss}", username, new Date());
            }
            long end3 = System.currentTimeMillis();
    
            System.out.println("Stringbuilder cost: " + (end1 - start));
            System.out.println("String.format cost: " + (end2 - end1));
            System.out.println("MessageFormat cost: " + (end3 - end2));

    结果输出:

    Stringbuilder cost: 5468
    String.format cost: 19969
    MessageFormat cost: 34434

    执行次数很少的话基本上都差不多,这里也给出执行100次的时间:

    Stringbuilder cost: 13
    String.format cost: 17
    MessageFormat cost: 18

    然后看了一下CPU,MessageFormat也是要高一点的

    关心MessageFormat更详细的使用,可以参见:http://docs.oracle.com/javase/7/docs/api/java/text/MessageFormat.html

  • 相关阅读:
    viewpager切换时底下的背景图标动画切换
    hdu 1594水题
    hdu 4256大水题
    hdu 1856并查集
    hdu4247水题
    hdu 4252单调栈
    hdu 4248排列问题
    hdu 1210
    hdu4245
    hdu 1593找规律题
  • 原文地址:https://www.cnblogs.com/nexiyi/p/message_format_java.html
Copyright © 2011-2022 走看看