知道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) 我正在从多个部分构建一个字符串,并希望使用其中任何一个StringBuffer或StringBuilder这样做.从Java 5文档中,我发现StringBuilder在可能的情况下这是首选,但需要注意
StringBuilder多个线程使用的实例不安全.
从这个声明中,我理解我不应该有StringBuilder多个线程共享的单个实例.但是这个案子呢:
//Is this safe?
//foo() is called simultaneously by multiple threads
String foo(String a, String b) {
return new StringBuilder(a).append(b).toString();
}
Run Code Online (Sandbox Code Playgroud)
这里函数中可能同时存在多个线程,同时使用StringBuilder类(例如,静态变量的并发访问,如果有的话),但每个线程都有自己独立的实例StringBuilder.从文档中,我无法确定这是否算作多线程的使用.
我们如何重新赋值StringBuffer或StringBuilder变量的值?
StringBuffer sb=new StringBuffer("teststr");
Run Code Online (Sandbox Code Playgroud)
现在我必须将sb的值更改为"testString"而不清空内容.我正在寻找一种方法,可以直接执行此分配,而无需使用单独的内存分配.我认为我们只能在清空内容后才能执行此操作.
我有一个需要修剪的StringBuilder对象(即所有空格字符/ u0020及以下从任一端删除).
我似乎无法在字符串生成器中找到可以执行此操作的方法.
这就是我现在正在做的事情:
String trimmedStr = strBuilder.toString().trim();
Run Code Online (Sandbox Code Playgroud)
这给出了所需的输出,但它需要分配两个字符串而不是一个.在字符串仍在StringBuilder中时,是否更有效地修剪字符串?
我正在阅读此文档页面,http://developer.android.com/reference/android/util/Log.html.
这部分引起了我的注意:
提示:当你拨打电话时不要忘记
Log.v(TAG, "index=" + i);当您构建要传递给Log.d的字符串时,编译器使用StringBuilder并且至少发生三次分配:StringBuilder本身,缓冲区和String对象.实际上,还有另一个缓冲区分配和复制,对gc的压力更大.这意味着如果您的日志消息被过滤掉,那么您可能正在进行大量工作并产生大量开销.
这意味着Android编译器正在采用字符串连接(+)并将它们转换为StringBuilder和append语句.
我的假设是正确的还是更好地手动使用StringBuilder而不是字符串连接?
C#中是否有任何方法IndexOf或Contains.以下是代码:
var sb = new StringBuilder(mystring);
sb.Replace("abc", "a");
string dateFormatString = sb.ToString();
if (sb.ToString().Contains("def"))
{
sb.Replace("def", "aa");
}
if (sb.ToString().Contains("ghi"))
{
sb.Replace("ghi", "assd");
}
Run Code Online (Sandbox Code Playgroud)
你可能已经注意到我一次又一次地使用ToString(),我想避免它,因为它每次都在创建新的字符串.你能帮帮我怎样才能避免它?
我是java的初学者,这是我在Stackoverflow上的第一篇文章.虽然我的初始代码与此处的其他帖子类似,但我的问题与实现StringBuilder有关,所以这篇帖子的原因.
我创建了一个方法
**Initial code**
private static String padAgain(String result,int padNum)
{
String str = "";
for(int i = padNum; i >= 0; i--)
{
str = String.format("%" + padNum + "s", result).replace(" ", "*");
}
return str;
}
Run Code Online (Sandbox Code Playgroud)
使用String.format方法用空格(或特殊字符)填充字符串.我在我的程序中使用相同的方法来纠正数字.数字以2(单位数)开头,并以2的倍数(包含n个数字)增加,空格与数字的增加成反比.
以下是用于说明目的的输出:
Enter exponent value for base-2 - Enter 0 to exit:
128
Square 1: **************************************2 items
Square 2: **************************************4 items
Square 3: **************************************8 items
Square 4: *************************************16 items
Square 5: *************************************32 items
Square 6: *************************************64 items
Square 7: ************************************128 items
Square …Run Code Online (Sandbox Code Playgroud) 我有一个StringBuilder命名stb_Swap_Tabu用来存储课程的名称,我使用下面的方法找到一个过程:
stb_Swap_Tabu.ToString.Contains("CourseName")
Run Code Online (Sandbox Code Playgroud)
就我而言,性能是最重要的问题.有没有更快的方法?
我在Stream中读取youtube响应并将其转换为String.使用以下代码:
网址:http://gdata.youtube.com/feeds/api/users/cnn/uploads?&v = 2&max-results = 25 &alt = json
private String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
此代码在除Android 4.0设备之外的所有设备中都能正常运行.我得到以下logcat:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:278)
at …Run Code Online (Sandbox Code Playgroud) 检查是否StringBuilder以特定字符串结束的最佳(最短和最快)方法是什么?
如果我只想检查一个字符,这不是问题sb[sb.Length-1] == 'c',但如何检查它是否以更长的字符串结尾?
我可以考虑像循环"some string".Length和逐个读取字符之类的东西,但也许存在更简单的东西?:)
最后我想要像这样的扩展方法:
StringBuilder sb = new StringBuilder("Hello world");
bool hasString = sb.EndsWith("world");
Run Code Online (Sandbox Code Playgroud) stringbuilder ×10
java ×5
string ×5
android ×3
c# ×3
.net ×2
optimization ×1
padding ×1
performance ×1
stringbuffer ×1
vb.net ×1