前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java 常规类型消息的格式化 原

java 常规类型消息的格式化 原

作者头像
wuweixiang
发布2018-08-14 11:44:41
5570
发布2018-08-14 11:44:41
举报
文章被收录于专栏:吴伟祥

最快的是StringBuilder的方式

代码语言:javascript
复制
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.text.MessageFormat;
import java.util.Date;

/**
 * Created by weixiang.wu on 2017/7/4.
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class FormatTest extends AbstractJUnit4SpringContextTests {

    private static final Logger logger = LoggerFactory.getLogger(FormatTest.class);
    @Test
    public void formatTest() {
        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());
        }
        long end1 = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            String.format("login system at %s", new Date());
        }
        long end2 = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            MessageFormat.format("login system at {0,date,yyyy-MM-dd HH:mm:ss}", new Date());
        }
        long end3 = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            logger.info("login system at {}",new Date());
        }
        long end4 = System.currentTimeMillis();

        System.out.println("Stringbuilder cost: " + (end1 - start));
        System.out.println("String.format cost: " + (end2 - end1));
        System.out.println("MessageFormat cost: " + (end3 - end2));
        System.out.println("logger{} cost: " + (end4 - end3));
    }
}
代码语言:javascript
复制
Stringbuilder cost: 3729
String.format cost: 11989
MessageFormat cost: 22400
logger{} cost: 887559

0.slf4j有一个common logger没有的功能,字符串中的{}会被替换,如下:

代码语言:javascript
复制
logger.info("Hello {}","world");

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

1. 使用StringBuilder

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

代码语言:javascript
复制
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()方法可以对消息进行格式化,这种方式是依赖通配符完成的,一般操作是这样的:

代码语言:javascript
复制
String username = "Jack";
        logger.info(String.format("%s login system at %s", username, new Date()));

3. 使用MessageFormat

代码语言:javascript
复制
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更加灵活,代码也会更加美观。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/07/04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档