可能重复:
String vs StringBuilder
我刚刚重温了一些我曾经拿过VB.NET的书.我不确定我是否已经掌握了这一点,了解StringBuilder是如何/是什么.
使用指南是什么?如果要连接2个字符串或50个字符串,最好使用它吗?
或者当总字符串长度大于128个字符时?
或者,只要您使用它来将字符串添加到一起,您会看到性能优势吗?
在哪种情况下,最好使用StringBuilder实例来构建SQL语句string.format("Select * from x where y = {0}",1)?
总是让我感到震惊的是,声明另一个变量并包含名称空间对小字符串连接不利,但我现在不确定.
对不起,很多文档告诉你要使用什么,而不是什么是最好的.
我是设计模式的新手,所以我有一个关于Builder模式的问题.今天我听说Builder Pattern与StringBuilderJava中的类C#不同.我知道Builder Pattern的主要目标是在几个步骤中创建复杂的对象......我认为这是StringBuilder用它的方法制作的Append...所以我很难找到差异......
你能告诉我是否真的有什么不同,如果是......它是什么:)?
我需要创建一个大型文本文档.我目前StringBuilder用来制作文件然后打电话File.WriteallText(filename,sb.ToString).不幸的是,这现在开始抛出内存异常.
有没有更好的方法来流式传输StringBuilder文件,还是我应该使用其他一些技术?
我有一个StringBuffer在for循环外部和内部for循环初始化我连接一些字符串.
我收到了警告
'StringBuffer stringBuffer'可以声明为'StringBuilder'
和
字符串连接作为'stringbuilder.append()'调用的参数
然后我将StringBuffer更改为StringBuilder,因为它比StringBuffer快.现在我收到了警告
字符串连接作为'stringbuilder.append()'调用的参数
示例代码:
public static String stringConcat(String[] words) {
StringBuffer stringBuffer = new StringBuffer();
for (String word : words) {
stringBuffer.append(word).append(" ");
}
return stringBuffer.toString();
}
Run Code Online (Sandbox Code Playgroud)
为什么我收到这些警告.
编辑实际代码:
stringBuffer.append(word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase()).append(" ");
Run Code Online (Sandbox Code Playgroud) java stringbuilder android string-concatenation stringbuffer
我们大多倾向于遵循上述最佳实践.
但是,即使有足够的可用内存, StringBuilder也可能抛出OutOfMemoryException.它抛出OOM异常,因为它需要"连续的内存块".
一些链接供参考 StringBuilder OutOfMemoryException
而且还有更多......
你们中有多少人遇到过这个问题或意识到你们做了什么来解决这个问题?
有什么我想念的吗?
PS:我没有意识到这一点.
我已经改写了这个问题.
***同样的事情与手动连接一起使用(我将验证这一点并更新SO).引起我担忧的另一件事是系统中有足够的内存.这就是我在这里提出这个问题的原因,以检查是否有人遇到这个问题或者代码有什么严重错误.
一年前我将程序从Delphi 4转换为Delphi 2009,主要是为了跳转到Unicode,同时也获得了Delphi多年来改进的好处.
我的代码当然是所有遗留代码.它使用短字符串,现在已经很方便地变成了长Unicode字符串,并且我已经将所有旧的ANSI函数更改为新的等效函数.
但是在Delphi 2009中,他们引入了TStringBuilder类,可能是在StringBuilder类.NET之后建模的.
我的程序执行了大量的字符串处理和操作,并且可以同时将数百兆字节的大字符串加载到内存中.
我不太了解Delphi的TStringBuilder实现,但我听说它的一些操作比使用默认字符串操作更快.
我的问题是我是否值得通过努力并将我的标准字符串转换为使用TStringBuilder类.这样做我会得到什么和失去什么?
感谢您的回答并引导我得出结论,除非需要.NET兼容性,否则不要打扰.
在他关于Delphi 2009 String Performance的博客中,Jolyon Smith说:
但它看起来好像TStringBuilder主要作为.NET兼容性工具,而不是为Win32应用程序的开发人员提供任何真正的好处,可能除了希望或需要单一来源Win32/.NET代码库的开发人员字符串处理性能不是一个问题.
我注意到该capacity方法在StringBuilder没有逻辑方式的情况下返回容量...有时它的值等于字符串长度,其他时间它更大......
知道哪个是逻辑的等式?
可能重复:
在python中反转正则表达式
我想我遇到的问题听起来比它更容易......我不太确定.我想定义一个正则表达式,我想构建一些匹配它的字符串.
我可以导入任何具有此功能的模块吗?优选地,不是使用re.search或的蛮力方法re.match.必须有一种更优雅的方式来做到这一点.
为了连接,String我们经常使用StringBuilder而不是String+ String,但我们也可以String.format通过给定的语言环境,格式和参数来返回格式化的字符串.
例子:
使用StringBuilder连接字符串
String concatenateStringWithStringBuilder(String name, String lName, String nick) {
final StringBuilder sb = new StringBuilder("Contact {");
sb.append(", name='").append(name)
.append(", lastName='").append(lName)
.append(", nickName='").append(nick)
.append('}');
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
使用StringFormat连接字符串:
String concatenateStringWithStringFormat(String name, String lName, String nick) {
return String.format("Contact {name=%s, lastName=%s, nickName=%s}", name, lName, nick);
}
Run Code Online (Sandbox Code Playgroud)
在性能方面,String.Format效率如何StringBuilder?哪一个更好地连接字符串,为什么?
UPDATE
我检查了类似的问题,但没有回答我的问题.到目前为止,我已经习惯StringBuilder连接字符串,我应该使用它吗?或者我应该使用String.format?问题是哪个更好,为什么?
知道String实现了CharSequence接口,那么为什么StringBuilder有一个CharSequence的构造函数和另一个String的构造函数?javadoc中没有指示!
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {...}
Run Code Online (Sandbox Code Playgroud)
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
...
/**
* Constructs a string builder initialized to the contents of the
* specified string. The initial capacity of the string builder is
* {@code 16} plus the length of the string argument.
*
* @param str the initial contents of the buffer.
*/
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
/**
* Constructs a string builder …Run Code Online (Sandbox Code Playgroud)