我刚刚编写了一个小单元测试,其中我使用了StringBuilder.
var stringBuilder = new StringBuilder();
stringBuilder.Append("Foo");
Assert.AreEqual(stringBuilder, "Foo");
Run Code Online (Sandbox Code Playgroud)
此测试将失败.
Expected: <Foo>
But was: "Foo"
Run Code Online (Sandbox Code Playgroud)
但是,如果我将Assert更改为
Assert.AreEqual(stringBuilder.ToString(), "Foo");
Run Code Online (Sandbox Code Playgroud)
测试将通过.
那么隐式调用和ToString()方法的显式调用之间有什么区别?或者/这些括号(<>)代表什么?
在我下面显示的try/catch中,应用程序循环遍历用户输入文本框的单词.(我已经证实这个部分有效.)当它循环通过单词时,它将每个单词传递给下面的函数.
private string runQuery(string data)
{
// Step 1 - Declare the query and parameters
SqlCeConnection connection = new SqlCeConnection(@"Data Source=keywordDB.sdf");
SqlCeCommand cmd = new SqlCeCommand("SELECT abbrev, description FROM abbreviations WHERE abbrev LIKE @abbrev", connection);
cmd.Parameters.AddWithValue("@abbrev", data);
SqlCeDataReader reader;
try
{
// Step 2 - Opens the connection
connection.Open();
// Step 3- Execute query and assign the data to abbrevQueryResult and results
reader = cmd.ExecuteReader();
reader.Read();
abbrevQueryResult = reader[0].ToString();
results = reader[1].ToString();
// Step 4 compare abbrevQueryResult to data entered …Run Code Online (Sandbox Code Playgroud) 我想在String中插入多个单词,但offset相对于原始String:
StringBuffer sb = new StringBuffer("abcdefghijk");
sb.insert(3,"123");
sb.insert(5,"456");
System.out.println(sb);
Run Code Online (Sandbox Code Playgroud)
结果:
abc124563defghijk
Run Code Online (Sandbox Code Playgroud)
我希望结果是:
abc123de456fghijk
Run Code Online (Sandbox Code Playgroud)
我能怎么做?谢谢你的任何建议.
想知道什么是最好的使用方式:
StringBuilder query = new StringBuilder(" Select * from mytable t where ");
for ( Object object : objects ) {
query.append(" t.field = " + object.field ); // this one OR
query.append( object.field ); // this one?
}
Run Code Online (Sandbox Code Playgroud)
不确定推荐使用哪一个.
为什么以下代码将产生一个很好的ClassCastException:
public static void main(String []args){
StringBuilder s1 = new StringBuilder("quaqua");
StringBuilder s12= (StringBuilder)s1.subSequence(0,3);
System.out.println(s12);
}
Run Code Online (Sandbox Code Playgroud)
而以下代码(用String替换StringBuilder):
public static void main(String []args){
String s1 = new String("quaqua");
String s12= (String)s1.subSequence(0,3);
System.out.println(s12);
}
Run Code Online (Sandbox Code Playgroud)
工作良好?;
我知道有方法substring(int begin, int end);然而我只是好奇为什么使用StringBuilder(实现CharSequence)的强制转换不起作用而使用String工作.
提前致谢.
我需要在循环中附加大量字符串,这将创建一个非常长的字符串.
1GB应该足够长以存储字符串,因此我这样做:
var sb = new StringBuilder(1024 * 1024 * 1024);
Run Code Online (Sandbox Code Playgroud)
但收到此错误
'System.OutOfMemoryException' was thrown
Run Code Online (Sandbox Code Playgroud)
任何追加长串的建议?
我正在为MySQL数据库编写备份工具.这些工具将从数据库导出数据并写入文本文件.数据包含BLOB和TEXT数据类型.所以,期待很长的字符串.
这是代码:代码更新1
var conn = new MySqlConnection(Program.ConnectionString);
var cmd = new MySqlCommand();
cmd.Connection = conn;
conn.Open();
cmd.CommandText = selectSQL;
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
var sb = new StringBuilder(1024 * 1024 * 1024);
for (int i = 0; i < rdr.FieldCount; i++)
{
if (sb.Length > 0)
sb.AppendFormat(separator);
if (rdr[i].GetType() == typeof(byte[]))
{
sb.AppendFormat(ConvertByteArrayToHexString((byte[])rdr[i]));
}
else
sb.AppendFormat(rdr[i] + "");
}
WriteToFile(sb.ToString()); …Run Code Online (Sandbox Code Playgroud) VB.NET有一个方法,就像java一样,附加到StringBuilder类型的对象 但是我可以在这个对象之前添加(我的意思是在stringbuilder值之前添加一些字符串,而不是之后).这是我的代码:
'Declare an array
Dim IntegerList() = {24, 12, 34, 42}
Dim ArrayBefore As New StringBuilder()
Dim ArrayAfterRedim As New StringBuilder()
ArrayBefore.Append("{")
For i As Integer = IntegerList.GetLowerBound(0) To IntegerList.GetUpperBound(0)
ArrayBefore.Append(IntegerList(i) & ", ")
Next
' Close the string
ArrayBefore.Append("}")
'Redimension the array (increasing the size by one to five elements)
'ReDim IntegerList(4)
'Redimension the array and preserve its contents
ReDim Preserve IntegerList(4)
' print the new redimesioned array
ArrayAfterRedim.Append("{")
For i As Integer = IntegerList.GetLowerBound(0) To …Run Code Online (Sandbox Code Playgroud) 我知道Java的ByteBuffer.clear()并不是真的要清除ByteBuffer中的所有数据,所以当我每次都使用StringBuilder.append()字符串时,最终结果总是在ByteBuffer中附加所有剩余的字符,这是旧的数据.写,所以如何解决这个问题?
int byteRead = -1;
int readCount = 0;
int BUFFER_SIZE = 256;
StringBuilder sb = new StringBuilder();
ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
ReadableByteChannel readableByteChannel = Channels.newChannel(is);
while ((byteRead = readableByteChannel.read(buffer)) > 0 && readCount < 68) {
sb.append(new String(buffer.array(), "UTF-8"));
buffer.clear();
readCount++;
}
Run Code Online (Sandbox Code Playgroud) 我正在努力从StringBuilder中删除一些字符.该方法工作正常.但是,我希望通过Java-8流API实现相同的功能.目前的代码很冗长.有没有办法通过Java 8流API重构第二个方法removeCarryReturnsCharacters()?
private static StringBuilder readEntireFileUsingStream(Path filePath) throws IOException {
StringBuilder data = new StringBuilder(String.valueOf(Files.readAllLines(filePath, StandardCharsets.ISO_8859_1)));
return removeCarryReturnsCharacters(data);
}
private static StringBuilder removeCarryReturnsCharacters(StringBuilder fileData){
int endIndex = 1012;
String needToRemove = "";
long totDataChunkCount = fileData.length()/1014;
long delCounter = 1;
try{
while (delCounter < totDataChunkCount) {
needToRemove = fileData.substring(endIndex, endIndex + 2);
if (needToRemove.equals("^^")) {
fileData.delete(endIndex, endIndex + 2);
}
endIndex += 1012;
delCounter++;
}
}catch(StringIndexOutOfBoundsException exp){
throw exp;
}
return fileData;
}
Run Code Online (Sandbox Code Playgroud) 即使将内存大小设置为32 GB并仅将500 MB文件读入构建器,我也会从java.lang.StringBuilder.append中收到OutOfMemoryError。
java.lang.OutOfMemoryError: null
at java.base/java.lang.AbstractStringBuilder.hugeCapacity(AbstractStringBuilder.java:214) ~[na:na]
at java.base/java.lang.AbstractStringBuilder.newCapacity(AbstractStringBuilder.java:206) ~[na:na]
at java.base/java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:173) ~[na:na]
at java.base/java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:538) ~[na:na]
at java.base/java.lang.StringBuilder.append(StringBuilder.java:174) ~[na:na]
at com.github.loa.indexer.service.index.base64.Base64Encoder.encode(Base64Encoder.java:31) ~[classes/:na]
Run Code Online (Sandbox Code Playgroud) stringbuilder ×10
java ×5
string ×4
c# ×3
append ×1
bytebuffer ×1
charsequence ×1
java-8 ×1
java-stream ×1
mysql ×1
nio ×1
performance ×1
prepend ×1
stringbuffer ×1
tostring ×1
try-catch ×1
unit-testing ×1
vb.net ×1