{"id":4232,"date":"2018-09-11T19:31:36","date_gmt":"2018-09-11T17:31:36","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=4232"},"modified":"2018-09-11T19:31:36","modified_gmt":"2018-09-11T17:31:36","slug":"stringbuilder-equals-string-comparable-stringbuffer","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2018\/09\/stringbuilder-equals-string-comparable-stringbuffer\/","title":{"rendered":"Vergleichen von StringBuilder-Exemplaren und String mit StringBuilder"},"content":{"rendered":"<p>Zum Vergleichen von Strings bietet sich die bekannte equals(\u2026)-Methode an. Diese ist aber bei StringBuilder nicht wie erwartet implementiert. Dazu gesellen sich andere Methoden, die zum Beispiel unabh\u00e4ngig von der Gro\u00df-\/Kleinschreibung vergleichen.<\/p>\n<h4>equals(\u2026) bei der String-Klasse<\/h4>\n<p>Die Klasse String implementiert die equals(Object)-Methode, sodass ein String mit einem anderen String verglichen werden kann. Allerdings vergleich equals(Object) von String nur String\/String-Paare. Die Methode beginnt erst dann den Vergleich, wenn das Argument auch vom Typ String ist. Das bedeutet, dass der Compiler alle \u00dcbergaben auch vom Typ StringBuilder bei equals(Object) zul\u00e4sst, doch zur Laufzeit ist das Ergebnis immer false, da eben ein StringBuilder nicht vom Typ String ist. Ob die Zeichenfolgen dabei gleich sind, spielt keine Rolle.<\/p>\n<h4>contentEquals(\u2026) beim String<\/h4>\n<p>Eine allgemeine Methode zum Vergleichen eines Strings mit entweder einem anderen String oder mit StringBuilder ist contentEquals(CharSequence). Die Methode liefert die R\u00fcckgabe true, wenn der String und die CharSequence (String, StringBuilder und StringBuffer sind Klassen vom Typ CharSequence) den gleichen Zeicheninhalt haben. Die interne L\u00e4nge des Puffers spielt keine Rolle. Ist das Argument null, wird eine NullPointerException ausgel\u00f6st.<\/p>\n<p>Beispiel:\u00a0Vergleiche einen String mit einem StringBuilder:<\/p>\n<p>String\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s\u00a0 = &#8222;Elektrisch-Zahnb\u00fcrster&#8220;;<br \/>\nStringBuilder sb = new StringBuilder( &#8222;Elektrisch-Zahnb\u00fcrster&#8220; );<br \/>\nSystem.out.println( s.equals(sb) );\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\/\/ false<br \/>\nSystem.out.println( s.equals(sb.toString()) );\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ true<br \/>\nSystem.out.println( s.contentEquals(sb) );\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ true<\/p>\n<h4>Kein eigenes equals(\u2026) bei StringBuilder<\/h4>\n<p>Wollen wir zwei StringBuilder-Objekte miteinander vergleichen, so geht das <em>nicht<\/em> mit der equals(\u2026)-Methode. Es gibt zwar die \u00fcbliche von Object geerbte Methode, doch das hei\u00dft, nur Objektreferenzen werden verglichen. Anders gesagt: StringBuilder \u00fcberschreibt die equals(\u2026)-Methode nicht. Wenn also zwei verschiedene StringBuilder-Objekte mit gleichem Inhalt mit equals(\u2026) verglichen werden, kommt trotzdem immer false heraus.<\/p>\n<p>Beispiel:\u00a0Um den inhaltlichen Vergleich von zwei StringBuilder-Objekten zu realisieren, k\u00f6nnen wir sie erst mit toString() in Strings umwandeln und dann mit String-Methoden vergleichen:<\/p>\n<p>StringBuilder sb1 = new StringBuilder( &#8222;The Ocean Cleanup&#8220; );<\/p>\n<p>StringBuilder sb2 = new StringBuilder( &#8222;The Ocean Cleanup&#8220; );<\/p>\n<p>System.out.println( <strong>sb1.equals( sb2 )<\/strong> );\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ false<br \/>\nSystem.out.println( <strong>sb1.toString().equals( sb2.toString() )<\/strong> );\u00a0 \/\/ true<br \/>\nSystem.out.println( <strong>sb1.toString().contentEquals( sb2 )<\/strong> );\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ true<\/p>\n<h4>StringBuilder ist Comparable<\/h4>\n<p>Seit Java 11 bietet StringBuilder eine Methode int compareTo\u200b(StringBuilder another) sodass lexikografische Vergleiche m\u00f6glich sind. (StringBuilder implementiert die Schnittstelle Comparable&lt;StringBuilder&gt;.) Somit realisieren String und StringBuilder beide eine Ordnung, siehe \u201eLexikografische Vergleiche mit Gr\u00f6\u00dfer-kleiner-Relation\u201c.<\/p>\n<p>Eine Begleiterscheinung ist die Tatsache, dass bei gleichen Zeichenfolgen die R\u00fcckgabe von compareTo(\u2026) gleich 0 ist. Das ist deutlich besser als erst den StringBuilder in einen String zu konvertieren.<\/p>\n<p>Beispiel:<\/p>\n<p>StringBuilder sb1 = new StringBuilder( &#8222;The Ocean Cleanup&#8220; );<\/p>\n<p>StringBuilder sb2 = new StringBuilder( &#8222;The Ocean Cleanup&#8220; );<\/p>\n<p>System.out.println( <strong>sb1.compareTo( sb2 ) == 0<\/strong> );\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ true<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zum Vergleichen von Strings bietet sich die bekannte equals(\u2026)-Methode an. Diese ist aber bei StringBuilder nicht wie erwartet implementiert. Dazu gesellen sich andere Methoden, die zum Beispiel unabh\u00e4ngig von der Gro\u00df-\/Kleinschreibung vergleichen. equals(\u2026) bei der String-Klasse Die Klasse String implementiert die equals(Object)-Methode, sodass ein String mit einem anderen String verglichen werden kann. Allerdings vergleich equals(Object) [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11,108],"tags":[],"class_list":["post-4232","post","type-post","status-publish","format-standard","hentry","category-insel","category-java-11"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4232","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=4232"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4232\/revisions"}],"predecessor-version":[{"id":4233,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4232\/revisions\/4233"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=4232"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=4232"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=4232"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}