Dieser Artikel untersucht hauptsächlich das Problem des Erstellens von Objekten in der Java -Zeichenfolge wie folgt.
Zunächst müssen wir zwei Konzepte verstehen: Verweisen von Variablen und Objekten. Objekte werden im Allgemeinen im Haufen durch neu erstellt, und String ist nur eine Referenzvariable.
Alle Saiten sind String -Objekte. Aufgrund der großen Verwendung von Stringkonstanten werden in der Zusammenstellungsphase alle Saitenkonstanten in den konstanten Pool der Saiten platziert, um Zeit in Java zu sparen. Ein Vorteil des String Constant Pools besteht darin, dass die gleiche Saite zusammengeführt und ein Platz besetzt werden kann.
Obwohl die Adresse einer Variablen in Java nicht direkt erhalten werden kann, können Sie == verwenden, um festzustellen, ob die beiden Referenzvariablen auf eine Adresse d wie auf ein Objekt hinweisen.
| Stapelspeicher | Haufen Speicher |
|---|---|
| Grundtyp, Objektreferenz (Heap -Speicheradresse) | Objekte und Arrays, die von neu erstellt wurden |
| Schnelle Zugangsgeschwindigkeit | Langsamerer Speicher als Stack |
| Die Datengröße muss während des Deklarationszyklus bestimmt werden | Der zugewiesene Speicher wird vom automatischen Müllsammler der Java Virtual Machine verwaltet. Dynamisch zugewiesene Speichergröße |
| In gemeinsamen Funktionen wird, wenn sich eine Zeichenfolge im Stapel befindet, direkt verwiesen. Wenn nicht, öffnen Sie einen neuen Raum, um den Wert zu speichern | Jeder neue generiert ein neues Objekt im Heap -Speicher. Es gibt keine Wiederverwendung |
Paket com.demo.test; import java.lang.reflect.field; public class StringDemo {public static void main (String [] args) {// Suchen Sie zuerst, ob dieses String -Objekt im Speicher existiert. Wenn es existiert, weisen Sie auf dieses String -Objekt hin. String str1 = "ABC"; String str2 = "ABC"; /* public String toString () {return this; } */ String str3 = "abc" .ToString (); // Egal, ob dieses String -Objekt bereits im Speicher vorhanden ist, wird ein neues Objekt erstellt. String str4 = new String ("ABC"); String str5 = neuer String ("ABC"); String str6 = str5; String str7 = "a" + "b" + "c"; String str8 = "a" + "b" + neuer String ("C"); // String ist ein unveränderliches String-Objekt, StringBuilder und StringBuffer sind variable String-Objekte (die Länge des Zeichenarrays in der Inneren ist Variable), StringBuffer ist Thread-Safe, StringBuilder ist nicht mit Thread-safe String str9 = new StringBuder. String str10 = new StringBuffer (). Append ("a"). Append ("b"). Append ("c"). ToString (); System.out.println ("----------> =="); System.out.println ("---> 1"); System.out.println (str1 == str2); // True System.out.println ("---> 3"); System.out.println (str3 == str1); // True System.out.println ("-> 4"); System.out.println (str4 == str1); // false System.out.println (str4 == str3); // False System.out.println (str4 == STR5); // false system.out.println (STR4 == str6); // false system.outln ("-> 7"); System.out.println (str7 == str1); // True System.out.println (str7 == str3); // True System.out.println (str7 == str4); // false system.out.println ("---> 8"); System.out.println (str8 == str1); // false System.out.println (str8 == str3); // False System.out.println (STR8 == STR4); // False System.out.println (STR8 == STR7); // false system.println (“- (Str8 ==); System.out.println (str9 == str1); // false System.out.println (str9 == str3); // false System.out.println (STR9 == STR4); // false System.out.Out.println (STR9 == STR7); // false system.println (“-El; System.out.println (str10 == str1); // false System.out.println (str10 == str3); // False System.out.println (str10 == STR4); // false system.out.println (STR10 == STR7); // false system.outln (str10 == str1. str1. st10 == Str8); System.out.println (str10 == str9); // false System.out.println ("--------> gleich"); System.out.println (str1.equals (str4)); // true system.out.println (str1.equals (str7)); // true system.out.println (str1.equals (str8)); // True System.out.println ("--------> Hashcode"); /*HashCode-Berechnungsformel: s [0]*31^(n-1) + s [1]*31^(n-2) + ... + s [n-1] Daher ist Hashcode gleich, und es ist jedes Mal, wenn es*/system.out.println (Str1.hashcode (); // 96354 system.Println (st1.hashcode (); // 96354 system.println (Str2.hashcode ()); System.out.println (str3.hashcode ()); System.out.println (str4.hashcode ()); System.out.println (str5.hashcode ()); System.out.println (str6.hashcode ()); System.out.println (str7.hashcode ()); System.out.println ("--------> Normaler Änderungswert"); // String ist eine unveränderliche Klasse. String zeigt nur auf eine Referenz im Heap -Speicher. Es speichert die Adresse des Objekts im Haufen, nicht im Objekt selbst. Das Zuweisen eines Wertes einer Zeichenfolge besteht nur darin, sein Referenzobjekt anstelle des Objekts selbst Str6 = "123" zu ändern. System.out.println (str5); // abc system.out.println (str6); // 123 System.out.println ("---------> Reflect Change Value"); /* Wenn Sie den Wert der Zeichenfolge ändern müssen, ist er nicht unmöglich. Nur Reflexion kann verwendet werden. Public Final Class String implementiert java.io.serializable, vergleichbar <string>, charsequence {// Der Wert wird für den Zeichenspeicher verwendet. privater endgültiger Charwert []; …} */ Str6 = str5; try {field field = string.class.getDeclaredfield ("value"); // field field = str6.getClass (). getDeclaredField ("Wert"); if (! field.isAccessible ()) {field.setAccessible (wahr); } char [] value = (char []) field.get (str6); Wert [0] = '0'; System.out.println (str5); // 0bc system.out.println (str6); // 0bc} catch (nosuchfieldException | SecurityException | illegalArgumentException | illegalaccessException e) {e.printstacktrace (); } System.out.println ("-------> obj.toString ()"); Objekt obj = neues Objekt (); /* public String toString () {return getClass (). getName () + "@" + Integer.tohexString (HashCode ()); } */System.out.println (obj.toString ()); // java.lang.object@15db9742 String [] arr1 = {"0"}; String [] arr2 = {"0"}; System.out.println (arr1.equals (arr2)); // false}}Zusammenfassen
Im obigen Bereich geht es um die Analyse von Java -String -Erstellungsobjektinstanzen, und ich hoffe, dass es für alle hilfreich sein wird. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!