<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Kommentare zu: 03.08 StringBuffer und StringBuilder</title>
	<atom:link href="http://www.java-blog-buch.de/0308-stringbuffer-und-stringbuilder/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.java-blog-buch.de/0308-stringbuffer-und-stringbuilder/</link>
	<description>Ein Buch über Java Programmierung als Blog</description>
	<lastBuildDate>Tue, 10 Aug 2010 16:32:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>Von: Sebastian Würkner</title>
		<link>http://www.java-blog-buch.de/0308-stringbuffer-und-stringbuilder/comment-page-1/#comment-4373</link>
		<dc:creator>Sebastian Würkner</dc:creator>
		<pubDate>Fri, 19 Feb 2010 09:08:58 +0000</pubDate>
		<guid isPermaLink="false">http://www.java-blog-buch.de/?p=1660#comment-4373</guid>
		<description>Hallo Marc,

aus Sicht der Performance ist es besser einen &quot;zu großen&quot; StringBuilder anzulegen, da später kein aufwendiges Arrays.copyOf() statt finden muss. Aus Sicht der Ressourcen belegt ein StringBuilder dann aber auch sofort ein char Array der entsprechenden Initialgröße (hier 255). Dies ist aber vernachlässigbar.

Im Code zu AbstractStringBuilder kann man sich den Konstruktor auch anschauen:

&lt;pre&gt;&lt;code&gt;char value[];
...

AbstractStringBuilder(int capacity) {
  value = new char[capacity];
}&lt;/code&gt;&lt;/pre&gt;

