字符串是不可变的,这意味着,一旦创建它们就无法更改.
那么,这是否意味着如果你用+ =附加的东西比你创建一个StringBuffer并附加文本那么需要更多的内存?
如果你使用+ =,每次必须保存在内存中时你会创建一个新的'对象',不是吗?
我目前正在尝试实现stringbuf的子类,以允许缓冲区为特定字符(在我的情况下为'\n')进行标记化,并在发生此字符时执行操作(之后将消息转储到记录器并清除缓冲区)案件).为了实现这个目标,我重写了sputc(实现了对'\n'的监视)和xsputn(确实使用了sputc,因为GCC实现默认情况下似乎没有这样做).出于调试目的,我让sputc写出传递给stdout的每个字符.
现在这是我的问题:如果我使用类似的东西
mystream << "Some text" << std::endl;
Run Code Online (Sandbox Code Playgroud)
sputc接收除了应该由std :: endl引入的'\n'之外的每个字符,因此不会执行预期的操作,因为'\n'没有被传递.如果我使用类似的东西
mystream << "Some text" << '\n';
Run Code Online (Sandbox Code Playgroud)
甚至
mystream << "Some text" << "\n" << std::flush;
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作,我的sputc实现获得'\n'字符.
所以我的问题是:两个代码行不应该对后面的stringbuf完全相同,如果没有,我必须覆盖哪些其他方法来获取'\n'?
我问的问题与StringBuilder和StringBuffer之间的差异有关, 但不一样.我想看看如果同时由两个线程修改StringBuilder会发生什么.
我写了以下课程:
public class ThreadTester
{
public static void main(String[] args) throws InterruptedException
{
Runnable threadJob = new MyRunnable();
Thread myThread = new Thread(threadJob);
myThread.start();
for (int i = 0; i < 100; i++)
{
Thread.sleep(10);
StringContainer.addToSb("a");
}
System.out.println("1: " + StringContainer.getSb());
System.out.println("1 length: " + StringContainer.getSb().length());
}
}
public class MyRunnable implements Runnable
{
@Override
public void run()
{
for (int i = 0; i < 100; i++)
{
try
{
Thread.sleep(10);
}
catch (InterruptedException e) …Run Code Online (Sandbox Code Playgroud) java stringbuilder multithreading synchronization stringbuffer
标题说明了一切.有没有办法从StringBuilder转换为byte []而不使用中间的String?
问题是我正在管理真正的大字符串(数百万个字符),然后我有一个循环,最后添加一个字符并获得字节[].将StringBuffer转换为String的过程使得这个循环非常非常慢.
有没有办法实现这个目标?提前致谢!
我可以通过互联网和Sun Java获得更多.但是需要在一个例子的帮助下获得明显的差异?
StringBuffer 要么 StringBuilder
什么是差异,什么时候更喜欢考虑响应时间.
Java StringBuilder和StringBufferJava 之间的差异已经有很好的文档记录,并且在StackOverflow中也有所涉及.
基本上,StringBuilder是一个非同步副本StringBuffer,具有几乎相同的接口,因为它旨在作为更快速的替代品StringBuffer.它们的API实际上是相同的,它们实际上是当前JDK中相同的不可访问的抽象类的子类.
因此,我想知道的一件事就是它们与公众无关.让两个类实现一个公共接口或甚至StringBuffer作为子类都有StringBuilder意义,允许两个类共享代码的存在.
为什么这种被迫分离呢?是不是程序员不会无意中将线程安全与线程不安全的代码混合在一起?或者它只是一个设计疏忽,现在将继承到永恒的结束?
编辑:
为了说清楚:我可以推测为什么事情是这样的,但我希望具体参考实际的决定,例如在JSR过程中.对我来说,任何可能会对某些情况产生影响的事情偶然会引起一定程度的困难.
编辑2:
两个班级Appendable完全实现的事实让我大吃一惊.可能是因为该特定界面对于大多数目的而言是无用的 - 它只能附加单个字符或准备好的对象,就是这样.在大多数情况下,它并不比两个类都是子类更有用Object.
编辑3:
那么,以下是来自半官方来源的确切问题的基本原理:
图书馆团队评估:
根据设计,StringBuffer和StringBuilder不共享公共超类型.它们不是替代品:一个是错误(StringBuffer),另一个(StringBuilder)是它的替代品.
显然,在某些情况下,缺少常见的超类型会减慢从StringBuffer到StringBuilder的希望迁移.另一方面,通过添加一个共同的超类型,我们将把我们过去的错误带入公共界面并与我们永远保持一致.这不仅会减慢迁移速度:它会使迁移脱轨.
我试图修改stringstream对象的stringbuffer而不必复制字符串,使用方法pubsetbuf,但它无法正常工作.我正在关注http://www.cplusplus.com/reference/iostream/streambuf/pubsetbuf/中的文档.这是我的示例代码:
#include <iostream>
#include <sstream>
int main(int argc, char* argv[])
{
std::stringstream stream("You say goodbye");
char replace[] = {"And I say hello"};
std::cout << stream.str() << std::endl; // Checking original contents
stream.rdbuf()->pubsetbuf(replace, 16); // Should set contents here
std::cout << stream.str() << std::endl; // But don't :(
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
You say goodbye
You say goodbye
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用stream.str(替换),但是这个方法复制'replace'的值,我不想复制.
我错过了什么?
更新:我正在使用VS2010
在这个例子中,StringBuffer实际上比StringBuilder更快,而我本来期望相反的结果.
这与JIT的优化有关吗?有谁知道为什么StringBuffer比StringBuilder更快,即使它的方法是同步的?
这是代码和基准测试结果:
public class StringOps {
public static void main(String args[]) {
long sConcatStart = System.nanoTime();
String s = "";
for(int i=0; i<1000; i++) {
s += String.valueOf(i);
}
long sConcatEnd = System.nanoTime();
long sBuffStart = System.nanoTime();
StringBuffer buff = new StringBuffer();
for(int i=0; i<1000; i++) {
buff.append(i);
}
long sBuffEnd = System.nanoTime();
long sBuilderStart = System.nanoTime();
StringBuilder builder = new StringBuilder();
for(int i=0; i<1000; i++) {
builder.append(i);
}
long sBuilderEnd = System.nanoTime();
System.out.println("Using + operator : …Run Code Online (Sandbox Code Playgroud) 我已经阅读了一些关于Java程序设计语言中的Strings和StringBuilders的好处和缺点的文章.在其中一篇文章中,作者写道:String.
现在我无法理解它的含义.能否请你告诉我的差异StringBuilder,StringBuffer以及String特别是在"线程安全"的情况下.(用代码描述可能非常好,但如果不可能,任何提示将不胜感激).
我想知道如何在数组末尾添加或附加新元素.是否有任何简单的方法可以在最后添加元素?我知道如何使用StringBuffer但我不知道如何使用它在数组中添加元素.没有ArrayList或列表我更喜欢它.我想知道StringBuffer是否适用于整数.
stringbuffer ×10
java ×8
string ×3
c++ ×2
append ×1
arrays ×1
bytearray ×1
endl ×1
immutability ×1
stl ×1
stringstream ×1