`

【飞天奔月出品】Java字符串模板格式化汇总8法(附性能对比)

    博客分类:
  • java
阅读更多

字符串格式化汇总

在开发过程中,经常会和字符串打交道, 其中字符串拼接的工作必不可少,

比如:

我要生成一个如此格式的路径,有什么办法?

String path= "/home/expressdelivery/${yearMonth}/${expressDeliveryType}/vipQuery_${fileName}.log";

其中的:

yearMonth

是当前日期的年月

expressDeliveryType

是物流方式的类型,以顺丰sf举例 ,如果是其他快递会是其他值

fileName

是当前时间的时间戳

我们来汇总下实现方式

1. ++

对于初学JAVA的蒙童,大约都会使用这招

@Test
public void testAdd(){

    Date now = new Date();

    String yearMonth = DateUtil.toString(now, DatePattern.YEAR_AND_MONTH);
    String expressDeliveryType = "sf";
    String fileName = DateUtil.toString(now, DatePattern.TIMESTAMP);

    String template = "/home/expressdelivery/" + yearMonth + "/" + expressDeliveryType + "/vipQuery_" + fileName + ".log";

    System.out.println(template);
}

输出 :

/home/expressdelivery/2017-07/sf/vipQuery_20170723042314.log

2. StringBuffer / StringBuilder

@Test
public void testStringBuilder(){

    Date now = new Date();

    String yearMonth = DateUtil.toString(now, DatePattern.YEAR_AND_MONTH);
    String expressDeliveryType = "sf";
    String fileName = DateUtil.toString(now, DatePattern.TIMESTAMP);

    StringBuilder sb = new StringBuilder();
    sb.append("/home/expressdelivery/");
    sb.append(yearMonth);
    sb.append("/");
    sb.append(expressDeliveryType);
    sb.append("/vipQuery_");
    sb.append(fileName);
    sb.append(".log");

    String template = sb.toString();

    System.out.println(template);
}

输出 :

/home/expressdelivery/2017-07/sf/vipQuery_20170723042603.log

缺点:

  • 代码太长了

3. StringUtil.format(String, Object…​)

使用 com.feilong.core.lang.StringUtil.format(String, Object…​)

内部封装了 String.format(String, Object)

@Test
public void testStringFormat(){
    Date now = new Date();

    String yearMonth = DateUtil.toString(now, DatePattern.YEAR_AND_MONTH);
    String expressDeliveryType = "sf";
    String fileName = DateUtil.toString(now, DatePattern.TIMESTAMP);

    String template = StringUtil.format("/home/expressdelivery/%s/%s/vipQuery_%s.log", yearMonth, expressDeliveryType, fileName);

    System.out.println(template);
}

输出 :

/home/expressdelivery/2017-07/sf/vipQuery_20170723043153.log

4. MessageFormatUtil.format(String, Object…​)

使用 com.feilong.core.text.MessageFormatUtil.format(String, Object…​)

内部封装了 java.text.MessageFormat.format(String, Object…​)

@Test
public void testMessageFormat(){
    Date now = new Date();

    String yearMonth = DateUtil.toString(now, DatePattern.YEAR_AND_MONTH);
    String expressDeliveryType = "sf";
    String fileName = DateUtil.toString(now, DatePattern.TIMESTAMP);

    String template = MessageFormatUtil
                    .format("/home/expressdelivery/{0}/{1}/vipQuery_{2}.log", yearMonth, expressDeliveryType, fileName);

    System.out.println(template);
}

输出 :

/home/expressdelivery/2017-07/sf/vipQuery_20170723043153.log

5. Slf4jUtil.format(String, Object…​)

使用 com.feilong.tools.slf4j.Slf4jUtil.format(String, Object…​)

借助 slf4j 日志占位符

@Test
public void testSlf4jFormat(){
    Date now = new Date();

    String yearMonth = DateUtil.toString(now, DatePattern.YEAR_AND_MONTH);
    String expressDeliveryType = "sf";
    String fileName = DateUtil.toString(now, DatePattern.TIMESTAMP);

    String template = Slf4jUtil.format("/home/expressdelivery/{}/{}/vipQuery_{}.log", yearMonth, expressDeliveryType, fileName);

    System.out.println(template);
}

输出:

/home/expressdelivery/2017-07/sf/vipQuery_20170723144236.log

6. StringUtil.replace(CharSequence, Map<String, V>)

使用 com.feilong.core.lang.StringUtil.replace(CharSequence, Map<String, V>)

内部封装了 apache commons-lang3 org.apache.commons.lang3.text.StrSubstitutor , 现在叫 commons-text

使用给定的字符串 templateString 作为模板,解析匹配的变量 .

@Test
public void testReplace(){
    Date date = new Date();
    Map<String, String> map = new HashMap<>();
    map.put("yearMonth", DateUtil.toString(date, YEAR_AND_MONTH));
    map.put("expressDeliveryType", "sf");
    map.put("fileName", DateUtil.toString(date, TIMESTAMP));

    String template = StringUtil.replace("/home/expressdelivery/${yearMonth}/${expressDeliveryType}/vipQuery_${fileName}.log", map);

    System.out.println(template);
}

输出:

/home/expressdelivery/2017-07/sf/vipQuery_20170723144608.log

优点:

  • 模块可以定义变量名字了,不怕混乱

Note
此方法只能替换字符串,而不能像el表达式一样使用对象属性之类的来替换

7. VelocityUtil.parseString(String, Map<String, ?>)

使用 com.feilong.tools.velocity.VelocityUtil.parseString(String, Map<String, ?>)

该方法需要 jar

<dependency>
  <groupId>com.feilong.platform.tools</groupId>
  <artifactId>feilong-tools-velocity</artifactId>
  <version>${version.feilong-platform}</version>
</dependency>
@Test
public void testVelocityParseString(){
    Date date = new Date();

    Map<String, String> map = new HashMap<>();
    map.put("yearMonth", DateUtil.toString(date, YEAR_AND_MONTH));
    map.put("expressDeliveryType", "sf");
    map.put("fileName", DateUtil.toString(date, TIMESTAMP));

    VelocityUtil velocityUtil = new VelocityUtil();

    String template = velocityUtil
                    .parseString("/home/expressdelivery/${yearMonth}/${expressDeliveryType}/vipQuery_${fileName}.log", map);

    System.out.println(template);
}
输出
/home/expressdelivery/2017-07/sf/vipQuery_20170723145856.log

8. VelocityUtil.parseTemplateWithClasspathResourceLoader(String, Map<String, ?>)

使用 com.feilong.tools.velocity.VelocityUtil.parseTemplateWithClasspathResourceLoader(String, Map<String, ?>)

该方法需要 jar

<dependency>
  <groupId>com.feilong.platform.tools</groupId>
  <artifactId>feilong-tools-velocity</artifactId>
  <version>${version.feilong-platform}</version>
</dependency>

该方法适合于 字符串模板独立成文件, 方便维护

路径是classpath 下面, 比如 velocity/path.vm

28497395 a52f617c 6fb8 11e7 9902 66249985242a

此时代码需要如此调用:

@Test
public void testVelocityParseTemplateWithClasspathResourceLoader(){
    Date date = new Date();

    Map<String, String> map = new HashMap<>();
    map.put("yearMonth", DateUtil.toString(date, YEAR_AND_MONTH));
    map.put("expressDeliveryType", "sf");
    map.put("fileName", DateUtil.toString(date, TIMESTAMP));

    VelocityUtil velocityUtil = new VelocityUtil();

    String template = velocityUtil.parseTemplateWithClasspathResourceLoader("velocity/path.vm", map);

    System.out.println(template);
}

输出 :

/home/expressdelivery/2017-07/sf/vipQuery_20170723150443.log

9. 性能对比

28501853 87f4c8c2 7017 11e7 99db 3b2d47c803a8

上图是 分别循环 100000, 500000, 1000000, 2000000 统计出来的数据

在性能上 String format 是最差的

字符串 ++ 最快, StringBuilder 次之 , slf4j 的格式化再次之

测试硬件概览:

型号名称:	MacBook Pro
处理器名称:	Intel Core i5
处理器速度:	2.9 GHz
内存:	16 GB

10. 参考

分享到:
评论

相关推荐

    【飞天奔月出品】windows版nginx 快速操控神器(启动start,关闭stop,重启restart) 批处理

    标题中的“【飞天奔月出品】windows版nginx 快速操控神器(启动start,关闭stop,重启restart) 批处理”指的是一个专为Windows操作系统设计的Nginx管理工具,它通过批处理脚本实现了Nginx服务的便捷启动、停止和重启...

    长娥奔月模板下载TIF

    【长娥奔月模板下载TIF】是一个与网页设计相关的资源,主要提供了一种以"长娥奔月"为主题的网页模版。这个模版可能是为了庆祝中国传统节日,如中秋节,或者用于讲述中国古老的神话故事。"长娥奔月"是中国文化中的...

    知名企业java高级工程师面试题附答案

    - **注意**:自Java 7起,`String`类型也可以用于`switch`语句,但需确保字符串常量池中已经存在该字符串。 #### 初始化参数获取 - **通过`ServletContext`和`ServletConfig`对象获取初始化参数**: - 使用`...

    HTML5奔月游戏

    4. **Web Workers**:为了提升游戏性能,开发者可能会使用Web Workers创建后台线程,处理计算密集型任务,如游戏逻辑计算,从而避免阻塞主线程,保证游戏流畅运行。 5. **离线缓存**:HTML5的离线存储功能允许游戏...

    鲁迅《奔月》作品分析.pdf

    《奔月》是鲁迅先生的一篇短篇小说,收录于其《故事新编》之中,通过对传统神话的再创作,鲁迅以戏拟的手法揭示了深刻的社会与人性问题。这篇作品通过对后羿这一昔日英雄形象的塑造,反映出鲁迅对时代变迁下英雄命运...

    火箭兔奔月HTML5游戏源码

    8. **兼容性和性能优化**:考虑到不同浏览器对HTML5支持程度的差异,开发者可能进行了兼容性测试和性能优化,确保游戏在主流浏览器上流畅运行。 通过研究这个源码,开发者可以学习到如何利用HTML5进行游戏开发,...

    奔月生物:2021年半年度报告.PDF

    奔月生物:2021年半年度报告.PDF

    小游戏源码-火贱兔奔月.rar

    【标题】"小游戏源码-火贱兔奔月.rar" 提供的是一个小型游戏的源代码,名为"火贱兔奔月"。这类源码通常用于教学、学习或游戏开发者的参考,帮助开发者理解游戏的基本架构和编程逻辑。 【描述】"小游戏源码-火贱兔...

    H5游戏源码 奔月游戏.zip

    《H5游戏源码解析:奔月游戏》 在当今数字化时代,HTML5(简称H5)技术以其跨平台、轻量级、易部署的特点,成为制作网页游戏的热门选择。"奔月游戏"作为一款H5游戏,其源码为我们提供了一窥H5游戏开发的窗口。本文...

    HTML5奔月游戏 源码.zip

    9. **Web Workers**:在处理复杂的计算任务时,Web Workers允许在后台线程中运行脚本,避免阻塞主线程,提高游戏性能。 10. **WebGL**:虽然“HTML5奔月游戏”可能并未使用WebGL,但这是HTML5的一个强大特性,可以...

    析鲁迅《奔月》.docx

    《鲁迅的《奔月》:颠覆传统,开创审美新向度》 鲁迅的短篇小说《奔月》是其《故事新编》中的一篇,它颠覆了我们对古代神话的传统认知,尤其对嫦娥这一角色的刻画,使得这篇作品在文学史上占据了独特的地位。鲁迅...

    奔月生物:2021年半年度报告.rar

    【标题】:“奔月生物:2021年半年度报告.rar”是一个压缩文件,其中包含了一份关于奔月生物科技公司在2021年上半年业务运营、财务状况和业绩表现的详细报告。这类报告通常由上市公司发布,以供投资者、分析师和其他...

    HTML5小游戏【火贱兔奔月-425款经典优秀H5小游戏合集】游戏源码分享下载 - hjby.zip

    游戏源码分享下载 --- hjby.zipHTML5小游戏【火贱兔奔月--425款经典优秀H5小游戏合集】游戏源码分享下载 --- hjby.zipHTML5小游戏【火贱兔奔月--425款经典优秀H5小游戏合集】游戏源码分享下载 --- hjby.zipHTML5小...

    [鲁迅]析鲁迅《奔月》.docx

    鲁迅的《奔月》作为其《故事新编》中的一篇文章,通过对传统神话的现代诠释,展示了作者独特的审美追求和文学创新精神。在这个故事中,鲁迅颠覆了嫦娥奔月这一古典神话的传统形象,将其描绘成一个平凡甚至带有世俗...

    初中语文文摘生活且看嫦娥咋奔月

    初中语文文摘生活且看嫦娥咋奔月

    HTML5兔子奔月吃月饼游戏源码

    8. **用户界面(UI)设计**: 游戏的开始界面、暂停/继续按钮、得分显示等都是UI设计的一部分,它们需要与游戏逻辑紧密结合,提供友好的用户体验。 9. **性能优化**: 为了保证游戏在不同设备上的流畅运行,开发者...

    奔月生物:2019年半年度报告.PDF

    【山东奔月生物科技股份有限公司2019年半年度报告】是该公司在当年的一个重要财务信息披露文件,旨在向公众和投资者展示公司在前六个月的经营状况、财务数据和重大事件。以下是对报告中关键知识点的详细解析: 1. *...

    H5小游戏源码 火贱兔奔月.zip

    4. 图片和音频资源:游戏中的图像素材(如角色、背景、图标)和音效文件,通常为PNG或SVG格式的图片,以及MP3或WAV格式的音频。 5. JSON或其他配置文件:可能包含游戏设置、关卡信息、道具数据等,方便调整和扩展...

    java进销存

    Java进销存系统是一种基于Java编程语言开发的库存管理和销售跟踪软件。这个系统通常结合了SQL Server 2000数据库来存储和管理数据,提供了一整套功能,包括商品入库、出库、库存查询、销售统计等。下面将详细阐述...

    Photoshop合成奔月女孩梦幻艺术照片效果.doc

    这篇文档介绍了如何使用Adobe Photoshop软件创作一张奔月女孩的梦幻艺术照片效果。以下是详细步骤: 1. **新建文件与导入素材**: - 首先创建一个新文件,大小与素材1相同,命名为"奔月女孩"。 - 然后打开素材1,...

Global site tag (gtag.js) - Google Analytics