Gruß
Sebastian</description>
		<content:encoded><![CDATA[<p>Hallo Marc,</p>
<p>aus Sicht der Performance ist es besser einen &#8220;zu großen&#8221; StringBuilder anzulegen, da später kein aufwendiges Arrays.copyOf() statt finden muss. Aus Sicht der Ressourcen belegt ein StringBuilder dann aber auch sofort ein char Array der entsprechenden Initialgröße (hier 255). Dies ist aber vernachlässigbar.</p>
<p>Im Code zu AbstractStringBuilder kann man sich den Konstruktor auch anschauen:</p>
<pre><code>char value[];
...

AbstractStringBuilder(int capacity) {
  value = new char[capacity];
}</code></pre>
<p>Gruß<br />
Sebastian</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Marc</title>
		<link>http://www.java-blog-buch.de/0308-stringbuffer-und-stringbuilder/comment-page-1/#comment-4372</link>
		<dc:creator>Marc</dc:creator>
		<pubDate>Fri, 19 Feb 2010 08:30:43 +0000</pubDate>
		<guid isPermaLink="false">http://www.java-blog-buch.de/?p=1660#comment-4372</guid>
		<description>Vielen Dank für die schnelle Antwort. 
Der Joshua Bloch schreibt, dass man den SB verwenden soll sobald mehr als 4 Strings verknüpft werden.
Zu der Kapazität noch eine Frage, falls man die Größe nicht einschätzen kann. Ist es besser einen &quot;leeren&quot; StringBuilder anzulegen oder einen vielleicht zu großen z.B. 255???</description>
		<content:encoded><![CDATA[<p>Vielen Dank für die schnelle Antwort.<br />
Der Joshua Bloch schreibt, dass man den SB verwenden soll sobald mehr als 4 Strings verknüpft werden.<br />
Zu der Kapazität noch eine Frage, falls man die Größe nicht einschätzen kann. Ist es besser einen &#8220;leeren&#8221; StringBuilder anzulegen oder einen vielleicht zu großen z.B. 255???</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Stefan Kiesel</title>
		<link>http://www.java-blog-buch.de/0308-stringbuffer-und-stringbuilder/comment-page-1/#comment-4370</link>
		<dc:creator>Stefan Kiesel</dc:creator>
		<pubDate>Thu, 18 Feb 2010 16:56:13 +0000</pubDate>
		<guid isPermaLink="false">http://www.java-blog-buch.de/?p=1660#comment-4370</guid>
		<description>Hallo Marc,

völlig egal ist es nicht. Wie am obigen Beispiel gesehen werden kann, würde der Compiler aus dem hier:

&lt;pre&gt;&lt;code&gt;String str = &quot;Simpler&quot;;
str += &quot; String&quot;;&lt;/code&gt;&lt;/pre&gt;

das hier machen

&lt;pre&gt;&lt;code&gt;String s = &quot;Simpler&quot;;
s = (new StringBuilder()).append(s).append(&quot; String&quot;).toString();&lt;/code&gt;&lt;/pre&gt;

Noch performanter wäre es natürlich, wenn man von Anfang an das hier schreiben würde

&lt;pre&gt;&lt;code&gt;StringBuilder s = new StringBuilder(&quot;Simpler&quot;);
s.append(&quot; String&quot;);&lt;/code&gt;&lt;/pre&gt;

Aber bei so etwas würde ich die Lesbarkeit (die bei der Verwendung von &lt;code&gt;String&lt;/code&gt; deutlich höher sein sollte) über den minimalen Performancevorteil stellen.

Um die zweite Frage zu beantworte, werfen wir am Besten einen Blick in den Java Sourcecode. Was passiert, wenn ein weiterer &lt;code&gt;String&lt;/code&gt; an den &lt;code&gt;StringBuilder&lt;/code&gt; via &lt;code&gt;append&lt;/code&gt; angehängt wird? Die Lösung befindet sich im Sourcecode der Klasse &lt;code&gt;AbstractStringBuilder&lt;/code&gt; von welcher der &lt;code&gt;StringBuilder&lt;/code&gt; abgeleitet ist.

&lt;pre&gt;&lt;code&gt;public AbstractStringBuilder append(String str) {
  if (str == null) str = &quot;null&quot;;
  int len = str.length();
  if (len == 0) return this;
  int newCount = count + len;
  if (newCount &gt; value.length)
    expandCapacity(newCount);
  str.getChars(0, len, value, count);
  count = newCount;
  return this;
}&lt;/code&gt;&lt;/pre&gt;

Für die Frage ist nur die Zeile 

&lt;pre&gt;&lt;code&gt;if (newCount &gt; value.length)
  expandCapacity(newCount);&lt;/code&gt;&lt;/pre&gt;

relevant. Was paassiert, wenn die neue Größe des &lt;code&gt;StringBuilders&lt;/code&gt; die Alte übersteigt?

&lt;pre&gt;&lt;code&gt;void expandCapacity(int minimumCapacity) {
  int newCapacity = (value.length + 1) * 2;
  if (newCapacity &lt; 0) {
    newCapacity = Integer.MAX_VALUE;
  } else if (minimumCapacity &gt; newCapacity) {
    newCapacity = minimumCapacity;
  }
  value = Arrays.copyOf(value, newCapacity);
}&lt;/pre&gt;&lt;/code&gt;

Die Kapazität wird um das Doppelte erhöht. Wird der Wertebereich des &lt;code&gt;Integers&lt;/code&gt; überschritten, ist die neue Kapazität gleich der maximalen Größe eines &lt;code&gt;Integers&lt;/code&gt;. Außerdem wird noch überprüft, ob die Verdoppelung der Kapazität für die neue Größe ausreicht. Ist dies nicht der Fall, wird die aktuelle Größe gleich der neuen Größe gesetzt. Abschließend wird das alte Array, welches den Inhalt des &lt;code&gt;StringBuilders&lt;/code&gt; beinhaltet, in ein neues, an die neue Größe angepasstes, Array kopiert.

Der &quot;+16&quot;-Mythos resultiert daraus, dass beim Anlegen eines neuen &lt;code&gt;StringBuilders&lt;/code&gt; automatisch die Kapazität auf &quot;Länge des Initial-&lt;code&gt;Strings&lt;/code&gt;&quot; + 16 gesetzt wird.

Dennoch ist es optimal, die ungefähre Kapazität des &lt;code&gt;StringBuilders&lt;/code&gt; im Voraus abzuschätzen - sofern möglich.

Ich hoffe ich konnte helfen. Ansonsten einfach noch einmal nachfragen.

Gruß
Stefan</description>
		<content:encoded><![CDATA[<p>Hallo Marc,</p>
<p>völlig egal ist es nicht. Wie am obigen Beispiel gesehen werden kann, würde der Compiler aus dem hier:</p>
<pre><code>String str = "Simpler";
str += " String";</code></pre>
<p>das hier machen</p>
<pre><code>String s = "Simpler";
s = (new StringBuilder()).append(s).append(" String").toString();</code></pre>
<p>Noch performanter wäre es natürlich, wenn man von Anfang an das hier schreiben würde</p>
<pre><code>StringBuilder s = new StringBuilder("Simpler");
s.append(" String");</code></pre>
<p>Aber bei so etwas würde ich die Lesbarkeit (die bei der Verwendung von <code>String</code> deutlich höher sein sollte) über den minimalen Performancevorteil stellen.</p>
<p>Um die zweite Frage zu beantworte, werfen wir am Besten einen Blick in den Java Sourcecode. Was passiert, wenn ein weiterer <code>String</code> an den <code>StringBuilder</code> via <code>append</code> angehängt wird? Die Lösung befindet sich im Sourcecode der Klasse <code>AbstractStringBuilder</code> von welcher der <code>StringBuilder</code> abgeleitet ist.</p>
<pre><code>public AbstractStringBuilder append(String str) {
  if (str == null) str = "null";
  int len = str.length();
  if (len == 0) return this;
  int newCount = count + len;
  if (newCount > value.length)
    expandCapacity(newCount);
  str.getChars(0, len, value, count);
  count = newCount;
  return this;
}</code></pre>
<p>Für die Frage ist nur die Zeile </p>
<pre><code>if (newCount > value.length)
  expandCapacity(newCount);</code></pre>
<p>relevant. Was paassiert, wenn die neue Größe des <code>StringBuilders</code> die Alte übersteigt?</p>
<pre><code>void expandCapacity(int minimumCapacity) {
  int newCapacity = (value.length + 1) * 2;
  if (newCapacity < 0) {
    newCapacity = Integer.MAX_VALUE;
  } else if (minimumCapacity > newCapacity) {
    newCapacity = minimumCapacity;
  }
  value = Arrays.copyOf(value, newCapacity);
}</code></pre>
<p>Die Kapazität wird um das Doppelte erhöht. Wird der Wertebereich des <code>Integers</code> überschritten, ist die neue Kapazität gleich der maximalen Größe eines <code>Integers</code>. Außerdem wird noch überprüft, ob die Verdoppelung der Kapazität für die neue Größe ausreicht. Ist dies nicht der Fall, wird die aktuelle Größe gleich der neuen Größe gesetzt. Abschließend wird das alte Array, welches den Inhalt des <code>StringBuilders</code> beinhaltet, in ein neues, an die neue Größe angepasstes, Array kopiert.</p>
<p>Der "+16"-Mythos resultiert daraus, dass beim Anlegen eines neuen <code>StringBuilders</code> automatisch die Kapazität auf "Länge des Initial-<code>Strings</code>" + 16 gesetzt wird.</p>
<p>Dennoch ist es optimal, die ungefähre Kapazität des <code>StringBuilders</code> im Voraus abzuschätzen - sofern möglich.</p>
<p>Ich hoffe ich konnte helfen. Ansonsten einfach noch einmal nachfragen.</p>
<p>Gruß<br />
Stefan</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Marc</title>
		<link>http://www.java-blog-buch.de/0308-stringbuffer-und-stringbuilder/comment-page-1/#comment-4369</link>
		<dc:creator>Marc</dc:creator>
		<pubDate>Thu, 18 Feb 2010 15:01:03 +0000</pubDate>
		<guid isPermaLink="false">http://www.java-blog-buch.de/?p=1660#comment-4369</guid>
		<description>Hallo,

ich hätte da mal eine kleine Frage. Also d.h. außerhalb einer Schleife ist ein StringBuilder egal wieviel Strings ich aneinanderreihe total überflüßig(außer ich benötige die Methoden)?

Ist es nicht so wenn ich den default StringBuilder () benutze er nach 16 zeichen einen neuen String erzeugt und diesen dann einfügen muss. Darum sollte doch vorher abgeschätzt werden wie groß der Builder werden kann , sonst ist der Vorteil geringer?z.B. new StringBuilder(255);

Ich freu mich auf Ihre Antwort :)!!!

Gruß Marc</description>
		<content:encoded><![CDATA[<p>Hallo,</p>
<p>ich hätte da mal eine kleine Frage. Also d.h. außerhalb einer Schleife ist ein StringBuilder egal wieviel Strings ich aneinanderreihe total überflüßig(außer ich benötige die Methoden)?</p>
<p>Ist es nicht so wenn ich den default StringBuilder () benutze er nach 16 zeichen einen neuen String erzeugt und diesen dann einfügen muss. Darum sollte doch vorher abgeschätzt werden wie groß der Builder werden kann , sonst ist der Vorteil geringer?z.B. new StringBuilder(255);</p>
<p>Ich freu mich auf Ihre Antwort <img src='http://www.java-blog-buch.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> !!!</p>
<p>Gruß Marc</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Stefan Kiesel</title>
		<link>http://www.java-blog-buch.de/0308-stringbuffer-und-stringbuilder/comment-page-1/#comment-2794</link>
		<dc:creator>Stefan Kiesel</dc:creator>
		<pubDate>Wed, 20 May 2009 10:19:45 +0000</pubDate>
		<guid isPermaLink="false">http://www.java-blog-buch.de/?p=1660#comment-2794</guid>
		<description>Hallo Michael,

vielen Dank für die Anmerkung. Ich werde das Kapitel sofort ergänzen.

Gruß
Stefan</description>
		<content:encoded><![CDATA[<p>Hallo Michael,</p>
<p>vielen Dank für die Anmerkung. Ich werde das Kapitel sofort ergänzen.</p>
<p>Gruß<br />
Stefan</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Michael</title>
		<link>http://www.java-blog-buch.de/0308-stringbuffer-und-stringbuilder/comment-page-1/#comment-2793</link>
		<dc:creator>Michael</dc:creator>
		<pubDate>Wed, 20 May 2009 09:07:29 +0000</pubDate>
		<guid isPermaLink="false">http://www.java-blog-buch.de/?p=1660#comment-2793</guid>
		<description>Hallo,

ein kleiner Verbesserungsvorschlag, ich finde man könnte bei den Vergleichen noch erwähnen, dass wenn man 2 unterschiedliche Instanzen von StringBuilder/StringBuffer vergleicht auch false rauskommt !!obowhl!! gleichen Inhaltes.
&lt;pre&gt;&lt;code&gt;
        StringBuilder builder = new StringBuilder(&quot;123&quot;);
        StringBuilder builder2 = new StringBuilder(&quot;123&quot;);
        
        if(builder.equals(builder2)) // false
&lt;/code&gt;&lt;/pre&gt;</description>
		<content:encoded><![CDATA[<p>Hallo,</p>
<p>ein kleiner Verbesserungsvorschlag, ich finde man könnte bei den Vergleichen noch erwähnen, dass wenn man 2 unterschiedliche Instanzen von StringBuilder/StringBuffer vergleicht auch false rauskommt !!obowhl!! gleichen Inhaltes.</p>
<pre><code>
        StringBuilder builder = new StringBuilder("123");
        StringBuilder builder2 = new StringBuilder("123");

        if(builder.equals(builder2)) // false
</code></pre>
]]></content:encoded>
	</item>
</channel>
</rss>
