在Java中 , 对字符串内容的拼接是比较常见的操作 , 通常有三种方式 .

用String类重载'+'运算符进行拼接本质上是调用StringBuilder.append . 用类似C的printf风格 , 调用String.format() . 底层是调用formatter.format方法 . 用原生的StringBuilder.append方法 .

那从性能和内存占用两个方面考虑到底是哪一个方法更好呢?

package com.xbz.demo;

public class StringAppend {

private static final int frequency = 10000;

private static Runtime runtime = Runtime.getRuntime();

private static long memory;//初始可用内存

private static long beginTime;//开始时间

/* 模拟变量 */

private static String productName = "iPhone XXL";//产品名称

private static Double productPrice = 9899.0;//产品价格

private static String productAddress = "中国";//产品生产地

public static void main(String[] args) {

beginTime = System.currentTimeMillis();

memory = runtime.freeMemory();

stringAppend1();

printInfoAndClear();

stringAppend2();

printInfoAndClear();

stringAppend3();

printInfoAndClear();

}

/** 字符串拼接 , +号直接拼接 */

private static void stringAppend1() {

for (int i = 0; i < frequency; i++) {

String result = "产品名称 : " + productName + " , 价格 : " + productPrice + " , 生产地 : " + productAddress;

}

}

/** 字符串拼接 , String.format格式化方式 */

private static void stringAppend2() {

for (int i = 0; i < frequency; i++) {

String result = String.format("产品名称 : %s , 价格 : %s , 生产地 : %s", productName, productPrice, productAddress);

}

}

/** 字符串拼接 , StringBuilder.append方式 */

private static void stringAppend3() {

for (int i = 0; i < frequency; i++) {

StringBuilder sb = new StringBuilder();

sb.append("产品名称 : ").append(productName).append(" , 价格 : ").append(productPrice).append(" , 生产地 : ").append(productAddress);

String result = sb.toString();

}

}

/** 输出时间和内存信息 , 并初始化变量 */

private static void printInfoAndClear() {

System.out.println("耗时 : " + (System.currentTimeMillis() - beginTime) + " , 内存 : " + (memory - runtime.freeMemory()) / 10000 + "W");

beginTime = System.currentTimeMillis();

memory = runtime.freeMemory();

}

}

对比结果如下 :

MethodTime (ms)   Memory Usage (long / 10000)+9671String.format601879StringBuilder.append4536    可以看到StringBuilder.append的执行时间和内存占用都是最优的 . '+' 运算符比直接调用StringBuilder.append要慢上不少 , 特别是要连接的字符串数量较多时 , 内存占用也特别大 . String.format由于每次都有生成一个Formatter对象 , 从时间和内存占用上都最差 .

但在实际的业务场景中 , 我们为了程序的可读性 , 简洁等因素 . 往往直接使用'+'拼接 . 而在需要数据转换的时候 , 如日期转换 , 数字转换等 , 可以直接用String.format来拼接 .

