为什么StringBuilder的默认容量是16个字符?这是某种优化吗?
StringBuilder builder = new StringBuilder();
Console.WriteLine("builder capacity: '{0}'", builder.Capacity);
Run Code Online (Sandbox Code Playgroud)
输出:
builder capacity: '16'
Run Code Online (Sandbox Code Playgroud) 假设我有一个ArrayList < String >namedarr和一个StringBuildernamed buf,我使用以下方法将内容添加到bufto arr。
if ( !buf.toString( ).equals( "" ) ) { //allow only non-empty Strings.
arr.add( buf.toString( ) );
}
Run Code Online (Sandbox Code Playgroud)
但它调用了buf.toString( )两次。我不想在我的代码中出现这种情况。此外,还有其他(简短或简单或有效或其他)方法来实现这一目标吗?
编辑:另外,我在循环中执行此操作,那么这有效吗?
我有一个(大)模板,想要替换多个值。替换需要不区分大小写。还必须能够拥有模板中不存在的键。
例如:
[TestMethod]
public void ReplaceMultipleWithIgnoreCaseText()
{
const string template = "My name is @Name@ and I like to read about @SUBJECT@ on @website@, tag @subject@";
const string expected = "My name is Alex and I like to read about C# on stackoverflow.com, tag C#";
var replaceParameters = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("@name@","Alex"),
new KeyValuePair<string, string>("@subject@","C#"),
new KeyValuePair<string, string>("@website@","stackoverflow.com"),
// Note: The next key does not exist in template
new KeyValuePair<string, string>("@country@","The Netherlands"),
};
var actual = ReplaceMultiple(template, …Run Code Online (Sandbox Code Playgroud) 假设我们有一个 StringBuilder 和一个 double。现在想追加双精度。如果双精度数可以表示为整数(例如 3.0、5.0 等),我想将其添加为整数,否则添加为双精度数。
实现这一点的第一个方法是:
StringBuilder sb = new StringBuilder();
double d = 3.5;
if (d % 1 == 0) sb.append((int) d);
else sb.append(d);
System.out.println(sb.toString());
Run Code Online (Sandbox Code Playgroud)
这个工作仍然很好,当d是3.03 时将追加,如果d是3.53.5 将追加。
现在我想用三元运算符快速完成此操作:
StringBuilder sb = new StringBuilder();
double d = 3.5;
sb.append(d % 1 == 0 ? (int) d : d);
System.out.println(sb.toString());
Run Code Online (Sandbox Code Playgroud)
所以现在我有一个问题,每次,如果是双倍,3.0或者3.5它将被添加为双倍值!仅当我理论上强制执行trueAND时false它有效时......但每次都这不是我想要的。这里有什么问题吗?为什么三元运算符不起作用?
我们正在尝试创建一个显示用户消息的应用程序。以下是一些消息示例:
我们从数据库中获取这些字符串。(我们的第一次尝试是创建一个具有不同功能的类,它给我们返回字符串。我们使用了字符串插值。然后我们意识到这不是一个好的选择,因为用户无法自己创建内容/字符串,而我们每次我们在此类中创建更多字符串时都必须更新我们的应用程序。)
我们知道的选项:
String.format:类似的东西:
string result = string.Format("{1} blabal...- {2}blabla... {3}", value1, value2, value3);
这里的问题是:我们想要使用具有不同输入位置的字符串,就像我们的示例一样。有时第一个是球员姓名,有时是俱乐部名称......
问题:
这可能是重复的,但我无法在任何地方找到正确的答案。如何在不使用+运算符的情况下在 GoLang 中添加字符串(这被认为很慢)?
我知道我可以使用但只能附加来附加到字符串。如果我想前置,我必须在前缀中写入后缀字符串,如下所示:bytes.BufferWriteString
package main
import (
"bytes"
"fmt"
)
func main() {
var b bytes.Buffer
b.WriteString("W")
b.WriteString("o")
b.WriteString("r")
b.WriteString("l")
b.WriteString("d")
var a bytes.Buffer
a.WriteString("Hello ")
a.WriteString(b.String())
fmt.Println(a.String())
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
我不明白javadoc 中的这一行(在“API 注释”副标题下):
StringBuilder 实现 Comparable 但不覆盖 equals。因此,StringBuilder 的自然顺序与 equals 不一致。
我是 Java 的初学者,你能用简单的方式解释一下吗?
Fortify 客户端给出了字符串生成器的错误和建议,
问题代码:
StringBuilder sb=new StringBuilder();
sb.append(request.getParameter("id"));
sb.append(request.getParameter("name"));
sb.append(request.getParameter("question"));
sb.append(request.getParameter("answer"));
Run Code Online (Sandbox Code Playgroud)
强化错误:
用户控制的数据附加到使用默认构造函数初始化的 StringBuilder 实例
将用户控制的数据附加到使用默认支持字符数组大小 (16) 初始化的 StringBuilder 或 StringBuffer 实例可能会导致应用程序在调整基础数组大小以适应用户数据时消耗大量堆内存。当数据追加到 StringBuilder 或 StringBuffer 实例时,该实例将确定支持字符数组是否有足够的可用空间来存储数据。如果数据不适合,StringBuilder 或 StringBuffer 实例将创建一个新数组,其容量至少是先前数组大小的两倍,而旧数组将保留在堆中,直到被垃圾收集。攻击者可以使用此实现细节来执行拒绝服务 (DoS) 攻击。
Fortify 建议: 使用预期附加数据大小的初始容量初始化 StringBuilder 或 StringBuffer,以减少调整后备数组大小的次数。在将数据附加到 StringBuilder 或 StringBuffer 实例之前检查数据的大小。
...
private final int BUFFER_CAPACITY = 5200;
StringBuilder sb = new StringBuilder(BUFFER_CAPACITY);
...
final String lineSeparator = System.lineSeparator();
String[] labels = request.getParameterValues("label");
for (String label : labels) {
if (label.length() + lineSeparator.length() + sb.length()<= sb.capacity()) {
sb.append(label).append(lineSeparator);
} else { …Run Code Online (Sandbox Code Playgroud) 我有一个遗留Java文件,它使用字符串连接来构建巨大的String对象.这是一个严重的性能问题.是否存在这样的方法,它执行以下操作
String test="I am a very bad programmer"
+"to use concatenation"
+"Instead of StringBuilder"
+" or StringBuffer";
Run Code Online (Sandbox Code Playgroud)
至
StringBuilder strBuilder= new StringBuilder();
strBuilder.append("I am a bad programmer");
strBuilder.append("to use concatenation");
strBuilder.append("Instead of StringBuilder");
strBuilder.append(" or StringBuffer");
String str= strBuilder.toString();
Run Code Online (Sandbox Code Playgroud)
基本上我需要一个java中的存根只是为了给一个String实例化作为输入并转换成StringBuilder.Anybody过去试过这个?
什么命名空间StringBuilder属于?
我键入:
using System.Text.StringBuilder;
Run Code Online (Sandbox Code Playgroud)
但智能感知,不会让我输入StringBuilder.