我的问题是我是否使用 StringBuffer(或 StringBuilder),以及我是否多次在实例上调用 toString 方法。StringBuffer 每次都会返回新的 String 实例还是从 String 池中返回 String?(假设我在两次调用之间没有对 StringBuffer 进行任何更改)
看完之后 - '同步'是什么意思?我仍然无法理解为什么在线程安全的环境中StringBuffer比StringBuilder慢.StringBuffer必须做多少耗时的工作才能让它变慢?
java stringbuilder synchronization stringbuffer thread-safety
我正在Spring Controller中编写一个私有实用程序方法.
我需要使用StringBuffer或者StringBuilder.前者是线程安全的,后者不是,但后者要快得多.
基本上,它看起来像这样:
private String buildTextToDisplay() {
StringBuffer sb = new StringBuffer();
sb.append( ... );
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
显然,我不希望两个会话同时调用它并返回垃圾.
java stringbuilder multithreading stringbuffer thread-safety
您可以为使用一个或另一个更好,更快,更正确的变体提供什么参数.
第一个变种:
StringBuffer sql = new StringBuffer("SELECT DISTINCT f.ID ")
.append("FROM FIRST_TABLE F ")
.append("LEFT JOIN SECOND_TABLE s ON f.ID = s.F_ID ")
.append("WHERE ")
.append("F.BOOL = 1 ")
.append("AND S.DATE IS NOT NULL ")
.append("AND S.CLOSED = 0 ");
Run Code Online (Sandbox Code Playgroud)
第二种变体:
String sql = "SELECT DISTINCT f.ID " +
"FROM FIRST_TABLE F " +
"LEFT JOIN SECOND_TABLE s ON f.ID = s.F_ID " +
"WHERE "
"F.BOOL = 1 " +
"AND S.DATE IS NOT NULL " +
"AND S.CLOSED …Run Code Online (Sandbox Code Playgroud) 我有以下代码,我想删除最后一个附加的字符StringBuffer:
StringBuffer Att = new StringBuffer();
BigDecimal qty = m_line.getMovementQty();
int MMqty = qty.intValue();
for (int i = 0; i < MMqty;i++){
Att.append(m_masi.getSerNo(true)).append(",");
}
String Ser= Att.toString();
fieldSerNo.setText(Ser);
Run Code Online (Sandbox Code Playgroud)
我想删除最后一个值后的","(完成For循环后)
制作一个不可变对象是个坏主意Cloneable.这就是为什么 String不能克隆.不可变BigInteger并且BigDecimal也没有 Cloneable.
但是无法克隆可变的StringBuilder和StringBuffer!
这种决定背后的原因是什么?
是的,我可以使用"复制构造函数",new StringBuilder(CharSequence seq)但提供复制构造函数和禁止克隆的设计原则/推理是什么?
我是一名Java新手,但我是一名经验丰富的程序员(汇编程序,COBOL,C/C++,REXX)
我不明白为什么编译器给我以下内容:
[loading java\lang\Throwable.class(java\lang:Throwable.class)]
src\LU62XnsCvr.java:265: incompatible types
found : java.lang.String
required: java.lang.StringBuffer
Run Code Online (Sandbox Code Playgroud)
码:
message_data = "LU62XCE0513: Request File I/O Exception =" ;
Run Code Online (Sandbox Code Playgroud)
我定义message_data为:
static StringBuffer message_data = new StringBuffer();
Run Code Online (Sandbox Code Playgroud)
那么为什么我不能String在StringBuffer标签中放置一个简单的文字message_data?我的意思是两种类型String..对吗?
对于以下代码,我应该在静态方法中使用哪个类,StringBuilder或者StringBuffer?基于API,StringBuffer是线程安全的,但StringBuilder不是.
public static String getString(int[] arrs) {
StringBuilder sb = new StringBuilder(); //1
StringBuffer sb = new StringBuffer(); //2
for (int i : arrs) {
sb.append(i);
}
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码行:
return ROOT_USER_IMAGE_PATH + File.separator + userId
+ File.separator + nameWithoutExtension + "__"
+ new SimpleDateFormat("yyyyMMddhhmm").format(new Date())
+ extension;
Run Code Online (Sandbox Code Playgroud)
在代码审查中,我的同事说我用它替换了它StringBuilder.
我知道它会更快地运行,但我认为这种增强功能绝对是次要的,没有人能够感受到它.
当我们有大量的记忆时,你认为在现代情况下鲤鱼和这样的未成年人有什么意义?
我正在使用Stringbuffer来检索缓冲区的当前容量,我发现了非常奇怪的行为.
我在Java和Android下运行代码.
根据许多资源,我发现这个公式可以增加缓冲容量
如果字符数从其当前容量增加,则容量增加(oldcapacity*2)+2.例如,如果当前容量为16,则为(16*2)+ 2 = 34.
StringBuffer sb = new StringBuffer();
System.out.println(sb.capacity());
sb.append("Hello Hello Hello Hello");
System.out.println(sb.capacity());
System.out.println(sb.length());
Run Code Online (Sandbox Code Playgroud)
Java输出 -
default capacity = 16
increases capacity = 34
length = 23
Run Code Online (Sandbox Code Playgroud)
Android输出 -
default capacity = 16
increases capacity = 26
length = 23
Run Code Online (Sandbox Code Playgroud)
我无法理解这一点,如果有人知道这一点那么请帮助我.
提前致谢.