java字符串拼接还是格式化_Java中三种字符串的拼接(++ , String.format , StringBuilder.a...相关推荐

  1. java rowmapper 通用实现_06.Teambiz中三种特殊RowMapper的使用

    Teambiz中三种特殊RowMapper的使用 作者:何杨 撰写日期:2012年2月25日 版本:1.00 更新日期: 第一部分:功能说明 针对特殊目的的查询,TeamBiz提供了一系列的RowMa ...

  2. Java中三种字符串的拼接(++ , String.format , StringBuilder.append)

    在Java中 , 对字符串内容的拼接是比较常见的操作 , 通常有三种方式 . 用String类重载'+'运算符进行拼接本质上是调用StringBuilder.append . 用类似C的printf风 ...

  3. java持久层用文件_JAVA中用三种方法将字符串持久化到文件中

    经常需要将数据进行持久化,而我们的文件系统是最古老也是最可靠的保存方式.这里就给出一个在JAVA中把字符串保存到文件中的例子.如下: package test.base; import java.io ...

  4. java截取前几位_java中怎么截取字符串前几位

    java中可以使用substring()方法截取字符串前几位. substring() 方法返回字符串的子字符串. 语法:public String substring(int beginIndex) ...

  5. java链接_JAVA中三种URL连接方法

    Java的网络类可以让你通过网络或者远程连接来实现应用.而且,这个平台现在已经可以对国际互联网以及URL资源进行访问了.Java的URL类可以让访问网络资源就像是访问你本地的文件夹一样方便快捷.我们通 ...

  6. java实现四次挥手_java中三次握手四次挥手是什么?图文详解

    关于java中的一些基础的知识,是非常的多的,而且涉及的方面也是非常的广阔的.相信大家在日常的学习中也会遇到很多这些令人疑惑的问题,今天就来为大家介绍一下,一起来看看吧. 首先说一下,java中三次握 ...

  7. Sql Server中三种字符串合并方法的性能比较

    最近正在处理一个合并字符吕的存储过程,在一个测试系统的开发中,要使用到字符串合并功能,直接在Sql中做.         示例:         有表內容﹕         名称  內容        ...

  8. JS中三种字符串连接方式及其性能比较

    工作中经常会碰到要把2个或多个字符串连接成一个字符串的问题,在JS中处理这类问题一般有三种方法,这里将它们一一列出顺便也对它们的性能做个具体的比较. 第一种方法  用连接符"+"把 ...

  9. java在创建对象时必须_Java中5种创建对象的方式

    以下是一些在Java中创建对象的方法: 1. 使用new关键字 使用new关键字是创建对象的最基本方法.这是在java中创建对象的最常见方法.几乎99%的对象都是这样创建的.通过使用这个方法,我们可以 ...

  10. java拆分电话号码的函数_java中split拆分字符串函数用法

    package com.java.lang; public class StringSp { /** * @param args */ public static void main(String[] ...

最新文章

  1. 新警达尼亚尔·迪力木拉提的春运一天
  2. 各种initcall的执行先后顺序(module_init、postcore_initcall、arch_initcall、subsys_initcall、 fs_initcall)...
  3. Android系统中自定义按键的短按、双击、长按事件
  4. QT的QDBusPendingCallWatcher类的使用
  5. Linux下的XAMPP基本配置技巧(设置虚拟主机、添加FTP账户等)
  6. hdu1247(Hat’s Words)
  7. \r,\n,\r\n
  8. CTS(13)---CTS 测试之Media相关测试failed 小结(一)
  9. 雪花算法id长度_【Java】分布式自增ID算法雪花算法 (snowflake,Java版)
  10. Win10搜索框图案有广告的解决办法
  11. 中国可用的 BT Tracker 服务器列表,每24小时自动更新,去重,自动检测可用性
  12. 从零开始的运维之路【标题党】
  13. python中使用splash如何挂代理?
  14. 作为开发者你必须要知道的五大浏览器,记得收藏
  15. 《计算机是怎样跑起来的》读书笔记
  16. chrome用 --proxy-server 单独设置代理
  17. 九连环解法( 基于递归 )
  18. 饭前一根香蕉,到底有多好!
  19. 【HTML】表格标签,map,iframe,h5标签,语义化,标签分类,role,aria-*
  20. 安卓开发仿微信图片拖拽_Android仿微信朋友圈图片浏览器(支持图片手势缩放,拖动)...

热门文章

  1. RabbitMQ如何解决各种情况下丢数据的问题
  2. H - 数论中的异或 HRBUST - 1688
  3. 【Codeforces AIM Tech Round 4 (Div. 2) C】
  4. 【转】android 完全退出应用程序
  5. 用DrawerLayout(Support Library 4提供)开发侧边栏,有没有什么方法关闭手势控制?...
  6. 添加鼠标悬浮在控件上的提示信息 很齐全各种方法 MFC ToolTipCtl
  7. [原]ASP.NET MVC 3 Razor + jqGrid 示例
  8. 值得看的youtube频道
  9. wxpython记录生词GUI程序
  10. 蒙提霍尔问题(三门问题,概率论)C语言验证