首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >String.Format与“String”+“String”或StringBuilder?

String.Format与“String”+“String”或StringBuilder?

提问于 2018-03-05 22:08:52
回答 2关注 0查看 162

什么是性能优先和什么应该是条件优先下列各项:

代码语言:javascript
运行
AI代码解释
复制
String.Format("{0}, {1}", city, state);

要么

代码语言:javascript
运行
AI代码解释
复制
city + ", " + state;

要么

代码语言:javascript
运行
AI代码解释
复制
StringBuilder sb = new StringBuilder();
sb.Append(city);
sb.Append(", ");
sb.Append(state);
sb.ToString();

回答 2

奥特曼奥特曼

回答已采纳

发布于 2018-03-06 06:53:39

  • 编译器会尽可能多地优化字符串连接,例如,为了换行目的而分解的字符串通常可以优化为单个字符串文字。
  • 连接变量将被编译成String.Concat
  • 如果你对一个字符串做了几个修改(超过10个左右),StringBuilder可以快很多,但是它会带来一些额外的开销,因为它在缓冲区中分配了比你需要的更多的空间并且调整了内部缓冲区的大小它需要。

几乎所有的时间我都使用String.Format,原因有两个:

  • 维护格式字符串要比重新排列一堆变量容易得多。
  • String.Format采用一个IFormatProvider,将其传递给嵌入在字符串中的任何IFormattable类型(例如数字),以便为指定的区域性获得适当的数字格式,并更好地控制值的格式设置。

例如,由于某些文化使用逗号作为小数点,如果要确保数字按照您的打算格式化,需要确保使用StringBuilder或String.Format指定CultureInfo.InvariantCulture。

还有两件事要注意...

  • StringBuilder也有一个AppendFormat函数,它提供了String.Format的灵活性,而不需要不必要的第二个缓冲区。
  • 在使用StringBuilder时,确保不会通过连接传递给Append的参数来达到目的。这是一个容易错过的人。

看加速得中二

发布于 2018-03-06 07:34:38

没有相关的差异。但假设String.Format内部使用StringBuilder(可以使用Reflector工具查看),直接使用StringBuilder.Append应该更快。

编辑:当然,使用“+”运算符是最糟糕的选项,因为它要连接的每个字符串创建一个新的字符串实例。

和开发者交流更多问题细节吧,去 写回答
相关文章
少用 string.Format
如果你使用的是 C# 6.0 及其以上版本的话我建议你使用新增的 内插字符串 这个功能。这个功能可以更好的帮助开发人员设置字符串格式。下面我们就来看一下为什么要少用 string.Format 而要多用内插字符串,以及内插字符串的优缺点。 String.Format 在 C# 6.0 以前我们会经常用到这个,优点在这里我就不一一阐述了,这里我们主要说一下它的缺点。
喵叔
2020/09/08
1.1K0
StringBuilder与String区别
StringBuilder的内容是可变的 String内容是不可变的 故在用String进行字符串的拼接和反转时耗费内存空间,而StringBuilder内容是可变的,故并不浪费内存空间 S
用户8785253
2021/07/06
4470
StringBuilder与String区别
API、String、StringBuilder
​ next() : 遇到了空格, 就不再录入数据了 , 结束标记: 空格, tab键
小炜同学
2022/08/20
6540
String,StringBuffer与StringBuilder的区别??
String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。 而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的: String S1 = “This is only a” + “ simple” + “ test”; StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”); 你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个 String S1 = “This is only a” + “ simple” + “test”; 其实就是: String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如: String S2 = “This is only a”; String S3 = “ simple”; String S4 = “ test”; String S1 = S2 +S3 + S4; 这时候 JVM 会规规矩矩的按照原来的方式去做
全栈程序员站长
2022/09/07
2090
StringBuilder,String与StringBuffer 的异同
引言 根据我在网上查到的资料显示,这三者的区别主要是: String:字符串常量 StringBuffer:字符创变量(多线程) StringBuilder:字符创变量(单线程) 对String的操作表面上看是对同一个变量的操作,但实际上是新建了一个常量,然后修改对象的引用。基于这样的机制,需要不停的GC旧的对象,其效率也很低下。 而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的
用户1665735
2018/06/21
4850
String、StringBuffer与StringBuilder之间区别
简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,这样不仅效率低下,而且大量浪费有限的内存空间,所以经常改变内容的字符串最好不要用 String 。因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
全栈程序员站长
2022/09/07
2660
String、StringBuffer与StringBuilder之间区别
【每日小知识】String StringBuffer 、 StringBuilder 、String
简单的来说:String 类中使用 final 关键字修饰字符数组来保存字符串,private final char value[],所以 String 对象是不可变的。而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串char[]value 但是没有用 final 关键字修饰,所以这两种对象都是可变的。
Python进击者
2020/02/14
6160
【每日小知识】String StringBuffer 、 StringBuilder 、String
StringBuffer与StringBuilder的区别_String
因为String是不可变的,StringBuffer 和 StringBuilder 它们都是可变的字符串,不过它们之间的区别是 Java 初中级面试出现几率十分高的一道题。这么简单的一道题,栈长在最近的面试过程中,却经常遇到很多求职者说反,搞不清使用场景的情况。
全栈程序员站长
2022/09/29
2460
StringBuffer与StringBuilder的区别_String
String.Format使用方法
private const string _extraClause = ” AND C_INTERNSHIPORG_INTERNSHIPID = {0}”;
全栈程序员站长
2021/11/24
9840
String、StringBuffer与StringBuilder之间区别
最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下。
DencyCheng
2018/11/05
4090
String、StringBuilder和StringBuffer
在之前的文章「 Java 中 String 类为什么要设计成不可变的?」中对 String 的特性已经作了总结。这篇文章主要介绍另外两个常用的类 StringBuilder 和 StringBuffer 的特性。
用户3596197
2018/10/15
4250
关于String.format(String format, Object... args)
通过查看源码可以看到这个方法是从 JDK 1.5 开始引入的,底层是调用了 java.util.Formatter 类的 format 方法。
Li_XiaoJin
2022/06/10
8260
String、StringBuilder和StringBuffer
  String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。以下面一段代码为例:
