diff options
| author | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
|---|---|---|
| committer | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
| commit | 33613a85afc4b1481367fbe92a17ee59c240250b (patch) | |
| tree | 670b842326116b376b505ec2263878912fca97e2 /Master/Reference Architectures and Patterns/hjp5/html/k100073.html | |
| download | Studium-33613a85afc4b1481367fbe92a17ee59c240250b.tar.gz Studium-33613a85afc4b1481367fbe92a17ee59c240250b.tar.bz2 | |
Diffstat (limited to 'Master/Reference Architectures and Patterns/hjp5/html/k100073.html')
| -rw-r--r-- | Master/Reference Architectures and Patterns/hjp5/html/k100073.html | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/Master/Reference Architectures and Patterns/hjp5/html/k100073.html b/Master/Reference Architectures and Patterns/hjp5/html/k100073.html new file mode 100644 index 0000000..f8400fb --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/html/k100073.html @@ -0,0 +1,260 @@ +<html>
+<head>
+<title>
+Handbuch der Java-Programmierung, 5. Auflage
+</title>
+</head>
+<body>
+<a name="startofbody"></a>
+<script language="JavaScript" src="hjp4lib.js">
+</script>
+<script language="JavaScript">
+installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100070.html;106,k100072.html;107,k100074.html;108,k100078.html");
+</script>
+<table border=0 cellpadding=0 cellspacing=1 width="100%">
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
+<td align="right">Handbuch der Java-Programmierung, 5. Auflage
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100070.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100072.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100074.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100078.html"> >> </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
+<td align="right">Kapitel 11 - Strings
+</table>
+<hr>
+
+
+<!-- Section -->
+<a name="sectlevel2id011003"></a>
+<h2>11.3 Weitere Eigenschaften </h2>
+<hr>
+<ul>
+<li><a href="k100073.html#sectlevel2id011003">11.3 Weitere Eigenschaften</a>
+<ul>
+<li><a href="k100073.html#sectlevel3id011003001">11.3.1 Die Klasse String ist final</a>
+<li><a href="k100073.html#stringfuercompiler">11.3.2 Was ist ein String für den Compiler?</a>
+<ul>
+<li><a href="k100073.html#sectlevel4id011003002001">String-Literale</a>
+<li><a href="k100073.html#sectlevel4id011003002002">String-Verkettung und -Zuweisung</a>
+</ul>
+<li><a href="k100073.html#sectlevel3id011003003">11.3.3 String-Objekte sind nicht dynamisch</a>
+</ul>
+</ul>
+<hr>
+
+
+<!-- Section -->
+<a name="sectlevel3id011003001"></a>
+<h3>11.3.1 Die Klasse String ist final </h3>
+
+<p>
+Beim Studium der Klassenbibliotheken erkennt man, dass die Klasse
+<a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>
+mit dem Attribut <a href="index_f.html#ixb100401"><font color=#000080><tt>final</tt></font></a>
+belegt ist. Einer der Gründe für diese Maßnahme ist
+die dadurch gesteigerte Effizienz beim Aufruf der Methoden von <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>-Objekten.
+Anstelle der dynamischen Methodensuche, die normalerweise erforderlich
+ist, kann der Compiler <a href="index_f.html#ixb100401"><font color=#000080><tt>final</tt></font></a>-Methoden
+statisch kompilieren und dadurch schneller aufrufen. Daneben spielten
+aber auch Sicherheitsüberlegungen und Aspekte des Multithreadings
+eine Rolle.
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100%>
+<tr>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top width=1000>
+
+<p>
+Leider hat dies den großen Nachteil, dass aus der <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>-Klasse
+keine neuen Klassen abgeleitet werden können. Es gibt also keine
+Möglichkeit, die vorhandenen Methoden auf <i>natürliche</i>
+Art und Weise zu ergänzen oder zu modifizieren. Soll beispielsweise
+eine neue Methode <a href="index_r.html#ixb100538"><font color=#000080><tt>replace</tt></font></a>
+geschrieben werden, die in der Lage ist, Strings (und nicht nur einzelne
+Zeichen) gegeneinander auszutauschen, so bleibt nur der Umweg über
+eine Methode einer anderen Klasse, die den zu modifizierenden String
+als Parameter übergeben bekommt. Alternativ könnte man natürlich
+auch die komplette <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>-Klasse
+neu schreiben. Leider sind beide Varianten unschön und konterkarieren
+die Vorteile der objektorientierten Implementierung von Zeichenketten
+in Java.</td>
+<td><img src="trp1_1.gif" width=2></td>
+<td valign=top>
+<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
+<tr>
+<td><font color="#FFFFFF"> Hinweis </font></td>
+</tr>
+</table>
+</td>
+<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
+</tr>
+</table>
+
+
+<!-- Section -->
+<a name="stringfuercompiler"></a>
+<h3>11.3.2 Was ist ein String für den Compiler? </h3>
+
+<p>
+In Java gibt es an vielen Stellen Verbindungen zwischen dem Compiler
+und der Laufzeitbibliothek, und zwar insofern, als der Compiler Kenntnis
+über interne Eigenschaften bestimmter Klassen hat und die Fähigkeit
+besitzt, Instanzen dieser Klassen zu erzeugen und zu manipulieren.
+So ist er beispielsweise in der Lage, Code zu generieren, um <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>-Objekte
+zu erzeugen, einander zuzuweisen oder mit Hilfe des +-Operators zu
+verketten.
+
+<!-- Section -->
+
+<a name="sectlevel4id011003002001"></a>
+<h4><a name="ixa100687">String-Literale</a></h4>
+
+<p>
+Jedes <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>-Literal
+ist eine Referenz auf ein Objekt der Klasse <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>.
+Wenn der Compiler beim Übersetzen des Quelltextes ein <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>-Literal
+findet, erzeugt er ein neues <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>-Objekt
+und verwendet es anstelle des Literals.
+
+<!-- Section -->
+
+<a name="sectlevel4id011003002002"></a>
+<h4>String-Verkettung und -Zuweisung </h4>
+
+<p>
+In Java ist der Operator + auch auf Strings definiert. Auf zwei <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>-Objekte
+angewendet, liefert er die Verkettung beider Objekte, d.h. ihre Hintereinanderschreibung.
+Eine Möglichkeit, die <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>-Verkettung
+zu übersetzen, könnte darin bestehen, ein temporäres
+<a href="index_s.html#ixb100545"><font color=#000080><tt>StringBuilder</tt></font></a>-Objekt
+zu konstruieren und die Operanden mit Hilfe der <a href="index_a.html#ixb100546"><font color=#000080><tt>append</tt></font></a>-Methode
+anzuhängen. Das resultierende Objekt könnte dann mit der
+<a href="index_t.html#ixb100327"><font color=#000080><tt>toString</tt></font></a>-Methode
+effizient in einen <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>
+konvertiert werden. Die Klasse <a href="index_s.html#ixb100545"><font color=#000080><tt>StringBuilder</tt></font></a>
+dient dazu, <i>veränderliche</i> Strings zu implementieren. Sie
+wird im nächsten Abschnitt vorgestellt.
+
+<p>
+Diese Vorgehensweise soll an dem folgenden Beispiel erläutert
+werden. Das Programm gibt zweimal hintereinander »Hallo, Welt«
+aus. Beim ersten Mal wird der +-Operator verwendet, beim zweiten Mal
+die Variante mit dem temporären <a href="index_s.html#ixb100545"><font color=#000080><tt>StringBuilder</tt></font></a>-Objekt:
+<a name="listingid011004"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#00AA00">/* Listing1104.java */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing1104
+<font color="#555555">004 </font>{
+<font color="#555555">005 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">006 </font> {
+<font color="#555555">007 </font> String a, b, c;
+<font color="#555555">008 </font>
+<font color="#555555">009 </font> <font color="#00AA00">//Konventionelle Verkettung</font>
+<font color="#555555">010 </font> a = <font color="#0000FF">"Hallo"</font>;
+<font color="#555555">011 </font> b = <font color="#0000FF">"Welt"</font>;
+<font color="#555555">012 </font> c = a + <font color="#0000FF">", "</font> + b;
+<font color="#555555">013 </font> System.out.println(c);
+<font color="#555555">014 </font>
+<font color="#555555">015 </font> <font color="#00AA00">//So könnte es der Compiler übersetzen</font>
+<font color="#555555">016 </font> a = <font color="#0000FF">"Hallo"</font>;
+<font color="#555555">017 </font> b = <font color="#0000FF">"Welt"</font>;
+<font color="#555555">018 </font> c =(<font color="#0000AA">new</font> StringBuilder(a)).append(<font color="#0000FF">", "</font>).append(b).toString();
+<font color="#555555">019 </font> System.out.println(c);
+<font color="#555555">020 </font> }
+<font color="#555555">021 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Listing1104.java"><font color="#000055" size=-1>Listing1104.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 11.4: Implementierung der String-Verkettung</i></p>
+
+<p>
+Allerdings ist ein Java-Compiler nicht gezwungen, genau so vorzugehen.
+Die Sprachspezifikation gibt lediglich die Empfehlung, dass es aus
+Effizienzgründen sinnvoll sein kann, eine solche oder ähnliche
+Implementierung zu wählen.
+
+<!-- Section -->
+
+<a name="sectlevel3id011003003"></a>
+<h3>11.3.3 String-Objekte sind nicht dynamisch </h3>
+
+<p>
+Interessanterweise werden durch die Klasse <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>
+keine <i>dynamischen</i> Zeichenketten implementiert. Nach der Initialisierung
+eines <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>
+bleiben dessen Länge und Inhalt konstant. Wie ist dann aber die
+genaue Arbeitsweise von Funktionen wie <a name="ixa100688"><a href="index_s.html#ixb100524"><font color=#000080><tt>substring</tt></font></a></a>
+oder <a name="ixa100689"><a href="index_r.html#ixb100538"><font color=#000080><tt>replace</tt></font></a></a>
+zu erklären, und was genau passiert bei einer Anweisung wie der
+folgenden:
+<font color="#000077">
+<pre>
+String s = "hello, world";
+s = s.substring(0,5);
+</pre>
+</font>
+
+<p>
+Die Antwort darauf ist ganz einfach. Die <a href="index_s.html#ixb100524"><font color=#000080><tt>substring</tt></font></a>-Methode
+nimmt die Veränderungen nicht auf dem Original-String vor, sondern
+erzeugt eine Kopie, die mit dem gewünschten Inhalt gefüllt
+wird. Diese gibt sie dann an den Aufrufer zurück, der das Ergebnis
+erneut an <font color="#000077"><tt>s</tt></font> zuweist und damit
+die Originalinstanz für den Garbage Collector freigibt. Durch
+den Referenzcharakter von Objekten und das automatische Speichermanagement
+entsteht also der Eindruck, als wären <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>-Objekte
+veränderlich.
+
+<p>
+Als Entwickler braucht man sich hierüber normalerweise keine
+Gedanken zu machen. Dennoch ist es manchmal nützlich, Zeichenketten
+zur Verfügung zu haben, die sich dynamisch verändern können
+(beispielsweise benötigt sie der Compiler selbst zur Implementierung
+der String-Verkettung). In Java gibt es zu diesem Zweck die Klasse
+<a href="index_s.html#ixb100545"><font color=#000080><tt>StringBuilder</tt></font></a>.
+Sie arbeitet ähnlich wie <a href="index_s.html#ixb100117"><font color=#000080><tt>String</tt></font></a>,
+implementiert aber Zeichenketten, die ihre Länge zur Laufzeit
+ändern können. <a href="index_s.html#ixb100545"><font color=#000080><tt>StringBuilder</tt></font></a>
+besitzt nicht so viele Methoden zur Auswertung der Zeichenkette, sondern
+legt den Schwerpunkt auf Operationen zur Veränderung ihres Inhalts.
+Die wichtigsten Methoden sollen im folgenden vorgestellt werden.
+<hr>
+<table border=0 cellpadding=0 cellspacing=1 width="100%">
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
+<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
+Wesley, Version 5.0.1
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100070.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100072.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100074.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100078.html"> >> </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
+<td align="right">© 1998, 2007 Guido Krüger & Thomas
+Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
+</table>
+<a name="endofbody"></a>
+</body>
+</html>
|
