我问的问题与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
我可以通过互联网和Sun Java获得更多.但是需要在一个例子的帮助下获得明显的差异?
StringBuffer 要么 StringBuilder
什么是差异,什么时候更喜欢考虑响应时间.
我知道StringBuilder应优先于String,因为String将保存在常量字符串池中,并为其分配新值不会覆盖以前的值.但是,StringBuilder是一个覆盖其先前值的对象.
另外如果我在Hibernate的支持类中有String类型的变量,我应该使用StringBuilder吗?怎么样?
...
Result result = (Result) criteria.list().get(0);
class Result{
String name;
String fname;
...
}
Run Code Online (Sandbox Code Playgroud)Java StringBuilder和StringBufferJava 之间的差异已经有很好的文档记录,并且在StackOverflow中也有所涉及.
基本上,StringBuilder是一个非同步副本StringBuffer,具有几乎相同的接口,因为它旨在作为更快速的替代品StringBuffer.它们的API实际上是相同的,它们实际上是当前JDK中相同的不可访问的抽象类的子类.
因此,我想知道的一件事就是它们与公众无关.让两个类实现一个公共接口或甚至StringBuffer作为子类都有StringBuilder意义,允许两个类共享代码的存在.
为什么这种被迫分离呢?是不是程序员不会无意中将线程安全与线程不安全的代码混合在一起?或者它只是一个设计疏忽,现在将继承到永恒的结束?
编辑:
为了说清楚:我可以推测为什么事情是这样的,但我希望具体参考实际的决定,例如在JSR过程中.对我来说,任何可能会对某些情况产生影响的事情偶然会引起一定程度的困难.
编辑2:
两个班级Appendable完全实现的事实让我大吃一惊.可能是因为该特定界面对于大多数目的而言是无用的 - 它只能附加单个字符或准备好的对象,就是这样.在大多数情况下,它并不比两个类都是子类更有用Object.
编辑3:
那么,以下是来自半官方来源的确切问题的基本原理:
图书馆团队评估:
根据设计,StringBuffer和StringBuilder不共享公共超类型.它们不是替代品:一个是错误(StringBuffer),另一个(StringBuilder)是它的替代品.
显然,在某些情况下,缺少常见的超类型会减慢从StringBuffer到StringBuilder的希望迁移.另一方面,通过添加一个共同的超类型,我们将把我们过去的错误带入公共界面并与我们永远保持一致.这不仅会减慢迁移速度:它会使迁移脱轨.
尝试使用提供的Java客户端谷歌愿景通过Google Vision注释图像时,我遇到了异常.
特别是批量client.batchAnnotateImages发生的代码:
public void processOCR(byte[] file)
{
List<AnnotateImageRequest> requests = new ArrayList<>();
ByteString imageByteString = ByteString.copyFrom(file);
Image img = Image.newBuilder().setContent(imageByteString).build();
Feature feat = Feature.newBuilder().setType(Type.DOCUMENT_TEXT_DETECTION).build();
AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build();
requests.add(request);
try (ImageAnnotatorClient client = ImageAnnotatorClient.create())
{
BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests);
List<AnnotateImageResponse> responses = response.getResponsesList();
client.close();
//visionResultsDTO result = new visionResultsDTO();
String ParagraphText = "";
for (AnnotateImageResponse res : responses) {
if (res.hasError()) {
//throw exception.
return;
}
// For full list of available annotations, see http://g.co/cloud/vision/docs
TextAnnotation annotation = res.getFullTextAnnotation(); …Run Code Online (Sandbox Code Playgroud) 内部实现上StringBuffer与StringBuilder Vs StringTokenizer的区别是什么.何时使用这些.请等待答案.
我也正在浏览源代码.
我在Java 1.6中编写了一个webapp并在tomcat中运行它.虽然我没有做任何明确的线程,但我想知道Spring和Tomcat幕后发生了什么.我会使用StringBuilder而不是StringBuffer遇到任何问题吗?
我知道StringBuffer和StringBuilder之间的区别.在这里阅读!
通常,正如javadoc所说,
在可能的情况下,建议首先使用此类优先于StringBuffer,因为在大多数实现中它会更快.
但是,StringBuilder的javadoc也说:
StringBuilder多个线程使用的实例不安全.如果需要这样的同步,则建议使用{@link java.lang.StringBuffer}
所以,我想知道,StringBuffer首选的情况真的存在吗?由于可变字符串主要用于单个线程,任何人都可以给我一个并发的现实场景,首选StringBuffer吗?
我正在学习Java,我想知道在这里修改字符串的最佳方法是什么(性能和学习Java中的首选方法).假设您循环遍历字符串并检查每个字符/对字符串中的索引执行某些操作.
我是否使用StringBuilder该类,或将字符串转换为char数组,进行修改,然后将char数组转换回字符串?
示例StringBuilder:
StringBuilder newString = new StringBuilder(oldString);
for (int i = 0; i < oldString.length() ; i++) {
newString.setCharAt(i, 'X');
}
Run Code Online (Sandbox Code Playgroud)
char数组转换的示例:
char[] newStringArray = oldString.toCharArray();
for (int i = 0; i < oldString.length() ; i++) {
myNameChars[i] = 'X';
}
myString = String.valueOf(newStringArray);
Run Code Online (Sandbox Code Playgroud)
每种不同方式的优缺点是什么?
我认为这样StringBuilder会更有效率,因为每次更新索引时转换为char数组都会生成数组的副本.
我正在运行J2ME应用程序并遇到一些严重的内存问题.
所以我构建了另一个步骤来清除巨大的输入字符串并处理其数据并清除它.但是,直到我开始并没有解决问题input = null,而不是input = "".
在内存管理方面不应该是一样的吗?有人可以解释一下我的区别吗?
谢谢,
rAyt
for(int x = 0; x <= ChunksPartCount; x++)
{
_model.setLoading_bar_progress((x * ChunkSize));
input += web_service.FullCompanyListChunksGet(x, ChunkSize);
if((x * ChunkSize) > 5000)
{
ReadXML(input);
input = null;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我仍然希望将答案标记为解决方案.我认为mmyers的言论正朝着正确的方向发展.
java ×10
stringbuffer ×5
concurrency ×1
hibernate ×1
java-6 ×1
java-me ×1
jpa ×1
maven ×1
orm ×1
spring-boot ×1
string ×1