全栈程序员站长
2022/07/01
2600
‘StringBuilder‘ can be replaced with ‘String‘
报告StringBuffer,StringBuilder或StringJoiner的所有用法,这些用法可以用单个java.lang.String串联代替。使用String连接可以使代码更短,更简单。例:
JavaEdge
2021/02/23
8030
String、StringBuilder以及StringBuffer
参考于:https://www.cnblogs.com/dolphin0520/p/3778589.html
收心
2022/01/14
2180
String、StringBuilder以及StringBuffer
转:String,StringBuffer与StringBuilder的区别??
String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全)  简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。  而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:  String S1 = “This is only a” + “ simple” + “ test”;  StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);  你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个  String S1 = “This is only a” + “ simple” + “test”; 其实就是:  String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如: String S2 = “This is only a”; String S3 = “ simple”; String S4 = “ test”; String S1 = S2 +S3 + S4; 这时候 JVM 会规规矩矩的按照原来的方式去做
Dar_Alpha
2018/09/03
5040
String与StringBuffer与StringBuilder之间的差异
参考链接: Java stringbuffer和stringbuilder之间的差异
用户7886150
2021/02/26
9620
String Stringbuilder Stringbuffer异同
字符串在编程中使用的非常频繁,同时又是面试中的常见题型,那么我们的对字符串相关类String,StringBuilder,StringBuffer的理解真的正确吗?今天就通过对三个类源码的阅读,来进一步加强理解。
呼延十
2019/06/26
4930
String Stringbuilder Stringbuffer异同
String.format()的详细用法
问题 在开发的时候一段字符串的中间某一部分是需要可变的 比如一个Textview需要显示”XXX用户来自 上海 年龄 21 性别 男”  其中的 XXX 是用户名 每个用户也是不一样的  地区 上
Twcat_tree
2022/11/30
3860
Java基础—String、StringBuffer、StringBuilder
本文主要介绍了Java中字符串的各种操作,包括字符串拼接、拆分、查找、替换和反转等。同时,还介绍了StringBuilder和StringBuffer的区别以及字符串缓存对性能的影响。
Java后端工程师
2017/12/13
7790
Java基础—String、StringBuffer、StringBuilder

相似问题

在C#中,如何使用string.Empty或String.Empty字符串?

2729

在Java中如何将“ArrayList <String>转换为”String []?

21.5K

为什么说String不可变?

2247

Batch file: Find if substring is in string (not in a file)

2865

std :: wstring 和 std :: string的差异?

11.3K
相关问答用户
腾讯云TDP | TDP会员擅长3个领域
平安资管 | 架构师擅长4个领域
擅长3个领域
擅长5个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档